From 97e448c1d9921cd084e1da70f3943bead03474ed Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Mon, 18 Feb 2019 14:20:14 +0000 Subject: 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. --- src/device.rs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/device.rs') 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(alloc: &UsbBusAllocator) -> UsbDevice<'_, B> { -- cgit v1.2.1