add power-on utilization reporting

there is now an extra field in the status bar that gives
the %'age of time that the clocks are running.
This commit is contained in:
bunnie 2021-06-02 01:08:31 +08:00
parent ee2e38be05
commit 25e6bced00
8 changed files with 479 additions and 56 deletions

View file

@ -3,7 +3,7 @@
<device schemaVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd" >
<vendor>litex</vendor>
<name>SOC</name>
<description><![CDATA[Litex SoC 2021-06-01 16:27:12]]></description>
<description><![CDATA[Litex SoC 2021-06-02 00:30:35]]></description>
<addressUnitBits>8</addressUnitBits>
<width>32</width>
@ -1162,7 +1162,7 @@ register to disable individual events.]]></description>
<register>
<name>GIT_MAJOR</name>
<description><![CDATA[Major git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``0``.]]></description>
<addressOffset>0x0008</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
@ -1178,9 +1178,9 @@ register to disable individual events.]]></description>
<register>
<name>GIT_MINOR</name>
<description><![CDATA[Minor git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``8``.]]></description>
<addressOffset>0x000c</addressOffset>
<resetValue>0x00</resetValue>
<resetValue>0x08</resetValue>
<size>32</size>
<fields>
<field>
@ -1194,9 +1194,9 @@ register to disable individual events.]]></description>
<register>
<name>GIT_REVISION</name>
<description><![CDATA[Revision git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``1``.]]></description>
<addressOffset>0x0010</addressOffset>
<resetValue>0x00</resetValue>
<resetValue>0x01</resetValue>
<size>32</size>
<fields>
<field>
@ -1210,10 +1210,10 @@ register to disable individual events.]]></description>
<register>
<name>GIT_GITREV</name>
<description><![CDATA[First 32-bits of the git revision. This documentation was built from git rev
``9e77f50e``, so this value is 2658661646, which should be enough to check out
``cf5b40e6``, so this value is 3478864102, which should be enough to check out
the exact git version used to build this firmware.]]></description>
<addressOffset>0x0014</addressOffset>
<resetValue>0x9e77f50e</resetValue>
<resetValue>0xcf5b40e6</resetValue>
<size>32</size>
<fields>
<field>
@ -2657,10 +2657,112 @@ sources (power, sha512, and engine25519)]]></description>
</field>
</fields>
</register>
<register>
<name>WAKEUP_SOURCE</name>
<addressOffset>0x0008</addressOffset>
<resetValue>0xff</resetValue>
<size>32</size>
<fields>
<field>
<name>kbd</name>
<msb>0</msb>
<bitRange>[0:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Use the keyboard as wakeup source]]></description>
</field>
<field>
<name>ticktimer</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Use the ticktimer as wakeup source]]></description>
</field>
<field>
<name>timer0</name>
<msb>2</msb>
<bitRange>[2:2]</bitRange>
<lsb>2</lsb>
<description><![CDATA[Use timer0 (os timer) as wakeup source]]></description>
</field>
<field>
<name>usb</name>
<msb>3</msb>
<bitRange>[3:3]</bitRange>
<lsb>3</lsb>
<description><![CDATA[Use USB k-transition as wakeup source]]></description>
</field>
<field>
<name>audio</name>
<msb>4</msb>
<bitRange>[4:4]</bitRange>
<lsb>4</lsb>
<description><![CDATA[Use audio FIFO empty as wakeup source]]></description>
</field>
<field>
<name>com</name>
<msb>5</msb>
<bitRange>[5:5]</bitRange>
<lsb>5</lsb>
<description><![CDATA[Use COM hold falling as wakeup source]]></description>
</field>
<field>
<name>rtc</name>
<msb>6</msb>
<bitRange>[6:6]</bitRange>
<lsb>6</lsb>
<description><![CDATA[Use RTC external interrupt as wakeup source]]></description>
</field>
<field>
<name>console</name>
<msb>7</msb>
<bitRange>[7:7]</bitRange>
<lsb>7</lsb>
<description><![CDATA[Use the console UART RX line dropping as wakeup source]]></description>
</field>
</fields>
</register>
<register>
<name>ACTIVITY_RATE</name>
<addressOffset>0x000c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>counts_awake</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[number of counts in the last sample interval that we were active]]></description>
</field>
</fields>
</register>
<register>
<name>SAMPLING_PERIOD</name>
<addressOffset>0x0010</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>sample_period</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Sampling period for counts awake, in 12MHz cycles]]></description>
</field>
<field>
<name>kill_sampler</name>
<msb>31</msb>
<bitRange>[31:31]</bitRange>
<lsb>31</lsb>
<description><![CDATA[When set, permanently disable reporting (in case you don't want the high-
resolutionn timing sidechannel)]]></description>
</field>
</fields>
</register>
<register>
<name>VIBE</name>
<description><![CDATA[Vibration motor configuration register]]></description>
<addressOffset>0x0008</addressOffset>
<addressOffset>0x0014</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2675,8 +2777,8 @@ sources (power, sha512, and engine25519)]]></description>
</register>
<register>
<name>EV_STATUS</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x000c</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0018</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2687,12 +2789,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Level of the ``usb_attach`` event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Level of the ``activity_update`` event]]></description>
</field>
</fields>
</register>
<register>
<name>EV_PENDING</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0010</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x001c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2703,12 +2812,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[USB attach event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[update available to activity register]]></description>
</field>
</fields>
</register>
<register>
<name>EV_ENABLE</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0014</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0020</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2719,12 +2835,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Write a ``1`` to enable the ``usb_attach`` Event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Write a ``1`` to enable the ``activity_update`` Event]]></description>
</field>
</fields>
</register>
</registers>
<addressBlock>
<offset>0</offset>
<size>0x18</size>
<size>0x24</size>
<usage>registers</usage>
</addressBlock>
<interrupt>
@ -3316,7 +3439,7 @@ inject too fast.]]></description>
<name>SEED1</name>
<description><![CDATA[Bits 32-63 of `SEED_SEED`. Seed used for the build]]></description>
<addressOffset>0x0000</addressOffset>
<resetValue>0x56f38707</resetValue>
<resetValue>0x742b5c26</resetValue>
<size>32</size>
<fields>
<field>
@ -3331,7 +3454,7 @@ inject too fast.]]></description>
<name>SEED0</name>
<description><![CDATA[Bits 0-31 of `SEED_SEED`.]]></description>
<addressOffset>0x0004</addressOffset>
<resetValue>0x400f5344</resetValue>
<resetValue>0x645c9ef4</resetValue>
<size>32</size>
<fields>
<field>

