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