usb: add support for MS OS Descriptors

This commit is contained in:
Matt Ickstadt
2023-01-12 14:59:25 -06:00
committed by alexmoon
parent a7fa7d0de2
commit f5ff3c4ac3
4 changed files with 779 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ pub mod class;
pub mod control;
pub mod descriptor;
mod descriptor_reader;
pub mod msos;
pub mod types;
use embassy_futures::select::{select, Either};
@@ -135,6 +136,8 @@ struct Inner<'d, D: Driver<'d>> {
set_address_pending: bool,
interfaces: Vec<Interface<'d>, MAX_INTERFACE_COUNT>,
msos_descriptor: Option<crate::msos::MsOsDescriptorSet<'d>>,
}
impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
@@ -147,6 +150,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
bos_descriptor: &'d [u8],
interfaces: Vec<Interface<'d>, MAX_INTERFACE_COUNT>,
control_buf: &'d mut [u8],
msos_descriptor: Option<crate::msos::MsOsDescriptorSet<'d>>,
) -> UsbDevice<'d, D> {
// Start the USB bus.
// This prevent further allocation by consuming the driver.
@@ -170,6 +174,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
address: 0,
set_address_pending: false,
interfaces,
msos_descriptor,
},
}
}
@@ -603,6 +608,18 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
None => InResponse::Rejected,
}
}
(RequestType::Vendor, Recipient::Device) => {
if let Some(msos) = &self.msos_descriptor {
if req.request == msos.vendor_code() && req.index == 7 {
// Index 7 retrieves the MS OS Descriptor Set
InResponse::Accepted(msos.descriptor())
} else {
InResponse::Rejected
}
} else {
InResponse::Rejected
}
}
_ => InResponse::Rejected,
}
}