aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatteo <email>2025-09-30 18:38:43 +0200
committermatteo <email>2025-09-30 18:38:43 +0200
commit5c8218b8750bed3f4bef7973e250aa830d8c2fe3 (patch)
treece4d91f8b6d835fe19de2198e4e7c239a0ce16af
parent8eebeceb16fc5ef15285c62d21b8ea65b9baf6ee (diff)
review comments
-rw-r--r--embassy-usb/src/class/hid.rs134
-rw-r--r--examples/nrf52840/Cargo.toml2
-rw-r--r--examples/nrf52840/src/bin/usb_hid_keyboard.rs9
-rw-r--r--examples/nrf52840/src/bin/usb_hid_mouse.rs9
-rw-r--r--examples/rp/src/bin/usb_hid_keyboard.rs6
-rwxr-xr-xexamples/rp/src/bin/usb_hid_mouse.rs6
-rw-r--r--examples/rp235x/src/bin/usb_hid_keyboard.rs8
-rw-r--r--examples/stm32f4/src/bin/usb_hid_keyboard.rs6
-rw-r--r--examples/stm32f4/src/bin/usb_hid_mouse.rs6
-rw-r--r--examples/stm32l5/src/bin/usb_hid_mouse.rs6
10 files changed, 78 insertions, 114 deletions
diff --git a/embassy-usb/src/class/hid.rs b/embassy-usb/src/class/hid.rs
index b9830baeb..6723afbbc 100644
--- a/embassy-usb/src/class/hid.rs
+++ b/embassy-usb/src/class/hid.rs
@@ -8,8 +8,6 @@ use core::sync::atomic::{AtomicUsize, Ordering};
8use ssmarshal::serialize; 8use ssmarshal::serialize;
9#[cfg(feature = "usbd-hid")] 9#[cfg(feature = "usbd-hid")]
10use usbd_hid::descriptor::AsInputReport; 10use usbd_hid::descriptor::AsInputReport;
11#[cfg(feature = "usbd-hid")]
12use usbd_hid::hid_class::HidProtocolMode;
13 11
14use crate::control::{InResponse, OutResponse, Recipient, Request, RequestType}; 12use crate::control::{InResponse, OutResponse, Recipient, Request, RequestType};
15use crate::driver::{Driver, Endpoint, EndpointError, EndpointIn, EndpointOut}; 13use crate::driver::{Driver, Endpoint, EndpointError, EndpointIn, EndpointOut};
@@ -18,13 +16,6 @@ use crate::{Builder, Handler};
18 16
19const USB_CLASS_HID: u8 = 0x03; 17const USB_CLASS_HID: u8 = 0x03;
20 18
21const USB_SUBCLASS_REPORT_ONLY: u8 = 0x00;
22const USB_SUBCLASS_BOOT_OR_REPORT: u8 = 0x01;
23
24const USB_PROTOCOL_NONE: u8 = 0x00;
25const USB_PROTOCOL_KEYBOARD: u8 = 0x01;
26const USB_PROTOCOL_MOUSE: u8 = 0x02;
27
28// HID 19// HID
29const HID_DESC_DESCTYPE_HID: u8 = 0x21; 20const HID_DESC_DESCTYPE_HID: u8 = 0x21;
30const HID_DESC_DESCTYPE_HID_REPORT: u8 = 0x22; 21const HID_DESC_DESCTYPE_HID_REPORT: u8 = 0x22;
@@ -40,7 +31,6 @@ const HID_REQ_SET_PROTOCOL: u8 = 0x0b;
40 31
41/// Get/Set Protocol mapping 32/// Get/Set Protocol mapping
42/// See (7.2.5 and 7.2.6): <https://www.usb.org/sites/default/files/hid1_11.pdf> 33/// See (7.2.5 and 7.2.6): <https://www.usb.org/sites/default/files/hid1_11.pdf>
43#[cfg(not(feature = "usbd-hid"))]
44#[derive(Copy, Clone, Debug, PartialEq, Eq)] 34#[derive(Copy, Clone, Debug, PartialEq, Eq)]
45#[cfg_attr(feature = "defmt", derive(defmt::Format))] 35#[cfg_attr(feature = "defmt", derive(defmt::Format))]
46#[repr(u8)] 36#[repr(u8)]
@@ -51,7 +41,6 @@ pub enum HidProtocolMode {
51 Report = 1, 41 Report = 1,
52} 42}
53 43
54#[cfg(not(feature = "usbd-hid"))]
55impl From<u8> for HidProtocolMode { 44impl From<u8> for HidProtocolMode {
56 fn from(mode: u8) -> HidProtocolMode { 45 fn from(mode: u8) -> HidProtocolMode {
57 if mode == HidProtocolMode::Boot as u8 { 46 if mode == HidProtocolMode::Boot as u8 {
@@ -62,6 +51,30 @@ impl From<u8> for HidProtocolMode {
62 } 51 }
63} 52}
64 53
54/// USB HID interface subclass values.
55#[derive(Copy, Clone, Debug, PartialEq, Eq)]
56#[cfg_attr(feature = "defmt", derive(defmt::Format))]
57#[repr(u8)]
58pub enum HidSubclass {
59 /// Only report mode is supported.
60 ReportOnly = 0,
61 /// Both boot and report mode are supported.
62 ReportOrBoot = 1,
63}
64
65/// USB HID protocol values.
66#[derive(Copy, Clone, Debug, PartialEq, Eq)]
67#[cfg_attr(feature = "defmt", derive(defmt::Format))]
68#[repr(u8)]
69pub enum HidBootProtocol {
70 /// No specific boot protocol.
71 None = 0,
72 /// Boot protocol keyboard.
73 Keyboard = 1,
74 /// Boot protocol mouse.
75 Mouse = 2,
76}
77
65/// Configuration for the HID class. 78/// Configuration for the HID class.
66pub struct Config<'d> { 79pub struct Config<'d> {
67 /// HID report descriptor. 80 /// HID report descriptor.
@@ -79,6 +92,12 @@ pub struct Config<'d> {
79 92
80 /// Max packet size for both the IN and OUT endpoints. 93 /// Max packet size for both the IN and OUT endpoints.
81 pub max_packet_size: u16, 94 pub max_packet_size: u16,
95
96 /// The HID subclass of this interface
97 pub hid_subclass: HidSubclass,
98
99 /// The HID boot protocol of this interface
100 pub hid_boot_protocol: HidBootProtocol,
82} 101}
83 102
84/// Report ID 103/// Report ID
@@ -137,15 +156,18 @@ fn build<'d, D: Driver<'d>>(
137 state: &'d mut State<'d>, 156 state: &'d mut State<'d>,
138 config: Config<'d>, 157 config: Config<'d>,
139 with_out_endpoint: bool, 158 with_out_endpoint: bool,
140 usb_subclass: u8,
141 usb_protocol: u8,
142) -> (Option<D::EndpointOut>, D::EndpointIn, &'d AtomicUsize) { 159) -> (Option<D::EndpointOut>, D::EndpointIn, &'d AtomicUsize) {
143 let len = config.report_descriptor.len(); 160 let len = config.report_descriptor.len();
144 161
145 let mut func = builder.function(USB_CLASS_HID, usb_subclass, usb_protocol); 162 let mut func = builder.function(USB_CLASS_HID, config.hid_subclass as u8, config.hid_boot_protocol as u8);
146 let mut iface = func.interface(); 163 let mut iface = func.interface();
147 let if_num = iface.interface_number(); 164 let if_num = iface.interface_number();
148 let mut alt = iface.alt_setting(USB_CLASS_HID, usb_subclass, usb_protocol, None); 165 let mut alt = iface.alt_setting(
166 USB_CLASS_HID,
167 config.hid_subclass as u8,
168 config.hid_boot_protocol as u8,
169 None,
170 );
149 171
150 // HID descriptor 172 // HID descriptor
151 alt.descriptor( 173 alt.descriptor(
@@ -193,42 +215,7 @@ impl<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize> HidReaderWrit
193 /// HID reports, consider using [`HidWriter::new`] instead, which allocates an IN endpoint only. 215 /// HID reports, consider using [`HidWriter::new`] instead, which allocates an IN endpoint only.
194 /// 216 ///
195 pub fn new(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self { 217 pub fn new(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
196 HidReaderWriter::_new(builder, state, config, USB_SUBCLASS_REPORT_ONLY, USB_PROTOCOL_NONE) 218 let (ep_out, ep_in, offset) = build(builder, state, config, true);
197 }
198
199 /// Creates a new `HidReaderWriter` for a HID Mouse, with support for the BOOT protocol mode.
200 ///
201 /// This will allocate one IN and one OUT endpoints. If you only need writing (sending)
202 /// HID reports, consider using [`HidWriter::new`] instead, which allocates an IN endpoint only.
203 ///
204 pub fn new_mouse(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
205 HidReaderWriter::_new(builder, state, config, USB_SUBCLASS_BOOT_OR_REPORT, USB_PROTOCOL_MOUSE)
206 }
207
208 /// Creates a new `HidReaderWriter` for a HID Keyboard, with support for the BOOT protocol mode.
209 ///
210 /// This will allocate one IN and one OUT endpoints. If you only need writing (sending)
211 /// HID reports, consider using [`HidWriter::new`] instead, which allocates an IN endpoint only.
212 ///
213 pub fn new_keyboard(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
214 HidReaderWriter::_new(
215 builder,
216 state,
217 config,
218 USB_SUBCLASS_BOOT_OR_REPORT,
219 USB_PROTOCOL_KEYBOARD,
220 )
221 }
222
223 /// Private helper function to create a new `HidReaderWriter`.
224 fn _new(
225 builder: &mut Builder<'d, D>,
226 state: &'d mut State<'d>,
227 config: Config<'d>,
228 usb_subclass: u8,
229 usb_protocol: u8,
230 ) -> Self {
231 let (ep_out, ep_in, offset) = build(builder, state, config, true, usb_subclass, usb_protocol);
232 219
233 Self { 220 Self {
234 reader: HidReader { 221 reader: HidReader {
@@ -317,50 +304,7 @@ impl<'d, D: Driver<'d>, const N: usize> HidWriter<'d, D, N> {
317 /// of CPU on the device & bandwidth on the bus. A value of 10 is reasonable for 304 /// of CPU on the device & bandwidth on the bus. A value of 10 is reasonable for
318 /// high performance uses, and a value of 255 is good for best-effort usecases. 305 /// high performance uses, and a value of 255 is good for best-effort usecases.
319 pub fn new(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self { 306 pub fn new(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
320 HidWriter::_new(builder, state, config, USB_SUBCLASS_REPORT_ONLY, USB_PROTOCOL_NONE) 307 let (ep_out, ep_in, _offset) = build(builder, state, config, false);
321 }
322
323 /// Creates a new `HidWriter` for a HID Mouse, with support for the BOOT protocol mode.
324 ///
325 /// This will allocate one IN endpoint only, so the host won't be able to send
326 /// reports to us. If you need that, consider using [`HidReaderWriter::new`] instead.
327 ///
328 /// poll_ms configures how frequently the host should poll for reading/writing
329 /// HID reports. A lower value means better throughput & latency, at the expense
330 /// of CPU on the device & bandwidth on the bus. A value of 10 is reasonable for
331 /// high performance uses, and a value of 255 is good for best-effort usecases.
332 pub fn new_mouse(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
333 HidWriter::_new(builder, state, config, USB_SUBCLASS_BOOT_OR_REPORT, USB_PROTOCOL_MOUSE)
334 }
335
336 /// Creates a new `HidWriter` for a HID Keyboard, with support for the BOOT protocol mode.
337 ///
338 /// This will allocate one IN endpoint only, so the host won't be able to send
339 /// reports to us. If you need that, consider using [`HidReaderWriter::new`] instead.
340 ///
341 /// poll_ms configures how frequently the host should poll for reading/writing
342 /// HID reports. A lower value means better throughput & latency, at the expense
343 /// of CPU on the device & bandwidth on the bus. A value of 10 is reasonable for
344 /// high performance uses, and a value of 255 is good for best-effort usecases.
345 pub fn new_keyboard(builder: &mut Builder<'d, D>, state: &'d mut State<'d>, config: Config<'d>) -> Self {
346 HidWriter::_new(
347 builder,
348 state,
349 config,
350 USB_SUBCLASS_BOOT_OR_REPORT,
351 USB_PROTOCOL_KEYBOARD,
352 )
353 }
354
355 /// Private helper function to create a new `HidWriter`.
356 pub fn _new(
357 builder: &mut Builder<'d, D>,
358 state: &'d mut State<'d>,
359 config: Config<'d>,
360 usb_subclass: u8,
361 usb_protocol: u8,
362 ) -> Self {
363 let (ep_out, ep_in, _offset) = build(builder, state, config, false, usb_subclass, usb_protocol);
364 308
365 assert!(ep_out.is_none()); 309 assert!(ep_out.is_none());
366 310
diff --git a/examples/nrf52840/Cargo.toml b/examples/nrf52840/Cargo.toml
index 9a1fc080e..452e83b7e 100644
--- a/examples/nrf52840/Cargo.toml
+++ b/examples/nrf52840/Cargo.toml
@@ -28,7 +28,7 @@ cortex-m-rt = "0.7.0"
28panic-probe = { version = "1.0.0", features = ["print-defmt"] } 28panic-probe = { version = "1.0.0", features = ["print-defmt"] }
29rand = { version = "0.9.0", default-features = false } 29rand = { version = "0.9.0", default-features = false }
30embedded-storage = "0.3.1" 30embedded-storage = "0.3.1"
31usbd-hid = { version = "0.8.1", features = ["defmt"] } 31usbd-hid = "0.8.1"
32serde = { version = "1.0.136", default-features = false } 32serde = { version = "1.0.136", default-features = false }
33embedded-hal = { version = "1.0" } 33embedded-hal = { version = "1.0" }
34embedded-hal-async = { version = "1.0" } 34embedded-hal-async = { version = "1.0" }
diff --git a/examples/nrf52840/src/bin/usb_hid_keyboard.rs b/examples/nrf52840/src/bin/usb_hid_keyboard.rs
index a4931099a..8649d5667 100644
--- a/examples/nrf52840/src/bin/usb_hid_keyboard.rs
+++ b/examples/nrf52840/src/bin/usb_hid_keyboard.rs
@@ -13,11 +13,12 @@ use embassy_nrf::usb::Driver;
13use embassy_nrf::{bind_interrupts, pac, peripherals, usb}; 13use embassy_nrf::{bind_interrupts, pac, peripherals, usb};
14use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 14use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
15use embassy_sync::signal::Signal; 15use embassy_sync::signal::Signal;
16use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State}; 16use embassy_usb::class::hid::{
17 HidBootProtocol, HidProtocolMode, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State,
18};
17use embassy_usb::control::OutResponse; 19use embassy_usb::control::OutResponse;
18use embassy_usb::{Builder, Config, Handler}; 20use embassy_usb::{Builder, Config, Handler};
19use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor}; 21use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor};
20use usbd_hid::hid_class::HidProtocolMode;
21use {defmt_rtt as _, panic_probe as _}; 22use {defmt_rtt as _, panic_probe as _};
22 23
23bind_interrupts!(struct Irqs { 24bind_interrupts!(struct Irqs {
@@ -81,8 +82,10 @@ async fn main(_spawner: Spawner) {
81 request_handler: None, 82 request_handler: None,
82 poll_ms: 60, 83 poll_ms: 60,
83 max_packet_size: 64, 84 max_packet_size: 64,
85 hid_subclass: HidSubclass::ReportOrBoot,
86 hid_boot_protocol: HidBootProtocol::Keyboard,
84 }; 87 };
85 let hid = HidReaderWriter::<_, 1, 8>::new_keyboard(&mut builder, &mut state, config); 88 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
86 89
87 // Build the builder. 90 // Build the builder.
88 let mut usb = builder.build(); 91 let mut usb = builder.build();
diff --git a/examples/nrf52840/src/bin/usb_hid_mouse.rs b/examples/nrf52840/src/bin/usb_hid_mouse.rs
index 6ec8a2d33..4baf2e814 100644
--- a/examples/nrf52840/src/bin/usb_hid_mouse.rs
+++ b/examples/nrf52840/src/bin/usb_hid_mouse.rs
@@ -10,11 +10,12 @@ use embassy_nrf::usb::vbus_detect::HardwareVbusDetect;
10use embassy_nrf::usb::Driver; 10use embassy_nrf::usb::Driver;
11use embassy_nrf::{bind_interrupts, pac, peripherals, usb}; 11use embassy_nrf::{bind_interrupts, pac, peripherals, usb};
12use embassy_time::Timer; 12use embassy_time::Timer;
13use embassy_usb::class::hid::{HidWriter, ReportId, RequestHandler, State}; 13use embassy_usb::class::hid::{
14 HidBootProtocol, HidProtocolMode, HidSubclass, HidWriter, ReportId, RequestHandler, State,
15};
14use embassy_usb::control::OutResponse; 16use embassy_usb::control::OutResponse;
15use embassy_usb::{Builder, Config}; 17use embassy_usb::{Builder, Config};
16use usbd_hid::descriptor::{MouseReport, SerializedDescriptor}; 18use usbd_hid::descriptor::{MouseReport, SerializedDescriptor};
17use usbd_hid::hid_class::HidProtocolMode;
18use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
19 20
20bind_interrupts!(struct Irqs { 21bind_interrupts!(struct Irqs {
@@ -72,9 +73,11 @@ async fn main(_spawner: Spawner) {
72 request_handler: Some(&mut request_handler), 73 request_handler: Some(&mut request_handler),
73 poll_ms: 60, 74 poll_ms: 60,
74 max_packet_size: 8, 75 max_packet_size: 8,
76 hid_subclass: HidSubclass::ReportOrBoot,
77 hid_boot_protocol: HidBootProtocol::Mouse,
75 }; 78 };
76 79
77 let mut writer = HidWriter::<_, 5>::new_mouse(&mut builder, &mut state, config); 80 let mut writer = HidWriter::<_, 5>::new(&mut builder, &mut state, config);
78 81
79 // Build the builder. 82 // Build the builder.
80 let mut usb = builder.build(); 83 let mut usb = builder.build();
diff --git a/examples/rp/src/bin/usb_hid_keyboard.rs b/examples/rp/src/bin/usb_hid_keyboard.rs
index 8658da6b5..fa78d0c2e 100644
--- a/examples/rp/src/bin/usb_hid_keyboard.rs
+++ b/examples/rp/src/bin/usb_hid_keyboard.rs
@@ -10,7 +10,7 @@ use embassy_rp::bind_interrupts;
10use embassy_rp::gpio::{Input, Pull}; 10use embassy_rp::gpio::{Input, Pull};
11use embassy_rp::peripherals::USB; 11use embassy_rp::peripherals::USB;
12use embassy_rp::usb::{Driver, InterruptHandler}; 12use embassy_rp::usb::{Driver, InterruptHandler};
13use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State}; 13use embassy_usb::class::hid::{HidBootProtocol, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State};
14use embassy_usb::control::OutResponse; 14use embassy_usb::control::OutResponse;
15use embassy_usb::{Builder, Config, Handler}; 15use embassy_usb::{Builder, Config, Handler};
16use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor}; 16use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor};
@@ -67,8 +67,10 @@ async fn main(_spawner: Spawner) {
67 request_handler: None, 67 request_handler: None,
68 poll_ms: 60, 68 poll_ms: 60,
69 max_packet_size: 64, 69 max_packet_size: 64,
70 hid_subclass: HidSubclass::ReportOrBoot,
71 hid_boot_protocol: HidBootProtocol::Keyboard,
70 }; 72 };
71 let hid = HidReaderWriter::<_, 1, 8>::new_keyboard(&mut builder, &mut state, config); 73 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
72 74
73 // Build the builder. 75 // Build the builder.
74 let mut usb = builder.build(); 76 let mut usb = builder.build();
diff --git a/examples/rp/src/bin/usb_hid_mouse.rs b/examples/rp/src/bin/usb_hid_mouse.rs
index 4d8fc354e..100e6048a 100755
--- a/examples/rp/src/bin/usb_hid_mouse.rs
+++ b/examples/rp/src/bin/usb_hid_mouse.rs
@@ -11,7 +11,7 @@ use embassy_rp::clocks::RoscRng;
11use embassy_rp::peripherals::USB; 11use embassy_rp::peripherals::USB;
12use embassy_rp::usb::{Driver, InterruptHandler}; 12use embassy_rp::usb::{Driver, InterruptHandler};
13use embassy_time::Timer; 13use embassy_time::Timer;
14use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State}; 14use embassy_usb::class::hid::{HidBootProtocol, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State};
15use embassy_usb::control::OutResponse; 15use embassy_usb::control::OutResponse;
16use embassy_usb::{Builder, Config, Handler}; 16use embassy_usb::{Builder, Config, Handler};
17use rand::Rng; 17use rand::Rng;
@@ -69,8 +69,10 @@ async fn main(_spawner: Spawner) {
69 request_handler: None, 69 request_handler: None,
70 poll_ms: 60, 70 poll_ms: 60,
71 max_packet_size: 64, 71 max_packet_size: 64,
72 hid_subclass: HidSubclass::ReportOrBoot,
73 hid_boot_protocol: HidBootProtocol::Mouse,
72 }; 74 };
73 let hid = HidReaderWriter::<_, 1, 8>::new_keyboard(&mut builder, &mut state, config); 75 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
74 76
75 // Build the builder. 77 // Build the builder.
76 let mut usb = builder.build(); 78 let mut usb = builder.build();
diff --git a/examples/rp235x/src/bin/usb_hid_keyboard.rs b/examples/rp235x/src/bin/usb_hid_keyboard.rs
index fa9eaa863..3203176cb 100644
--- a/examples/rp235x/src/bin/usb_hid_keyboard.rs
+++ b/examples/rp235x/src/bin/usb_hid_keyboard.rs
@@ -10,7 +10,9 @@ use embassy_rp::bind_interrupts;
10use embassy_rp::gpio::{Input, Pull}; 10use embassy_rp::gpio::{Input, Pull};
11use embassy_rp::peripherals::USB; 11use embassy_rp::peripherals::USB;
12use embassy_rp::usb::{Driver as UsbDriver, InterruptHandler}; 12use embassy_rp::usb::{Driver as UsbDriver, InterruptHandler};
13use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State as HidState}; 13use embassy_usb::class::hid::{
14 HidBootProtocol, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State as HidState,
15};
14use embassy_usb::control::OutResponse; 16use embassy_usb::control::OutResponse;
15use embassy_usb::{Builder, Config, Handler}; 17use embassy_usb::{Builder, Config, Handler};
16use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor}; 18use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor};
@@ -67,8 +69,10 @@ async fn main(_spawner: Spawner) {
67 request_handler: None, 69 request_handler: None,
68 poll_ms: 60, 70 poll_ms: 60,
69 max_packet_size: 64, 71 max_packet_size: 64,
72 hid_subclass: HidSubclass::ReportOrBoot,
73 hid_boot_protocol: HidBootProtocol::Keyboard,
70 }; 74 };
71 let hid = HidReaderWriter::<_, 1, 8>::new_keyboard(&mut builder, &mut state, config); 75 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
72 76
73 // Build the builder. 77 // Build the builder.
74 let mut usb = builder.build(); 78 let mut usb = builder.build();
diff --git a/examples/stm32f4/src/bin/usb_hid_keyboard.rs b/examples/stm32f4/src/bin/usb_hid_keyboard.rs
index 6ddfba83a..740fbcaef 100644
--- a/examples/stm32f4/src/bin/usb_hid_keyboard.rs
+++ b/examples/stm32f4/src/bin/usb_hid_keyboard.rs
@@ -11,7 +11,7 @@ use embassy_stm32::gpio::Pull;
11use embassy_stm32::time::Hertz; 11use embassy_stm32::time::Hertz;
12use embassy_stm32::usb::Driver; 12use embassy_stm32::usb::Driver;
13use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; 13use embassy_stm32::{bind_interrupts, peripherals, usb, Config};
14use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State}; 14use embassy_usb::class::hid::{HidBootProtocol, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State};
15use embassy_usb::control::OutResponse; 15use embassy_usb::control::OutResponse;
16use embassy_usb::{Builder, Handler}; 16use embassy_usb::{Builder, Handler};
17use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor}; 17use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor};
@@ -105,9 +105,11 @@ async fn main(_spawner: Spawner) {
105 request_handler: None, 105 request_handler: None,
106 poll_ms: 60, 106 poll_ms: 60,
107 max_packet_size: 8, 107 max_packet_size: 8,
108 hid_subclass: HidSubclass::ReportOrBoot,
109 hid_boot_protocol: HidBootProtocol::Keyboard,
108 }; 110 };
109 111
110 let hid = HidReaderWriter::<_, 1, 8>::new_keyboard(&mut builder, &mut state, config); 112 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
111 113
112 // Build the builder. 114 // Build the builder.
113 let mut usb = builder.build(); 115 let mut usb = builder.build();
diff --git a/examples/stm32f4/src/bin/usb_hid_mouse.rs b/examples/stm32f4/src/bin/usb_hid_mouse.rs
index 8d035d0d5..09af204c4 100644
--- a/examples/stm32f4/src/bin/usb_hid_mouse.rs
+++ b/examples/stm32f4/src/bin/usb_hid_mouse.rs
@@ -8,7 +8,7 @@ use embassy_stm32::time::Hertz;
8use embassy_stm32::usb::Driver; 8use embassy_stm32::usb::Driver;
9use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; 9use embassy_stm32::{bind_interrupts, peripherals, usb, Config};
10use embassy_time::Timer; 10use embassy_time::Timer;
11use embassy_usb::class::hid::{HidWriter, ReportId, RequestHandler, State}; 11use embassy_usb::class::hid::{HidBootProtocol, HidSubclass, HidWriter, ReportId, RequestHandler, State};
12use embassy_usb::control::OutResponse; 12use embassy_usb::control::OutResponse;
13use embassy_usb::Builder; 13use embassy_usb::Builder;
14use usbd_hid::descriptor::{MouseReport, SerializedDescriptor}; 14use usbd_hid::descriptor::{MouseReport, SerializedDescriptor};
@@ -95,9 +95,11 @@ async fn main(_spawner: Spawner) {
95 request_handler: Some(&mut request_handler), 95 request_handler: Some(&mut request_handler),
96 poll_ms: 60, 96 poll_ms: 60,
97 max_packet_size: 8, 97 max_packet_size: 8,
98 hid_subclass: HidSubclass::ReportOrBoot,
99 hid_boot_protocol: HidBootProtocol::Mouse,
98 }; 100 };
99 101
100 let mut writer = HidWriter::<_, 5>::new_mouse(&mut builder, &mut state, config); 102 let mut writer = HidWriter::<_, 5>::new(&mut builder, &mut state, config);
101 103
102 // Build the builder. 104 // Build the builder.
103 let mut usb = builder.build(); 105 let mut usb = builder.build();
diff --git a/examples/stm32l5/src/bin/usb_hid_mouse.rs b/examples/stm32l5/src/bin/usb_hid_mouse.rs
index 6f9200548..30dbd2698 100644
--- a/examples/stm32l5/src/bin/usb_hid_mouse.rs
+++ b/examples/stm32l5/src/bin/usb_hid_mouse.rs
@@ -7,7 +7,7 @@ use embassy_futures::join::join;
7use embassy_stm32::usb::Driver; 7use embassy_stm32::usb::Driver;
8use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; 8use embassy_stm32::{bind_interrupts, peripherals, usb, Config};
9use embassy_time::Timer; 9use embassy_time::Timer;
10use embassy_usb::class::hid::{HidWriter, ReportId, RequestHandler, State}; 10use embassy_usb::class::hid::{HidBootProtocol, HidSubclass, HidWriter, ReportId, RequestHandler, State};
11use embassy_usb::control::OutResponse; 11use embassy_usb::control::OutResponse;
12use embassy_usb::Builder; 12use embassy_usb::Builder;
13use usbd_hid::descriptor::{MouseReport, SerializedDescriptor}; 13use usbd_hid::descriptor::{MouseReport, SerializedDescriptor};
@@ -77,9 +77,11 @@ async fn main(_spawner: Spawner) {
77 request_handler: Some(&mut request_handler), 77 request_handler: Some(&mut request_handler),
78 poll_ms: 60, 78 poll_ms: 60,
79 max_packet_size: 8, 79 max_packet_size: 8,
80 hid_subclass: HidSubclass::ReportOrBoot,
81 hid_boot_protocol: HidBootProtocol::Mouse,
80 }; 82 };
81 83
82 let mut writer = HidWriter::<_, 5>::new_mouse(&mut builder, &mut state, config); 84 let mut writer = HidWriter::<_, 5>::new(&mut builder, &mut state, config);
83 85
84 // Build the builder. 86 // Build the builder.
85 let mut usb = builder.build(); 87 let mut usb = builder.build();