Skip to content

Commit 78e3d11

Browse files
debugging rng start
1 parent d011da9 commit 78e3d11

4 files changed

Lines changed: 38 additions & 17 deletions

File tree

boards/nucleo_u545re_q/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ flash-debug: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/debug/$(PLATFORM).elf
2222
flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).elf
2323
$(OPENOCD) $(OPENOCD_OPTIONS) -c "init; halt; stm32l4x mass_erase 0; program $< verify reset exit"
2424

25+
.PHONY: flash-probe-rs
26+
flash-probe-rs: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).elf
27+
$(Q)probe-rs download --chip STM32U545RETx --allow-erase-all $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).elf
28+
$(Q)probe-rs reset --chip STM32U545RETx
29+
2530
.PHONY: program
2631
program:
2732
tockloader install --openocd --board nucleo_u545re_q $(APP)

boards/nucleo_u545re_q/src/main.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
use kernel::component::Component;
1010
use kernel::debug::PanicResources;
11-
use kernel::deferred_call::DeferredCall;
11+
use kernel::deferred_call::{DeferredCall, DeferredCallClient};
1212
use kernel::hil::entropy::Entropy32;
1313
use kernel::platform::{KernelResources, SyscallDriverLookup};
14+
use kernel::utilities::registers::interfaces::Readable;
15+
use kernel::utilities::registers::interfaces::Writeable;
1416
use kernel::utilities::single_thread_value::SingleThreadValue;
1517
use kernel::{capabilities, debug};
1618
use kernel::{create_capability, static_init};
@@ -256,19 +258,6 @@ unsafe fn start() -> (
256258
);
257259

258260
// 1. Import
259-
use capsules_extra::test::rng::RngEntropy32Test;
260-
261-
// 2. Statically allocate the test struct (inside your component/board setup)
262-
let rng_test = static_init!(
263-
RngEntropy32Test<'static, stm32u545::entropy::Trng>,
264-
RngEntropy32Test::new(trng)
265-
);
266-
267-
// 3. Register the test as the driver's client
268-
trng.set_client(rng_test);
269-
270-
// 4. Kick it off — call after the kernel loop is about to start
271-
rng_test.run();
272261
// Symbols for linker
273262
extern "C" {
274263
/// Beginning of the ROM region containing app images.
@@ -300,7 +289,20 @@ unsafe fn start() -> (
300289
&capsules_system::process_policies::PanicFaultPolicy {},
301290
&create_capability!(capabilities::ProcessManagementCapability),
302291
);
292+
use capsules_extra::test::rng::RngEntropy32Test;
293+
294+
// 2. Statically allocate the test struct (inside your component/board setup)
295+
let rng_test = static_init!(
296+
RngEntropy32Test<'static, stm32u545::entropy::Trng>,
297+
RngEntropy32Test::new(trng)
298+
);
303299

300+
// 3. Register the test as the driver's client
301+
trng.set_client(rng_test);
302+
trng.register();
303+
// 4. Kick it off — call after the kernel loop is about to start
304+
// // temporary diagnostic
305+
rng_test.run();
304306
(board_kernel, platform, chip)
305307
}
306308

chips/stm32u5xx/src/chip.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::usart;
1818
use crate::{entropy, exti};
1919

2020
use core::fmt::Write;
21+
use kernel::deferred_call::DeferredCallClient;
2122
use kernel::platform::chip::Chip;
2223
use kernel::platform::chip::InterruptService;
2324

@@ -70,7 +71,7 @@ impl<'a> Stm32u5xxDefaultPeripherals<'a> {
7071
self.rcc.enable_usart1();
7172
self.rcc.enable_syscfg();
7273
self.rcc.enable_trng();
73-
self.trng.init();
74+
self.trng.register();
7475
self.rcc.set_usart1_source_pclk();
7576
// Link DMA to USART1
7677
let usart1_channel_tx = self.dma1.request_channel();

chips/stm32u5xx/src/entropy.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Copyright OxidOS Automotive 2026.
44

55
use core::cell::Cell;
6+
use kernel::debug;
67

78
use kernel::deferred_call::{DeferredCall, DeferredCallClient};
89
use kernel::hil::entropy::{Client32, Continue, Entropy32};
@@ -17,7 +18,7 @@ register_structs! {
1718
/// control register
1819
(0x000 => cr: ReadWrite<u32, CR::Register>),
1920
/// status register
20-
(0x004 => sr: ReadWrite<u32, SR::Register>),
21+
(0x004 => pub sr: ReadWrite<u32, SR::Register>),
2122
/// data register
2223
(0x008 => dr: ReadOnly<u32>),
2324
(0x00C => nscr: ReadWrite<u32, NSCR::Register>),
@@ -125,21 +126,26 @@ impl<'a> Trng<'a> {
125126
self.registers
126127
.cr
127128
.modify(CR::RNGEN::SET + CR::IE::SET + CR::CONDRST::CLEAR);
129+
debug!("CR: {:02x?}", self.registers.cr.get());
128130
}
129131
fn send_data(&self) {
130132
let response = self
131133
.client
132134
.map(|client| client.entropy_available(&mut TrngIter(self), Ok(())));
133135
match response {
134136
Some(Continue::Done) | None => self.entropy_needed.set(false),
135-
_ => {}
137+
_ => {
138+
self.deferred_call.set();
139+
}
136140
}
137141
}
138142

139143
pub fn handle_interrupt(&self) {
140144
let regs = self.registers;
141145
if regs.sr.any_matching_bits_set(SR::DRDY::SET) && self.entropy_needed.get() {
142146
self.send_data();
147+
} else {
148+
self.deferred_call.set();
143149
}
144150
}
145151
}
@@ -170,9 +176,16 @@ impl<'a> Entropy32<'a> for Trng<'a> {
170176

171177
impl DeferredCallClient for Trng<'_> {
172178
fn handle_deferred_call(&self) {
179+
debug!("got");
173180
if !self.entropy_needed.get() {
174181
return;
175182
}
183+
debug!(
184+
"CR: {:02x?} SR: {:02x?}, need: {}",
185+
self.registers.cr.get(),
186+
self.registers.sr.get(),
187+
self.entropy_needed.get()
188+
);
176189

177190
if self.registers.sr.any_matching_bits_set(SR::DRDY::SET) {
178191
self.send_data();

0 commit comments

Comments
 (0)