diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/device.rs | 20 | ||||
-rw-r--r-- | src/hid.rs | 28 | ||||
-rw-r--r-- | src/main.rs | 5 |
3 files changed, 37 insertions, 16 deletions
diff --git a/src/device.rs b/src/device.rs index ea732e6..31f4293 100644 --- a/src/device.rs +++ b/src/device.rs @@ -4,9 +4,29 @@ use usb_device::bus::{UsbBus, UsbBusAllocator}; use usb_device::device::{UsbDevice, UsbDeviceBuilder, UsbVidPid}; +use crate::hid::{HidDevice, Protocol, Subclass}; + const VID_CLAY_LOGIC: u16 = 0x20a0; const PID_NITROKEY_PRO: u16 = 0x4108; +pub struct Nitrokey {} + +impl Nitrokey { + pub fn new() -> Self { + Nitrokey {} + } +} + +impl HidDevice for Nitrokey { + fn subclass(&self) -> Subclass { + Subclass::BootInterface + } + + fn protocol(&self) -> Protocol { + Protocol::Keyboard + } +} + pub fn create_usb_device<B: UsbBus>(alloc: &UsbBusAllocator<B>) -> UsbDevice<'_, B> { UsbDeviceBuilder::new(alloc, UsbVidPid(VID_CLAY_LOGIC, PID_NITROKEY_PRO)) .manufacturer("Nitrokey/ntw") @@ -26,31 +26,31 @@ enum_u8! { } } -pub struct HidClass<'a, B: UsbBus> { +pub trait HidDevice { + fn subclass(&self) -> Subclass; + + fn protocol(&self) -> Protocol; +} + +pub struct HidClass<'a, B: UsbBus, D: HidDevice> { + device: D, interface: InterfaceNumber, endpoint_interrupt_in: EndpointIn<'a, B>, expect_interrupt_in_complete: bool, - subclass: Subclass, - protocol: Protocol, } -impl<B: UsbBus> HidClass<'_, B> { - pub fn new( - alloc: &UsbBusAllocator<B>, - subclass: Subclass, - protocol: Protocol, - ) -> HidClass<'_, B> { +impl<B: UsbBus, D: HidDevice> HidClass<'_, B, D> { + pub fn new(device: D, alloc: &UsbBusAllocator<B>) -> HidClass<'_, B, D> { HidClass { + device, interface: alloc.interface(), endpoint_interrupt_in: alloc.interrupt(8, 10), expect_interrupt_in_complete: false, - subclass, - protocol, } } } -impl<B: UsbBus> UsbClass<B> for HidClass<'_, B> { +impl<B: UsbBus, D: HidDevice> UsbClass<B> for HidClass<'_, B, D> { fn poll(&mut self) {} fn reset(&mut self) { @@ -61,8 +61,8 @@ impl<B: UsbBus> UsbClass<B> for HidClass<'_, B> { writer.interface( self.interface, INTERFACE_CLASS_HID, - self.subclass.into(), - self.protocol.into(), + self.device.subclass().into(), + self.device.protocol().into(), )?; writer.endpoint(&self.endpoint_interrupt_in)?; diff --git a/src/main.rs b/src/main.rs index 3857967..e10f4d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,8 @@ use hal::prelude::*; use stm32f103xx_usb::UsbBus; use usb_device::class::UsbClass; -use crate::hid::{HidClass, Protocol, Subclass}; +use crate::device::Nitrokey; +use crate::hid::HidClass; #[entry] fn main() -> ! { @@ -38,7 +39,7 @@ fn main() -> ! { 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_class = HidClass::new(Nitrokey::new(), &usb_bus); let mut usb_dev = device::create_usb_device(&usb_bus); usb_dev.force_reset().expect("USB reset failed"); |