diff options
| -rw-r--r-- | embassy-stm32/src/rng.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs index 27415c2d7..5d61d0361 100644 --- a/embassy-stm32/src/rng.rs +++ b/embassy-stm32/src/rng.rs | |||
| @@ -31,6 +31,7 @@ impl<'d, T: Instance> Rng<'d, T> { | |||
| 31 | random | 31 | random |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | #[cfg(rng_v1)] | ||
| 34 | pub fn reset(&mut self) { | 35 | pub fn reset(&mut self) { |
| 35 | // rng_v2 locks up on seed error, needs reset | 36 | // rng_v2 locks up on seed error, needs reset |
| 36 | #[cfg(rng_v2)] | 37 | #[cfg(rng_v2)] |
| @@ -49,6 +50,38 @@ impl<'d, T: Instance> Rng<'d, T> { | |||
| 49 | let _ = self.next_u32(); | 50 | let _ = self.next_u32(); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 53 | #[cfg(not(rng_v1))] | ||
| 54 | pub fn reset(&mut self) { | ||
| 55 | T::regs().cr().modify(|reg| { | ||
| 56 | reg.set_rngen(false); | ||
| 57 | reg.set_condrst(true); | ||
| 58 | // set RNG config "A" according to reference manual | ||
| 59 | // this has to be written within the same write access as setting the CONDRST bit | ||
| 60 | reg.set_nistc(pac::rng::vals::Nistc::DEFAULT); | ||
| 61 | reg.set_rng_config1(pac::rng::vals::RngConfig1::CONFIGA); | ||
| 62 | reg.set_rng_config2(pac::rng::vals::RngConfig2::CONFIGA_B); | ||
| 63 | reg.set_rng_config3(pac::rng::vals::RngConfig3::CONFIGA); | ||
| 64 | reg.set_clkdiv(pac::rng::vals::Clkdiv::NODIV); | ||
| 65 | }); | ||
| 66 | // wait for CONDRST to be set | ||
| 67 | while !T::regs().cr().read().condrst() {} | ||
| 68 | // magic number must be written immediately before every read or write access to HTCR | ||
| 69 | T::regs().htcr().write(|w| w.set_htcfg(pac::rng::vals::Htcfg::MAGIC)); | ||
| 70 | // write recommended value according to reference manual | ||
| 71 | // note: HTCR can only be written during conditioning | ||
| 72 | T::regs() | ||
| 73 | .htcr() | ||
| 74 | .write(|w| w.set_htcfg(pac::rng::vals::Htcfg::RECOMMENDED)); | ||
| 75 | // finish conditioning | ||
| 76 | T::regs().cr().modify(|reg| { | ||
| 77 | reg.set_rngen(true); | ||
| 78 | reg.set_condrst(false); | ||
| 79 | reg.set_ie(true); | ||
| 80 | }); | ||
| 81 | // wait for CONDRST to be reset | ||
| 82 | while T::regs().cr().read().condrst() {} | ||
| 83 | } | ||
| 84 | |||
| 52 | pub async fn async_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { | 85 | pub async fn async_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { |
| 53 | T::regs().cr().modify(|reg| { | 86 | T::regs().cr().modify(|reg| { |
| 54 | reg.set_rngen(true); | 87 | reg.set_rngen(true); |
