aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/device.rs20
-rw-r--r--src/hid.rs28
-rw-r--r--src/main.rs5
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")
diff --git a/src/hid.rs b/src/hid.rs
index 9de68d6..0bb8a11 100644
--- a/src/hid.rs
+++ b/src/hid.rs
@@ -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");