diff --git a/examples/hist.rs b/examples/hist.rs new file mode 100644 index 0000000000000000000000000000000000000000..f0e753ff00a9ce4888f4249e57c7696473e1a586 --- /dev/null +++ b/examples/hist.rs @@ -0,0 +1,132 @@ +//! Prints raw samples from the capacitor random number generator. +//! These would not usually be used directly, instead use `CapRng`. +//! Raw samples are useful to analyse the entropy. + +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] + +#[cfg(not(feature = "defmt"))] +use log::{debug, info, warn, error}; + +#[cfg(feature = "defmt")] +use defmt::{debug, info, warn, panic, error}; +#[cfg(feature = "defmt")] +use {defmt_rtt as _, panic_probe as _}; + +use embassy_rp::gpio::{Flex, AnyPin, Pin}; +use embassy_rp::Peripheral; +use embassy_executor::Spawner; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let p = embassy_rp::init(Default::default()); + let mut cp = cortex_m::peripheral::Peripherals::take().unwrap(); + + // 0.1uF + // let mut gpio = (Flex::new(p.PIN_6), 6); + // 0.01uF ? + // let mut gpio = (Flex::new(p.PIN_10), 10); + // nothing + // let mut gpio = Flex::new(p.PIN_22); + // nothing, adc pin + // let mut gpio = (Flex::new(p.PIN_28), 28); + + // let mut gpio = (Flex::new(p.PIN_15), 15); + + // // wifi sd_clk, or led for non-w + // let mut gpio = (Flex::new(p.PIN_29), 29); + // // check wifi is off. + // let mut gpio23 = Flex::new(p.PIN_23); + // assert!(gpio23.is_low()); + // // wifi cs high + // let mut gpio25 = Flex::new(p.PIN_25); + // gpio25.set_low(); + // gpio25.set_as_output(); + + // let mut gpio = Flex::new(p.PIN_15); + // let mut gpio = Flex::new(p.PIN_20); + // let mut gpio = p.PIN_20.into(); + + let mut hist = [0u32; 200]; + + let PRINT = 1000; + // let PRINT = 50; + + // let mut gpios = [ + // p.PIN_22.degrade().into_ref(), + // p.PIN_6.degrade().into_ref(), + // p.PIN_10.degrade().into_ref(), + // p.PIN_13.degrade().into_ref(), + // // p.PIN_23.degrade().into_ref(), + // // p.PIN_24.degrade().into_ref(), + // p.PIN_25.degrade().into_ref(), + // ]; + + let mut gpios = [ + // serial + // p.PIN_0.degrade().into_ref(), + // p.PIN_1.degrade().into_ref(), + + p.PIN_2.degrade().into_ref(), + p.PIN_3.degrade().into_ref(), + p.PIN_4.degrade().into_ref(), + p.PIN_5.degrade().into_ref(), + p.PIN_6.degrade().into_ref(), + p.PIN_7.degrade().into_ref(), + p.PIN_8.degrade().into_ref(), + p.PIN_9.degrade().into_ref(), + p.PIN_10.degrade().into_ref(), + p.PIN_11.degrade().into_ref(), + p.PIN_12.degrade().into_ref(), + p.PIN_13.degrade().into_ref(), + p.PIN_14.degrade().into_ref(), + p.PIN_15.degrade().into_ref(), + p.PIN_16.degrade().into_ref(), + p.PIN_17.degrade().into_ref(), + p.PIN_18.degrade().into_ref(), + p.PIN_19.degrade().into_ref(), + p.PIN_20.degrade().into_ref(), + p.PIN_21.degrade().into_ref(), + p.PIN_22.degrade().into_ref(), + // wl_on + // p.PIN_23.degrade().into_ref(), + // p.PIN_24.degrade().into_ref(), + // wl_cs, gate of vsys adc mosfet + p.PIN_25.degrade().into_ref(), + p.PIN_26.degrade().into_ref(), + p.PIN_27.degrade().into_ref(), + p.PIN_28.degrade().into_ref(), + // p.PIN_29.degrade().into_ref(), + ]; + // let mut gpios = [ + // p.PIN_22.degrade().into_ref(), + // ]; + + for gpio in gpios.iter_mut() { + for low_delay in 0..1 { + let pin = gpio.pin(); + let mut n = 0; + caprand::noise(gpio.reborrow(), low_delay, + &mut cp.SYST, + |v, overshoot| { + // info!("{}", v); + + let vu = v as usize; + hist[vu.min(hist.len()-1)] += 1; + n += 1; + if n % PRINT == 0 { + info!("gpio {} delay {} iter {}", pin, low_delay, n); + for (p, h) in hist.iter_mut().enumerate() { + if *h > 0 { + info!("{}: {}", p, h); + *h = 0; + } + } + } + n < PRINT + }).unwrap(); + } + } + cortex_m::asm::bkpt() +} diff --git a/examples/noise.rs b/examples/noise.rs index 1dca3b7b16c696c91b07153a4da148723d5ad03c..09075cd137350ed8f08f3640360346f09a064aed 100644 --- a/examples/noise.rs +++ b/examples/noise.rs @@ -50,7 +50,7 @@ async fn main(_spawner: Spawner) { let mut hist = [0u32; 200]; - let PRINT = 10000; + let PRINT = 20000; // let PRINT = 50; // let mut gpios = [ @@ -76,29 +76,30 @@ async fn main(_spawner: Spawner) { // p.PIN_7.degrade().into_ref(), // p.PIN_8.degrade().into_ref(), // p.PIN_9.degrade().into_ref(), - p.PIN_10.degrade().into_ref(), + // p.PIN_10.degrade().into_ref(), // p.PIN_11.degrade().into_ref(), // p.PIN_12.degrade().into_ref(), - p.PIN_13.degrade().into_ref(), - p.PIN_14.degrade().into_ref(), - p.PIN_15.degrade().into_ref(), + // p.PIN_13.degrade().into_ref(), + // p.PIN_14.degrade().into_ref(), + // p.PIN_15.degrade().into_ref(), p.PIN_16.degrade().into_ref(), - p.PIN_17.degrade().into_ref(), - p.PIN_18.degrade().into_ref(), - p.PIN_19.degrade().into_ref(), - p.PIN_20.degrade().into_ref(), - p.PIN_21.degrade().into_ref(), + // p.PIN_17.degrade().into_ref(), + // p.PIN_18.degrade().into_ref(), + // p.PIN_19.degrade().into_ref(), + // p.PIN_20.degrade().into_ref(), + // p.PIN_21.degrade().into_ref(), p.PIN_22.degrade().into_ref(), // p.PIN_23.degrade().into_ref(), // p.PIN_24.degrade().into_ref(), // wl_cs, gate of vsys adc mosfet - p.PIN_25.degrade().into_ref(), + // p.PIN_25.degrade().into_ref(), // p.PIN_26.degrade().into_ref(), // p.PIN_27.degrade().into_ref(), // p.PIN_28.degrade().into_ref(), // p.PIN_29.degrade().into_ref(), ]; + info!("gpio,delay,time,n"); for gpio in gpios.iter_mut() { for low_delay in 0..1{ let pin = gpio.pin(); @@ -106,22 +107,11 @@ async fn main(_spawner: Spawner) { caprand::noise(gpio.reborrow(), low_delay, &mut cp.SYST, |v, overshoot| { - // info!("{}", v); - - let vu = v as usize; - hist[vu.min(hist.len()-1)] += 1; + info!("{},{},{},{}", pin, low_delay, v, n); n += 1; - if n % PRINT == 0 { - info!("gpio {} delay {} iter {}", pin, low_delay, n); - for (p, h) in hist.iter_mut().enumerate() { - if *h > 0 { - info!("{}: {}", p, h); - *h = 0; - } - } - } n < PRINT }).unwrap(); } } + cortex_m::asm::bkpt() } diff --git a/src/cap.rs b/src/cap.rs index feb736e4e9beb5df0589904e084eefc8df3e2ec5..9b01e32ee4cfc832113de577c556b89cbc5833ae 100644 --- a/src/cap.rs +++ b/src/cap.rs @@ -1,8 +1,8 @@ #[cfg(not(feature = "defmt"))] -use log::{debug, info, warn, error}; +use log::{debug, info, warn, error, trace}; #[cfg(feature = "defmt")] -use defmt::{error, debug, info, panic}; +use defmt::{error, debug, info, panic, trace}; use core::arch::asm; @@ -109,7 +109,7 @@ impl<'t> SyTi<'t> { } // Returns (ticks: u32, pos: u8) // `pos == 0` are less precise than other results -fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Result<(u32, u8), ()> { +fn time_rise(pin: PeripheralRef<AnyPin>, low_cycles: u32, syst: &mut SYST) -> Result<(u32, u8), ()> { let pin_num = pin.pin() as usize; let mask = 1u32 << pin_num; @@ -132,11 +132,13 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res let soe_set = soe.value_set().ptr(); let soe_clr = soe.value_clr().ptr(); - let mut t = SyTi::new(syst); - // actual low time is low_delay+1 cycles - match (low_delay, low_delay % 3) { - (0, _) => unsafe { + match (low_cycles, low_cycles % 3) { + (0, _) => { + panic!("Don't use this"); + // no pull low + }, + (1, _) => unsafe { asm!( "str {mask}, [{soe_set}]", // low for 1 cycle @@ -146,9 +148,9 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res soe_set = in(reg) soe_set, soe_clr = in(reg) soe_clr, options(nostack, readonly), - ) + ); }, - (1, _) => unsafe { + (2, _) => unsafe { asm!( "str {mask}, [{soe_set}]", // low for 2 cycles @@ -159,12 +161,10 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res soe_set = in(reg) soe_set, soe_clr = in(reg) soe_clr, options(nostack, readonly), - ) + ); }, - (_, 2) => unsafe { - // min delay of 2 - let mut d = low_delay + 1; - assert!(d % 3 == 0); + (_, 0) => unsafe { + // min low time of 3 asm!( "str {mask}, [{soe_set}]", "000:", @@ -178,15 +178,12 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res mask = in(reg) mask, soe_set = in(reg) soe_set, soe_clr = in(reg) soe_clr, - d = inout(reg) d, + d = in(reg) low_cycles, options(nostack, readonly), ); - assert_eq!(d, 0); }, - (_, 0) => unsafe { - // min delay of 3 - let mut d = low_delay + 1; - assert!(d % 3 == 1); + (_, 1) => unsafe { + // min low time of 4 asm!( "str {mask}, [{soe_set}]", // one cycle @@ -202,15 +199,12 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res mask = in(reg) mask, soe_set = in(reg) soe_set, soe_clr = in(reg) soe_clr, - d = inout(reg) d, + d = in(reg) low_cycles, options(nostack, readonly), ); - assert_eq!(d, 0); }, - (_, 1) => unsafe { - // min delay of 4 - let mut d = low_delay + 1; - assert!(d % 3 == 2); + (_, 2) => unsafe { + // min low time of 5 asm!( "str {mask}, [{soe_set}]", // one cycle @@ -228,16 +222,15 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res mask = in(reg) mask, soe_set = in(reg) soe_set, soe_clr = in(reg) soe_clr, - d = inout(reg) d, + d = in(reg) low_cycles, options(nostack, readonly), ); - assert_eq!(d, 0); }, // `match` doesn't understand modulo _ => unreachable!() } - t.reset(); + let mut t = SyTi::new(syst); // unsafe { // soe.value_set().write_value(1 << pin_num); // } @@ -306,30 +299,37 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res let tick = t.done()?; - let pos = if x0 & mask != 0 { - 0 - } else if x1 & mask != 0 { - 1 - } else if x2 & mask != 0 { - 2 - } else if x3 & mask != 0 { - 3 - } else if x4 & mask != 0 { - 4 - } else if x5 & mask != 0 { - 5 - } else { - 6 - }; - let tick = tick + pos; - // first measurement is less precise. - let precise = pos != 0; + let result = (x0 & mask) << 0 + | (x1 & mask) << 1 + | (x2 & mask) << 2 + | (x3 & mask) << 3 + | (x4 & mask) << 4 + | (x5 & mask) << 5; + + // let pos = if x0 & mask != 0 { + // 0 + // } else if x1 & mask != 0 { + // 1 + // } else if x2 & mask != 0 { + // 2 + // } else if x3 & mask != 0 { + // 3 + // } else if x4 & mask != 0 { + // 4 + // } else if x5 & mask != 0 { + // 5 + // } else { + // 6 + // }; + // let tick = tick + pos; + // // first measurement is less precise. + // let precise = pos != 0; unsafe { + // Turn off pullup when not used pac::PADS_BANK0 .gpio(pin_num) .modify(|s| { - // No pullup s.set_pue(false); }); }; @@ -340,7 +340,7 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res // `f()` is called on each output `u32`. pub fn noise<'d, F>( mut pin: PeripheralRef<AnyPin>, - low_delay: u32, + low_cycles: u32, syst: &mut SYST, mut f: F, ) -> Result<(), ()> @@ -421,22 +421,8 @@ where for (i, _) in core::iter::repeat(()).enumerate() { let (meas, precise) = critical_section::with(|_cs| { - // pin.set_pull(Pull::Down); - // // let t = SyTi::new(syst); - // while pin.is_high() {} - // // let ticks = t.done()?; - // // Keep pulling down for `overshoot` cycles - // cortex_m::asm::delay(overshoot); - - // // Pull up, time how long to reach threshold - // pin.set_pull(Pull::None); - // debug!("pulldown {}", ticks); - - // let t = SyTi::new(syst); - // while pin.is_high() {} - // let r = t.done().map(|t| (t, true)); - - let (r, pos) = time_rise(pin.reborrow(), 0, syst)?; + + let (r, pos) = time_rise(pin.reborrow(), low_cycles, syst)?; let precise = pos == 0; // let mut gpio = Flex::<AnyPin>::new(pin.reborrow());