View file

@ -3,7 +3,7 @@
<device schemaVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd" >
<vendor>litex</vendor>
<name>SOC</name>
<description><![CDATA[Litex SoC 2021-06-01 16:48:00]]></description>
<description><![CDATA[Litex SoC 2021-06-02 00:30:35]]></description>
<addressUnitBits>8</addressUnitBits>
<width>32</width>
@ -1244,7 +1244,7 @@ beyond the tag indicated in `MAJOR`, `MINOR`, and `REVISION`.]]></description>
<register>
<name>GIT_DIRTY</name>
<addressOffset>0x001c</addressOffset>
<resetValue>0x00</resetValue>
<resetValue>0x01</resetValue>
<size>32</size>
<fields>
<field>
@ -2657,10 +2657,112 @@ sources (power, sha512, and engine25519)]]></description>
</field>
</fields>
</register>
<register>
<name>WAKEUP_SOURCE</name>
<addressOffset>0x0008</addressOffset>
<resetValue>0xff</resetValue>
<size>32</size>
<fields>
<field>
<name>kbd</name>
<msb>0</msb>
<bitRange>[0:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Use the keyboard as wakeup source]]></description>
</field>
<field>
<name>ticktimer</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Use the ticktimer as wakeup source]]></description>
</field>
<field>
<name>timer0</name>
<msb>2</msb>
<bitRange>[2:2]</bitRange>
<lsb>2</lsb>
<description><![CDATA[Use timer0 (os timer) as wakeup source]]></description>
</field>
<field>
<name>usb</name>
<msb>3</msb>
<bitRange>[3:3]</bitRange>
<lsb>3</lsb>
<description><![CDATA[Use USB k-transition as wakeup source]]></description>
</field>
<field>
<name>audio</name>
<msb>4</msb>
<bitRange>[4:4]</bitRange>
<lsb>4</lsb>
<description><![CDATA[Use audio FIFO empty as wakeup source]]></description>
</field>
<field>
<name>com</name>
<msb>5</msb>
<bitRange>[5:5]</bitRange>
<lsb>5</lsb>
<description><![CDATA[Use COM hold falling as wakeup source]]></description>
</field>
<field>
<name>rtc</name>
<msb>6</msb>
<bitRange>[6:6]</bitRange>
<lsb>6</lsb>
<description><![CDATA[Use RTC external interrupt as wakeup source]]></description>
</field>
<field>
<name>console</name>
<msb>7</msb>
<bitRange>[7:7]</bitRange>
<lsb>7</lsb>
<description><![CDATA[Use the console UART RX line dropping as wakeup source]]></description>
</field>
</fields>
</register>
<register>
<name>ACTIVITY_RATE</name>
<addressOffset>0x000c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>counts_awake</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[number of counts in the last sample interval that we were active]]></description>
</field>
</fields>
</register>
<register>
<name>SAMPLING_PERIOD</name>
<addressOffset>0x0010</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>sample_period</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Sampling period for counts awake, in 12MHz cycles]]></description>
</field>
<field>
<name>kill_sampler</name>
<msb>31</msb>
<bitRange>[31:31]</bitRange>
<lsb>31</lsb>
<description><![CDATA[When set, permanently disable reporting (in case you don't want the high-
resolutionn timing sidechannel)]]></description>
</field>
</fields>
</register>
<register>
<name>VIBE</name>
<description><![CDATA[Vibration motor configuration register]]></description>
<addressOffset>0x0008</addressOffset>
<addressOffset>0x0014</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2675,8 +2777,8 @@ sources (power, sha512, and engine25519)]]></description>
</register>
<register>
<name>EV_STATUS</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x000c</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0018</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2687,12 +2789,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Level of the ``usb_attach`` event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Level of the ``activity_update`` event]]></description>
</field>
</fields>
</register>
<register>
<name>EV_PENDING</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0010</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x001c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2703,12 +2812,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[USB attach event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[update available to activity register]]></description>
</field>
</fields>
</register>
<register>
<name>EV_ENABLE</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0014</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0020</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2719,12 +2835,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Write a ``1`` to enable the ``usb_attach`` Event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Write a ``1`` to enable the ``activity_update`` Event]]></description>
</field>
</fields>
</register>
</registers>
<addressBlock>
<offset>0</offset>
<size>0x18</size>
<size>0x24</size>
<usage>registers</usage>
</addressBlock>
<interrupt>
@ -3316,7 +3439,7 @@ inject too fast.]]></description>
<name>SEED1</name>
<description><![CDATA[Bits 32-63 of `SEED_SEED`. Seed used for the build]]></description>
<addressOffset>0x0000</addressOffset>
<resetValue>0x178b8559</resetValue>
<resetValue>0x742b5c26</resetValue>
<size>32</size>
<fields>
<field>
@ -3331,7 +3454,7 @@ inject too fast.]]></description>
<name>SEED0</name>
<description><![CDATA[Bits 0-31 of `SEED_SEED`.]]></description>
<addressOffset>0x0004</addressOffset>
<resetValue>0x1c2378e2</resetValue>
<resetValue>0x645c9ef4</resetValue>
<size>32</size>
<fields>
<field>

