// Copyright 2019 Robin Krahl // SPDX-License-Identifier: GPL-3.0-or-later use core::iter::Iterator; use hal::stm32::CRC; pub trait Crc { fn get(&self, data: &[u8]) -> u32 { self.get_u32(data.chunks(4).map(slice_to_u32)) } fn get_u32>(&self, iter: I) -> u32; } pub struct Stm32Crc { crc: CRC, } impl Stm32Crc { pub fn new(crc: CRC) -> Self { Self { crc } } fn write(&self, val: u32) { self.crc.dr.write(|w| w.dr().bits(val)); } fn read(&self) -> u32 { self.crc.dr.read().dr().bits() } fn reset(&self) { self.crc.cr.write(|w| w.reset().reset()); } } impl Crc for Stm32Crc { fn get_u32>(&self, iter: I) -> u32 { self.reset(); iter.for_each(|val| self.write(val)); self.read() } } fn slice_to_u32(data: &[u8]) -> u32 { data.iter() .enumerate() .fold(0, |acc, (idx, val)| acc + (u32::from(*val) << (idx * 8))) }