From da6b1e8399cf977698e4a630f0862f698cba2b83 Mon Sep 17 00:00:00 2001 From: Lucas Granberg Date: Wed, 8 Feb 2023 17:52:49 +0200 Subject: [PATCH 1/5] Reset rng in case of clock or seed error --- embassy-stm32/src/rng.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs index 10fc4a75..c487b759 100644 --- a/embassy-stm32/src/rng.rs +++ b/embassy-stm32/src/rng.rs @@ -90,8 +90,10 @@ impl<'d, T: Instance> Rng<'d, T> { impl<'d, T: Instance> RngCore for Rng<'d, T> { fn next_u32(&mut self) -> u32 { loop { - let bits = unsafe { T::regs().sr().read() }; - if bits.drdy() { + let sr = unsafe { T::regs().sr().read() }; + if sr.seis() | sr.ceis() { + self.reset(); + } else if sr.drdy() { return unsafe { T::regs().dr().read() }; } } From bab4277a8620e9a5e2347ff919d677e9c87528c9 Mon Sep 17 00:00:00 2001 From: Lucas Granberg Date: Wed, 8 Feb 2023 17:57:37 +0200 Subject: [PATCH 2/5] hack for STM32WL, rcc reset in case of seed error The STM32WL series has a more complicated rng device that gets stuck when there is a seed error. --- embassy-stm32/src/rng.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs index c487b759..abc62583 100644 --- a/embassy-stm32/src/rng.rs +++ b/embassy-stm32/src/rng.rs @@ -32,6 +32,11 @@ impl<'d, T: Instance> Rng<'d, T> { } pub fn reset(&mut self) { + //stm32wl gets stuck if there is a seed error + #[cfg(stm32wl)] + if unsafe { T::regs().sr().read().seis()} { + T::reset(); + } unsafe { T::regs().cr().modify(|reg| { reg.set_rngen(true); From ab4b3fa96dc320f034f5437c9540897f553519be Mon Sep 17 00:00:00 2001 From: Lucas Granberg Date: Thu, 9 Feb 2023 12:42:57 +0200 Subject: [PATCH 3/5] update stm32-data to include rng_v2 --- stm32-data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stm32-data b/stm32-data index cc93f9d1..66252982 160000 --- a/stm32-data +++ b/stm32-data @@ -1 +1 @@ -Subproject commit cc93f9d10395077770bebefb6b9488e06b0e5811 +Subproject commit 66252982939014e94fc4a1b7423c30c3d108ae0b From 43d018b67ff98a68e7d1d8c122f803a3d90c9381 Mon Sep 17 00:00:00 2001 From: Lucas Granberg Date: Thu, 9 Feb 2023 12:44:20 +0200 Subject: [PATCH 4/5] Use rng_v2 cfg instead of chip specific for seed error recover hack --- embassy-stm32/src/rng.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs index abc62583..cd3cc94c 100644 --- a/embassy-stm32/src/rng.rs +++ b/embassy-stm32/src/rng.rs @@ -32,8 +32,7 @@ impl<'d, T: Instance> Rng<'d, T> { } pub fn reset(&mut self) { - //stm32wl gets stuck if there is a seed error - #[cfg(stm32wl)] + #[cfg(rng_v2)] if unsafe { T::regs().sr().read().seis()} { T::reset(); } From 2b6654541d2d195636cf7a9c5ef3fdced0583e21 Mon Sep 17 00:00:00 2001 From: Lucas Granberg Date: Thu, 9 Feb 2023 13:01:44 +0200 Subject: [PATCH 5/5] rustfmt --- embassy-stm32/src/rng.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs index cd3cc94c..1e16b847 100644 --- a/embassy-stm32/src/rng.rs +++ b/embassy-stm32/src/rng.rs @@ -32,8 +32,9 @@ impl<'d, T: Instance> Rng<'d, T> { } pub fn reset(&mut self) { + // rng_v2 locks up on seed error, needs reset #[cfg(rng_v2)] - if unsafe { T::regs().sr().read().seis()} { + if unsafe { T::regs().sr().read().seis() } { T::reset(); } unsafe {