Binary file not shown.

View file

@ -225,8 +225,11 @@ pub fn status_thread(canvas_gid_0: usize, canvas_gid_1: usize, canvas_gid_2: usi
};
write!(&mut uptime_tv, "{:02}:{:02} {} {}/{}", dt.hours, dt.minutes, day, dt.months, dt.days).unwrap();
} else {
write!(&mut uptime_tv, "Up {:02}:{:02}:{:02}",
(elapsed_time / 3_600_000), (elapsed_time / 60_000) % 60, now_seconds).expect("|status: can't write string");
let (latest_activity, period) = llio.activity_instantaneous().expect("couldn't get CPU activity");
write!(&mut uptime_tv, "Up {}:{:02}:{:02} {:.0}%",
(elapsed_time / 3_600_000), (elapsed_time / 60_000) % 60, now_seconds,
((latest_activity as f32) / (period as f32)) * 100.0
).expect("|status: can't write string");
}
log::trace!("|status: requesting draw of '{}'", uptime_tv);
gam.post_textview(&mut uptime_tv).expect("|status: can't draw uptime");

View file

@ -188,6 +188,7 @@ pub(crate) enum Opcode {
PowerCryptoStatus,
WfiOverride,
DebugPowerdown,
GetActivity,
DebugWakeup,
EcSnoopAllow, //(bool),
EcReset,
@ -215,6 +216,7 @@ pub(crate) enum Opcode {
EventComEnable, //(bool),
EventRtcEnable, //(bool),
EventUsbAttachEnable, //(bool),
EventActivityHappened,
/// internal from handler to main loop
EventComHappened,

View file

@ -511,6 +511,18 @@ impl Llio {
Message::new_scalar(Opcode::DebugWakeup.to_usize().unwrap(), arg, 0, 0, 0)
).map(|_| ())
}
pub fn activity_instantaneous(&self) -> Result<(u32, u32), xous::Error> {
let response = send_message(self.conn,
Message::new_blocking_scalar(Opcode::GetActivity.to_usize().unwrap(), 0, 0, 0, 0))?;
if let xous::Result::Scalar2(active, total) = response {
Ok(
(active as u32, total as u32)
)
} else {
log::error!("LLIO: unexpected return value: {:#?}", response);
Err(xous::Error::InternalError)
}
}
}

