2.2.2.3.6 Microsoft OS Descriptor Support
Microsoft provides a set of proprietary device classes and USB descriptors, which are called Microsoft OS Descriptors (MODs).
The MPLAB Harmony USB Device Library allows the application to support the Microsoft OS Descriptors requests. To enable Microsoft OS Descriptors, follow below procedure.
- Navigate to the USB Device Layer
Configuration options
through theMCC Project graph
and enable following check boxes.- Enable Advanced String Descriptor Table.
- Enable Microsoft OS Descriptor Support.
- Type in a Vendor code in the "Vendor Code" check box and generate the code.
- Add Extended Compat ID Feature Descriptor in the application. The following is a
sample Extended Compat ID Feature
Descriptor.
/* Extended Compat ID Feature Descriptor */ const uint8_t microsoftExtendedCompatIdDescriptor[] = { 0x28, 0x00, 0x00, 0x00, /* dwLength Length of this descriptor */ 0x00, 0x01, /* bcdVersion = Version 1.0 */ 0x04, 0x00, /* wIndex = 0x0004 */ 0x01, /* bCount = 1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Reserved */ 0x00, /* Interface number = 0 */ 0x01, /* Reserved */ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* compatibleID */ //WINUSB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* Reserved */ };
- The following code example shows how to respond to Extended Compat ID Feature
Descriptor request from the Host. This code can be added to USB Device Event
Handler.
case USB_DEVICE_EVENT_CONTROL_TRANSFER_SETUP_REQUEST: { uint16_t length = 0; USB_SETUP_PACKET *setupPacket = (USB_SETUP_PACKET *)pData; if(setupPacket->bRequest == USB_DEVICE_MICROSOFT_OS_DESCRIPTOR_VENDOR_CODE) { if ((setupPacket->bmRequestType == 0xC0) && (setupPacket->W_Index.Val == 0x0004)) { length = setupPacket->wLength; if (length > sizeof(microsoftExtendedCompatIdDescriptor)) { length = sizeof(microsoftExtendedCompatIdDescriptor); } USB_DEVICE_ControlSend(appData.usbDevHandle, (uint8_t*)µsoftExtendedCompatIdDescriptor, length); } else { USB_DEVICE_ControlStatus(appData.usbDevHandle, USB_DEVICE_CONTROL_STATUS_ERROR); } } else { USB_DEVICE_ControlStatus(appData.usbDevHandle, USB_DEVICE_CONTROL_STATUS_ERROR); } break; }