mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-25 00:02:28 +00:00
feat(usb): add device qualifier descriptor
Signed-off-by: Haobo Gu <haobogu@outlook.com>
This commit is contained in:
parent
7a26e117cc
commit
a63d46507d
@ -13,6 +13,8 @@ pub mod descriptor_type {
|
|||||||
pub const STRING: u8 = 3;
|
pub const STRING: u8 = 3;
|
||||||
pub const INTERFACE: u8 = 4;
|
pub const INTERFACE: u8 = 4;
|
||||||
pub const ENDPOINT: u8 = 5;
|
pub const ENDPOINT: u8 = 5;
|
||||||
|
pub const DEVICE_QUALIFIER: u8 = 6;
|
||||||
|
pub const OTHER_SPEED_CONFIGURATION: u8 = 7;
|
||||||
pub const IAD: u8 = 11;
|
pub const IAD: u8 = 11;
|
||||||
pub const BOS: u8 = 15;
|
pub const BOS: u8 = 15;
|
||||||
pub const CAPABILITY: u8 = 16;
|
pub const CAPABILITY: u8 = 16;
|
||||||
@ -272,6 +274,25 @@ pub(crate) fn device_descriptor(config: &Config) -> [u8; 18] {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new Device Qualifier Descriptor array.
|
||||||
|
///
|
||||||
|
/// All device qualifier descriptors are always 10 bytes, so there's no need for
|
||||||
|
/// a variable-length buffer or DescriptorWriter.
|
||||||
|
pub(crate) fn device_qualifier_descriptor(config: &Config) -> [u8; 10] {
|
||||||
|
[
|
||||||
|
10, // bLength
|
||||||
|
0x06, // bDescriptorType
|
||||||
|
0x10,
|
||||||
|
0x02, // bcdUSB 2.1
|
||||||
|
config.device_class, // bDeviceClass
|
||||||
|
config.device_sub_class, // bDeviceSubClass
|
||||||
|
config.device_protocol, // bDeviceProtocol
|
||||||
|
config.max_packet_size_0, // bMaxPacketSize0
|
||||||
|
1, // bNumConfigurations
|
||||||
|
0, // Reserved
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
/// A writer for Binary Object Store descriptor.
|
/// A writer for Binary Object Store descriptor.
|
||||||
pub struct BosWriter<'a> {
|
pub struct BosWriter<'a> {
|
||||||
pub(crate) writer: DescriptorWriter<'a>,
|
pub(crate) writer: DescriptorWriter<'a>,
|
||||||
|
@ -190,6 +190,7 @@ struct Inner<'d, D: Driver<'d>> {
|
|||||||
|
|
||||||
config: Config<'d>,
|
config: Config<'d>,
|
||||||
device_descriptor: [u8; 18],
|
device_descriptor: [u8; 18],
|
||||||
|
device_qualifier_descriptor: [u8; 10],
|
||||||
config_descriptor: &'d [u8],
|
config_descriptor: &'d [u8],
|
||||||
bos_descriptor: &'d [u8],
|
bos_descriptor: &'d [u8],
|
||||||
msos_descriptor: crate::msos::MsOsDescriptorSet<'d>,
|
msos_descriptor: crate::msos::MsOsDescriptorSet<'d>,
|
||||||
@ -225,6 +226,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
|
|||||||
// This prevent further allocation by consuming the driver.
|
// This prevent further allocation by consuming the driver.
|
||||||
let (bus, control) = driver.start(config.max_packet_size_0 as u16);
|
let (bus, control) = driver.start(config.max_packet_size_0 as u16);
|
||||||
let device_descriptor = descriptor::device_descriptor(&config);
|
let device_descriptor = descriptor::device_descriptor(&config);
|
||||||
|
let device_qualifier_descriptor = descriptor::device_qualifier_descriptor(&config);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
control_buf,
|
control_buf,
|
||||||
@ -233,6 +235,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
|
|||||||
bus,
|
bus,
|
||||||
config,
|
config,
|
||||||
device_descriptor,
|
device_descriptor,
|
||||||
|
device_qualifier_descriptor,
|
||||||
config_descriptor,
|
config_descriptor,
|
||||||
bos_descriptor,
|
bos_descriptor,
|
||||||
msos_descriptor,
|
msos_descriptor,
|
||||||
@ -764,6 +767,7 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
descriptor_type::DEVICE_QUALIFIER => InResponse::Accepted(&self.device_qualifier_descriptor),
|
||||||
_ => InResponse::Rejected,
|
_ => InResponse::Rejected,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user