aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Christoph Bernack <[email protected]>2023-07-01 03:15:39 +0200
committerDario Nieuwenhuis <[email protected]>2023-07-30 22:16:42 +0200
commitb65406791a718e4e15a388b20c843fff2ab88037 (patch)
treee41eb0b587734cd95e97f40c2b99ff9e623cde74
parent39c1cc9f00e35d2862a24ad8ef345037fc02a5be (diff)
add RNG conditioning
-rw-r--r--embassy-stm32/src/rng.rs33
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);