diff options
author | Robin Krahl <robin.krahl@ireas.org> | 2019-02-20 23:13:38 +0000 |
---|---|---|
committer | Robin Krahl <robin.krahl@ireas.org> | 2019-02-21 00:16:00 +0100 |
commit | 853e613769087a4bf67023e42f7fc4f3b92339fb (patch) | |
tree | acfa941c5be18587d0299710b3e77e42666d3212 /src | |
parent | 3e31f2f9f6d7d087b136299468a4a2babdf6ccfb (diff) | |
download | ntw-853e613769087a4bf67023e42f7fc4f3b92339fb.tar.gz ntw-853e613769087a4bf67023e42f7fc4f3b92339fb.tar.bz2 |
Split struct Crc into trait Crc and struct Stm32Crc
There are different ways to implement the CRC check: For testing, we
might want to calulate the CRC in the software. On STM32 MCUs, we want
to use the CRC peripheral.
This patch splits the struct Crc into the Crc trait and the Stm32Crc
struct implementing Crc using the CRC peripheral. The Nitrokey struct
can now accept any Crc implementation.
Diffstat (limited to 'src')
-rw-r--r-- | src/crc.rs | 32 | ||||
-rw-r--r-- | src/device.rs | 10 | ||||
-rw-r--r-- | src/main.rs | 4 |
3 files changed, 28 insertions, 18 deletions
@@ -1,23 +1,25 @@ // Copyright 2019 Robin Krahl <robin.krahl@ireas.org> // SPDX-License-Identifier: GPL-3.0-or-later +use core::iter::Iterator; + use hal::stm32::CRC; -pub struct Crc { +pub trait Crc { + fn get(&self, data: &[u8]) -> u32 { + self.get_u32(data.chunks(4).map(slice_to_u32)) + } + + fn get_u32<I: Iterator<Item = u32>>(&self, iter: I) -> u32; +} + +pub struct Stm32Crc { crc: CRC, } -impl Crc { +impl Stm32Crc { 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() + Self { crc } } fn write(&self, val: u32) { @@ -33,6 +35,14 @@ impl Crc { } } +impl Crc for Stm32Crc { + fn get_u32<I: Iterator<Item = 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() diff --git a/src/device.rs b/src/device.rs index 9f3d1a7..830fa93 100644 --- a/src/device.rs +++ b/src/device.rs @@ -94,15 +94,15 @@ impl Response { } } -pub struct Nitrokey { - crc: Crc, +pub struct Nitrokey<C: Crc> { + crc: C, request: Option<Request>, request_crc: u32, buf: [u8; REPORT_LEN], } -impl Nitrokey { - pub fn new(crc: Crc) -> Self { +impl<C: Crc> Nitrokey<C> { + pub fn new(crc: C) -> Self { Nitrokey { crc, request: None, @@ -112,7 +112,7 @@ impl Nitrokey { } } -impl HidDevice for Nitrokey { +impl<C: Crc> HidDevice for Nitrokey<C> { fn subclass(&self) -> Subclass { Subclass::BootInterface } diff --git a/src/main.rs b/src/main.rs index 7e364ab..eb01dd6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ use hal::prelude::*; use stm32f103xx_usb::UsbBus; use usb_device::class::UsbClass; -use crate::crc::Crc; +use crate::crc::Stm32Crc; use crate::device::Nitrokey; use crate::hid::HidClass; @@ -28,7 +28,7 @@ fn main() -> ! { let p = hal::stm32::Peripherals::take().unwrap(); p.RCC.ahbenr.modify(|_, w| w.crcen().set_bit()); - let crc = Crc::new(p.CRC); + let crc = Stm32Crc::new(p.CRC); let mut flash = p.FLASH.constrain(); let mut rcc = p.RCC.constrain(); |