On 1. Oct 2022, at 00:21, Christian Kohlschütter <christ...@kohlschutter.com> wrote: > >>> See >>> https://github.com/hathach/tinyusb/blob/master/examples/device/cdc_msc/src/usb_descriptors.c >>> for an example of such a device. It has one mass storage device and one >>> CDC. >>> Changing the device class to 0x00 breaks support on Linux and macOS (I >>> didn't try Windows). >> >> The question is -- does the aforementioned device conform to the USB-IF >> specification ? I think it does not, but luckily it could be fixed in >> software on the tinyusb side. > > I'm not familiar enough with the available USB specs to say what is "right" > but I think the problem is that "fixing" it by changing the device class > breaks support on major operating systems.
OK, looking through the tinyUSB example source code [1] and USB docs [2], it looks like the reason why changing the device class from 0xEF (misc) to 0x00 is that the combination deviceClass:0xEF + deviceSubClass:0x02 + deviceProtocol:0x01 indicates the presence of an "Interface Association Descriptor": // Use Interface Association Descriptor (IAD) for CDC // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) .bDeviceClass = TUSB_CLASS_MISC, .bDeviceSubClass = MISC_SUBCLASS_COMMON, .bDeviceProtocol = MISC_PROTOCOL_IAD, So yeah, it looks like it has to be like that. [1] https://github.com/hathach/tinyusb/blob/master/examples/device/cdc_msc/src/usb_descriptors.c [2] https://www.usb.org/defined-class-codes