From 3bd79d0328e651e55efe04d760a40e7963be225d Mon Sep 17 00:00:00 2001 From: bunnie Date: Sat, 13 Sep 2025 01:08:31 +0800 Subject: [PATCH] make loader windows-friendly for usb serial --- loader/src/platform/cramium/usb/handlers.rs | 2 +- loader/src/platform/cramium/usb/mod.rs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/loader/src/platform/cramium/usb/handlers.rs b/loader/src/platform/cramium/usb/handlers.rs index 992e609f9..8e4475916 100644 --- a/loader/src/platform/cramium/usb/handlers.rs +++ b/loader/src/platform/cramium/usb/handlers.rs @@ -159,7 +159,7 @@ pub fn get_descriptor_request(this: &mut CorigineUsb, value: u16, _index: usize, match (value >> 8) as u8 { USB_DT_DEVICE => { crate::println!("USB_DT_DEVICE"); - let mut device_descriptor = DeviceDescriptor::default_composite(); + let mut device_descriptor = DeviceDescriptor::composite_with_iad(); device_descriptor.b_max_packet_size0 = 64; let len = length.min(core::mem::size_of::()); diff --git a/loader/src/platform/cramium/usb/mod.rs b/loader/src/platform/cramium/usb/mod.rs index 3ea51f151..71fe67342 100644 --- a/loader/src/platform/cramium/usb/mod.rs +++ b/loader/src/platform/cramium/usb/mod.rs @@ -168,6 +168,7 @@ impl DeviceDescriptor { } } + #[allow(dead_code)] pub fn default_composite() -> Self { Self { b_length: core::mem::size_of::() as u8, @@ -186,6 +187,26 @@ impl DeviceDescriptor { b_num_configurations: 1, } } + + // Windows-friendly composite: EF/02/01 indicates IAD-present composite + pub fn composite_with_iad() -> Self { + Self { + b_length: core::mem::size_of::() as u8, + b_descriptor_type: USB_DT_DEVICE, + b_cd_usb: 0x0200, + b_device_class: 0xEF, // Miscellaneous + b_device_sub_class: 0x02, // Common Class + b_device_protocol: 0x01, // Interface Association Descriptor (IAD) + b_max_packet_size0: 0x40, + id_vendor: VENDOR_ID, + id_product: PRODUCT_ID, + b_cd_device: 0x0101, + i_manufacturer: 0x01, + i_product: 0x02, + i_serial_number: 0x03, + b_num_configurations: 1, + } + } } impl AsRef<[u8]> for DeviceDescriptor { fn as_ref(&self) -> &[u8] {