View file

@ -42,6 +42,7 @@ mod implementation {
power_susres: RegManager::<{utra::power::POWER_NUMREGS}>,
xadc_csr: utralib::CSR<u32>, // be careful with this as XADC is shared with TRNG
ticktimer: ticktimer_server::Ticktimer,
activity_period: u32, // 12mhz clock cycles over which to sample activity
destruct_armed: bool,
}
@ -81,12 +82,23 @@ mod implementation {
}
fn handle_power_irq(_irq_no: usize, arg: *mut usize) {
let xl = unsafe { &mut *(arg as *mut Llio) };
if let Some(conn) = xl.handler_conn {
xous::try_send_message(conn,
xous::Message::new_scalar(Opcode::EventUsbHappened.to_usize().unwrap(),
0, 0, 0, 0)).map(|_|()).unwrap();
} else {
log::error!("|handle_event_irq: USB interrupt, but no connection for notification!")
if xl.power_csr.rf(utra::power::EV_PENDING_USB_ATTACH) != 0 {
if let Some(conn) = xl.handler_conn {
xous::try_send_message(conn,
xous::Message::new_scalar(Opcode::EventUsbHappened.to_usize().unwrap(),
0, 0, 0, 0)).map(|_|()).unwrap();
} else {
log::error!("|handle_event_irq: USB interrupt, but no connection for notification!")
}
} else if xl.power_csr.rf(utra::power::EV_PENDING_ACTIVITY_UPDATE) != 0 {
if let Some(conn) = xl.handler_conn {
let activity = xl.power_csr.rf(utra::power::ACTIVITY_RATE_COUNTS_AWAKE);
xous::try_send_message(conn,
xous::Message::new_scalar(Opcode::EventActivityHappened.to_usize().unwrap(),
activity as usize, 0, 0, 0)).map(|_|()).unwrap();
} else {
log::error!("|handle_event_irq: activity interrupt, but no connection for notification!")
}
}
xl.power_csr
.wo(utra::power::EV_PENDING, xl.power_csr.r(utra::power::EV_PENDING));
@ -167,6 +179,7 @@ mod implementation {
power_susres: RegManager::new(power_csr.as_mut_ptr() as *mut u32),
xadc_csr: CSR::new(xadc_csr.as_mut_ptr() as *mut u32),
ticktimer,
activity_period: 24_000_000, // 2 second interval initially
destruct_armed: false,
};
@ -205,6 +218,12 @@ mod implementation {
xl.power_csr.rmwf(utra::power::POWER_CRYPTO_ON, 0); // save power on crypto block
xl.power_susres.push(RegOrField::Reg(utra::power::POWER), None);
xl.power_susres.push(RegOrField::Reg(utra::power::VIBE), None);
xl.power_csr.wfo(utra::power::SAMPLING_PERIOD_SAMPLE_PERIOD, xl.activity_period); // 2 second sampling intervals
xl.power_susres.push(RegOrField::Reg(utra::power::SAMPLING_PERIOD), None);
xl.power_csr.wfo(utra::power::EV_PENDING_ACTIVITY_UPDATE, 1);
xl.power_csr.rmwf(utra::power::EV_ENABLE_ACTIVITY_UPDATE, 1);
xl.power_susres.push_fixed_value(RegOrField::Reg(utra::power::EV_PENDING), 0xFFFF_FFFF);
xl.power_susres.push(RegOrField::Reg(utra::power::EV_ENABLE), None);
@ -225,6 +244,14 @@ mod implementation {
self.event_susres.resume();
self.gpio_susres.resume();
}
#[allow(dead_code)]
pub fn activity_set_period(&mut self, period: u32) {
self.activity_period = period;
self.power_csr.wfo(utra::power::SAMPLING_PERIOD_SAMPLE_PERIOD, period);
}
pub fn activity_get_period(&mut self) -> u32 {
self.activity_period
}
pub fn gpio_dout(&mut self, d: u32) {
self.gpio_csr.wfo(utra::gpio::OUTPUT_OUTPUT, d);
@ -598,6 +625,7 @@ fn xmain() -> ! {
// register a suspend/resume listener
let sr_cid = xous::connect(llio_sid).expect("couldn't create suspend callback connection");
let mut susres = susres::Susres::new(&xns, Opcode::SuspendResume as u32, sr_cid).expect("couldn't create suspend/resume object");
let mut latest_activity = 0;
let mut usb_cb_conns: [Option<ScalarCallback>; 32] = [None; 32];
let mut com_cb_conns: [Option<ScalarCallback>; 32] = [None; 32];
@ -810,6 +838,15 @@ fn xmain() -> ! {
Some(Opcode::GpioIntHappened) => msg_scalar_unpack!(msg, channel, _, _, _, {
send_event(&gpio_cb_conns, channel as usize);
}),
Some(Opcode::EventActivityHappened) => msg_scalar_unpack!(msg, activity, _, _, _, {
log::debug!("activity: {}", activity);
latest_activity = activity as u32;
}),
Some(Opcode::GetActivity) => msg_blocking_scalar_unpack!(msg, _, _, _, _, {
let period = llio.activity_get_period() as u32;
log::debug!("activity/period: {}/{}, {:.2}%", latest_activity, period, (latest_activity as f32 / period as f32) * 100.0);
xous::return_scalar2(msg.sender, latest_activity as usize, period as usize).expect("couldn't return activity");
}),
Some(Opcode::Quit) => {
log::info!("Received quit opcode, exiting.");
let dropconn = xous::connect(i2c_sid).unwrap();

View file

@ -3,7 +3,7 @@
<device schemaVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd" >
<vendor>litex</vendor>
<name>SOC</name>
<description><![CDATA[Litex SoC 2021-06-01 16:27:12]]></description>
<description><![CDATA[Litex SoC 2021-06-02 00:30:35]]></description>
<addressUnitBits>8</addressUnitBits>
<width>32</width>
@ -1162,7 +1162,7 @@ register to disable individual events.]]></description>
<register>
<name>GIT_MAJOR</name>
<description><![CDATA[Major git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``0``.]]></description>
<addressOffset>0x0008</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
@ -1178,9 +1178,9 @@ register to disable individual events.]]></description>
<register>
<name>GIT_MINOR</name>
<description><![CDATA[Minor git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``8``.]]></description>
<addressOffset>0x000c</addressOffset>
<resetValue>0x00</resetValue>
<resetValue>0x08</resetValue>
<size>32</size>
<fields>
<field>
@ -1194,9 +1194,9 @@ register to disable individual events.]]></description>
<register>
<name>GIT_REVISION</name>
<description><![CDATA[Revision git tag version. For example, this firmware was built from git tag
``v0.0.0``, so this value is ``0``.]]></description>
``v0.8.1``, so this value is ``1``.]]></description>
<addressOffset>0x0010</addressOffset>
<resetValue>0x00</resetValue>
<resetValue>0x01</resetValue>
<size>32</size>
<fields>
<field>
@ -1210,10 +1210,10 @@ register to disable individual events.]]></description>
<register>
<name>GIT_GITREV</name>
<description><![CDATA[First 32-bits of the git revision. This documentation was built from git rev
``9e77f50e``, so this value is 2658661646, which should be enough to check out
``cf5b40e6``, so this value is 3478864102, which should be enough to check out
the exact git version used to build this firmware.]]></description>
<addressOffset>0x0014</addressOffset>
<resetValue>0x9e77f50e</resetValue>
<resetValue>0xcf5b40e6</resetValue>
<size>32</size>
<fields>
<field>
@ -2657,10 +2657,112 @@ sources (power, sha512, and engine25519)]]></description>
</field>
</fields>
</register>
<register>
<name>WAKEUP_SOURCE</name>
<addressOffset>0x0008</addressOffset>
<resetValue>0xff</resetValue>
<size>32</size>
<fields>
<field>
<name>kbd</name>
<msb>0</msb>
<bitRange>[0:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Use the keyboard as wakeup source]]></description>
</field>
<field>
<name>ticktimer</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Use the ticktimer as wakeup source]]></description>
</field>
<field>
<name>timer0</name>
<msb>2</msb>
<bitRange>[2:2]</bitRange>
<lsb>2</lsb>
<description><![CDATA[Use timer0 (os timer) as wakeup source]]></description>
</field>
<field>
<name>usb</name>
<msb>3</msb>
<bitRange>[3:3]</bitRange>
<lsb>3</lsb>
<description><![CDATA[Use USB k-transition as wakeup source]]></description>
</field>
<field>
<name>audio</name>
<msb>4</msb>
<bitRange>[4:4]</bitRange>
<lsb>4</lsb>
<description><![CDATA[Use audio FIFO empty as wakeup source]]></description>
</field>
<field>
<name>com</name>
<msb>5</msb>
<bitRange>[5:5]</bitRange>
<lsb>5</lsb>
<description><![CDATA[Use COM hold falling as wakeup source]]></description>
</field>
<field>
<name>rtc</name>
<msb>6</msb>
<bitRange>[6:6]</bitRange>
<lsb>6</lsb>
<description><![CDATA[Use RTC external interrupt as wakeup source]]></description>
</field>
<field>
<name>console</name>
<msb>7</msb>
<bitRange>[7:7]</bitRange>
<lsb>7</lsb>
<description><![CDATA[Use the console UART RX line dropping as wakeup source]]></description>
</field>
</fields>
</register>
<register>
<name>ACTIVITY_RATE</name>
<addressOffset>0x000c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>counts_awake</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[number of counts in the last sample interval that we were active]]></description>
</field>
</fields>
</register>
<register>
<name>SAMPLING_PERIOD</name>
<addressOffset>0x0010</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
<field>
<name>sample_period</name>
<msb>30</msb>
<bitRange>[30:0]</bitRange>
<lsb>0</lsb>
<description><![CDATA[Sampling period for counts awake, in 12MHz cycles]]></description>
</field>
<field>
<name>kill_sampler</name>
<msb>31</msb>
<bitRange>[31:31]</bitRange>
<lsb>31</lsb>
<description><![CDATA[When set, permanently disable reporting (in case you don't want the high-
resolutionn timing sidechannel)]]></description>
</field>
</fields>
</register>
<register>
<name>VIBE</name>
<description><![CDATA[Vibration motor configuration register]]></description>
<addressOffset>0x0008</addressOffset>
<addressOffset>0x0014</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2675,8 +2777,8 @@ sources (power, sha512, and engine25519)]]></description>
</register>
<register>
<name>EV_STATUS</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x000c</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0018</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2687,12 +2789,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Level of the ``usb_attach`` event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Level of the ``activity_update`` event]]></description>
</field>
</fields>
</register>
<register>
<name>EV_PENDING</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0010</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x001c</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2703,12 +2812,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[USB attach event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[update available to activity register]]></description>
</field>
</fields>
</register>
<register>
<name>EV_ENABLE</name>
<description><![CDATA[USB attach event]]></description>
<addressOffset>0x0014</addressOffset>
<description><![CDATA[update available to activity register]]></description>
<addressOffset>0x0020</addressOffset>
<resetValue>0x00</resetValue>
<size>32</size>
<fields>
@ -2719,12 +2835,19 @@ sources (power, sha512, and engine25519)]]></description>
<lsb>0</lsb>
<description><![CDATA[Write a ``1`` to enable the ``usb_attach`` Event]]></description>
</field>
<field>
<name>activity_update</name>
<msb>1</msb>
<bitRange>[1:1]</bitRange>
<lsb>1</lsb>
<description><![CDATA[Write a ``1`` to enable the ``activity_update`` Event]]></description>
</field>
</fields>
</register>
</registers>
<addressBlock>
<offset>0</offset>
<size>0x18</size>
<size>0x24</size>
<usage>registers</usage>
</addressBlock>
<interrupt>
@ -3316,7 +3439,7 @@ inject too fast.]]></description>
<name>SEED1</name>
<description><![CDATA[Bits 32-63 of `SEED_SEED`. Seed used for the build]]></description>
<addressOffset>0x0000</addressOffset>
<resetValue>0x56f38707</resetValue>
<resetValue>0x742b5c26</resetValue>
<size>32</size>
<fields>
<field>
@ -3331,7 +3454,7 @@ inject too fast.]]></description>
<name>SEED0</name>
<description><![CDATA[Bits 0-31 of `SEED_SEED`.]]></description>
<addressOffset>0x0004</addressOffset>
<resetValue>0x400f5344</resetValue>
<resetValue>0x645c9ef4</resetValue>
<size>32</size>
<fields>
<field>