From 14d847e1b26ec35b91af50c573af32551437456c Mon Sep 17 00:00:00 2001 From: Lucas Kent Date: Wed, 17 Dec 2025 17:41:53 +1100 Subject: Fix rp webusb example on windows --- embassy-usb/src/msos.rs | 4 ---- examples/rp/src/bin/usb_webusb.rs | 11 ++++++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/embassy-usb/src/msos.rs b/embassy-usb/src/msos.rs index 66689871e..6d7f87061 100644 --- a/embassy-usb/src/msos.rs +++ b/embassy-usb/src/msos.rs @@ -110,10 +110,6 @@ impl<'d> MsOsDescriptorWriter<'d> { !self.is_empty(), "device features may only be added after the header is written" ); - assert!( - self.config_mark.is_none(), - "device features must be added before the first configuration subset" - ); self.write(desc); } diff --git a/examples/rp/src/bin/usb_webusb.rs b/examples/rp/src/bin/usb_webusb.rs index 5cecb92f0..edc9a0c52 100644 --- a/examples/rp/src/bin/usb_webusb.rs +++ b/examples/rp/src/bin/usb_webusb.rs @@ -26,6 +26,7 @@ use embassy_rp::usb::{Driver as UsbDriver, InterruptHandler}; use embassy_usb::class::web_usb::{Config as WebUsbConfig, State, Url, WebUsb}; use embassy_usb::driver::{Driver, Endpoint, EndpointIn, EndpointOut}; use embassy_usb::msos::{self, windows_version}; +use embassy_usb::types::InterfaceNumber; use embassy_usb::{Builder, Config}; use {defmt_rtt as _, panic_probe as _}; @@ -56,7 +57,7 @@ async fn main(_spawner: Spawner) { let mut config_descriptor = [0; 256]; let mut bos_descriptor = [0; 256]; let mut control_buf = [0; 64]; - let mut msos_descriptor = [0; 256]; + let mut msos_descriptor = [0; 512]; let webusb_config = WebUsbConfig { max_packet_size: 64, @@ -83,6 +84,14 @@ async fn main(_spawner: Spawner) { // In principle you might want to call msos_feature() just on a specific function, // if your device also has other functions that still use standard class drivers. builder.msos_descriptor(windows_version::WIN8_1, 0); + builder.msos_writer().configuration(0); + builder.msos_writer().function(InterfaceNumber(0)); + builder.msos_feature(msos::CompatibleIdFeatureDescriptor::new("WINUSB", "")); + builder.msos_feature(msos::RegistryPropertyFeatureDescriptor::new( + "DeviceInterfaceGUIDs", + msos::PropertyData::RegMultiSz(DEVICE_INTERFACE_GUIDS), + )); + builder.msos_writer().function(InterfaceNumber(1)); builder.msos_feature(msos::CompatibleIdFeatureDescriptor::new("WINUSB", "")); builder.msos_feature(msos::RegistryPropertyFeatureDescriptor::new( "DeviceInterfaceGUIDs", -- cgit