#[cfg(feature = "rand")]
use rand_core::CryptoRng;
#[cfg(feature = "rand")]
use rand_core::RngCore;
#[cfg(feature = "rand")]
use rand_core::impls::{fill_bytes_via_next, next_u64_via_u32};
pub struct Trng {
trng: crate::pac::Trng,
}
impl Trng {
pub fn new(trng: crate::pac::Trng, reg: &mut crate::gcr::GcrRegisters) -> Self {
use crate::gcr::ClockForPeripheral;
unsafe {
trng.enable_clock(&mut reg.gcr);
}
Self { trng }
}
#[doc(hidden)]
#[inline(always)]
fn _is_ready(&self) -> bool {
self.trng.status().read().rdy().is_ready()
}
#[inline(always)]
pub fn gen_u32(&self) -> u32 {
while !self._is_ready() {}
self.trng.data().read().bits() as u32
}
}
#[cfg(feature = "rand")]
impl RngCore for Trng {
#[inline(always)]
fn next_u32(&mut self) -> u32 {
self.gen_u32()
}
#[inline(always)]
fn next_u64(&mut self) -> u64 {
next_u64_via_u32(self)
}
#[inline(always)]
fn fill_bytes(&mut self, dest: &mut [u8]) {
fill_bytes_via_next(self, dest);
}
}
#[cfg(feature = "rand")]
impl CryptoRng for Trng {}