aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-02-18 10:56:30 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-02-18 15:30:10 +0100
commit7da90438dd7851f66abfa81eba2eeb36ff9c9c25 (patch)
tree400bd0f6ab5e15899bd3fc1d8df55b57acfd1cf8 /src/main.rs
parenta3f0fb062048c52c3f04e907f0107e1db9b6141c (diff)
downloadntw-7da90438dd7851f66abfa81eba2eeb36ff9c9c25.tar.gz
ntw-7da90438dd7851f66abfa81eba2eeb36ff9c9c25.tar.bz2
Add USB stack and simple HID implementation
This patch adds the usb-device and stm32f103xx-usb crates that provide a USB stack. It introduces the HidClass struct, a basic implementation of the Human Interface Device (HID) USB class. Devices with that class are recognized as HID devices with the specified vendor and product ID, but do not provide the endpoints required for interaction.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs
index d76cf33..b0ecafd 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,14 +5,43 @@
#![no_main]
extern crate panic_halt;
-extern crate hal;
-use cortex_m::asm;
+mod device;
+mod hid;
+
use cortex_m_rt::entry;
+use hal::prelude::*;
+use stm32f103xx_usb::UsbBus;
+use usb_device::class::UsbClass;
+
+use crate::hid::{HidClass, Protocol, Subclass};
#[entry]
fn main() -> ! {
+ let p = hal::stm32::Peripherals::take().unwrap();
+
+ 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(&usb_bus, Subclass::BootInterface, Protocol::Keyboard);
+ let mut usb_dev = device::create_usb_device(&usb_bus);
+ usb_dev.force_reset().expect("USB reset failed");
+
loop {
- asm::nop();
+ if usb_dev.poll(&mut [&mut usb_class]) {
+ usb_class.poll();
+ }
}
}