// 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::asm::delay; use cortex_m_rt::entry; use embedded_hal::digital::v2::OutputPin; use hal::prelude::*; use hal::usb::{Peripheral, UsbBus}; use usb_device::class::UsbClass; use crate::crc::Stm32Crc; 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 = Stm32Crc::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 mut pin_dp = gpioa.pa12.into_push_pull_output(&mut gpioa.crh); pin_dp.set_low().unwrap(); delay(clocks.sysclk().0 / 100); let pin_dp = pin_dp.into_floating_input(&mut gpioa.crh); let pin_dm = gpioa.pa11; let usb = Peripheral { usb: p.USB, pin_dm, pin_dp, }; let usb_bus = UsbBus::new(usb); let mut usb_class = HidClass::new(Nitrokey::new(crc), &usb_bus); let mut usb_dev = device::create_usb_device(&usb_bus); loop { if usb_dev.poll(&mut [&mut usb_class]) { usb_class.poll(); } } }