// Copyright 2019 Robin Krahl // SPDX-License-Identifier: GPL-3.0-or-later #![no_std] #![no_main] extern crate panic_halt; #[macro_use] mod util; mod commands; mod crc; mod device; mod hid; use cortex_m_rt::entry; use hal::prelude::*; use stm32f103xx_usb::UsbBus; use usb_device::class::UsbClass; use crate::crc::Crc; use crate::device::Nitrokey; use crate::hid::HidClass; #[entry] 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 mut flash = p.FLASH.constrain(); let mut rcc = p.RCC.constrain(); let clocks = rcc .cfgr .use_hse(8.mhz()) .sysclk(48.mhz()) .pclk1(24.mhz()) .freeze(&mut flash.acr); assert!(clocks.usbclk_valid(), "USB clocks not valid"); let mut gpioa = p.GPIOA.split(&mut rcc.apb2); let usb_bus = UsbBus::usb_with_reset(p.USB, &mut rcc.apb1, &clocks, &mut gpioa.crh, gpioa.pa12); let mut usb_class = HidClass::new(Nitrokey::new(crc), &usb_bus); let mut usb_dev = device::create_usb_device(&usb_bus); usb_dev.force_reset().expect("USB reset failed"); loop { if usb_dev.poll(&mut [&mut usb_class]) { usb_class.poll(); } } }