aboutsummaryrefslogtreecommitdiff
path: root/src/device.rs
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-02-18 14:20:14 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-02-18 15:53:20 +0100
commit97e448c1d9921cd084e1da70f3943bead03474ed (patch)
treef48471939041af16d1347fee1e877bffaada3dcb /src/device.rs
parenta9e4071913ef1ce32cb4a1581d5683ad56627ec2 (diff)
downloadntw-97e448c1d9921cd084e1da70f3943bead03474ed.tar.gz
ntw-97e448c1d9921cd084e1da70f3943bead03474ed.tar.bz2
hid: Add support for {Get,Set}_Report requests
This patch adds support for Get_Report and Set_Report requests to HidClass. We parse the request metadata and the delegate the request handling to the HidDevice. Our HidDevice implementation, Nitrokey, stores the data sent with Set_Report requests. The Get_Report handling is not implemented yet.
Diffstat (limited to 'src/device.rs')
-rw-r--r--src/device.rs30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/device.rs b/src/device.rs
index f71caf0..f7c4fc7 100644
--- a/src/device.rs
+++ b/src/device.rs
@@ -4,11 +4,12 @@
use usb_device::bus::{UsbBus, UsbBusAllocator};
use usb_device::device::{UsbDevice, UsbDeviceBuilder, UsbVidPid};
-use crate::hid::{HidDevice, Protocol, Subclass};
+use crate::hid::{HidDevice, Protocol, ReportType, Subclass};
const VID_CLAY_LOGIC: u16 = 0x20a0;
const PID_NITROKEY_PRO: u16 = 0x4108;
+const REPORT_LEN: usize = 64;
const REPORT_DESCRIPTOR: &[u8] = &[
0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01,
0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03, 0x95, 0x05, 0x75, 0x01,
@@ -17,11 +18,15 @@ const REPORT_DESCRIPTOR: &[u8] = &[
0x75, 0x08, 0x95, 0x40, 0xB1, 0x02, 0xC0,
];
-pub struct Nitrokey {}
+pub struct Nitrokey {
+ buf: [u8; REPORT_LEN],
+}
impl Nitrokey {
pub fn new() -> Self {
- Nitrokey {}
+ Nitrokey {
+ buf: [0; REPORT_LEN],
+ }
}
}
@@ -37,6 +42,25 @@ impl HidDevice for Nitrokey {
fn report_descriptor(&self) -> &[u8] {
REPORT_DESCRIPTOR
}
+
+ fn get_report(&mut self, report_type: ReportType, report_id: u8) -> Result<&[u8], ()> {
+ let _ = (report_type, report_id);
+ Err(())
+ }
+
+ fn set_report(
+ &mut self,
+ report_type: ReportType,
+ report_id: u8,
+ data: &[u8],
+ ) -> Result<(), ()> {
+ if report_type != ReportType::Feature || report_id != 0 || data.len() != REPORT_LEN {
+ Err(())
+ } else {
+ self.buf.copy_from_slice(data);
+ Ok(())
+ }
+ }
}
pub fn create_usb_device<B: UsbBus>(alloc: &UsbBusAllocator<B>) -> UsbDevice<'_, B> {