Но, если в дескрипторе интерфейса указывать класс интерфейса (bInterfaceClass) 0xFF (определяется производителем, что и нужно в случае WinUSB), то после запроса дескриптора конфигурации устройство определяется как неизвестное и не подает признаков жизни, хотя, как я понимаю дальше должен следовать запрос о строковом дескрипторе OS String Descriptor.
Т.е последовательность запросов такая -
1 - GET_DESCRIPTOR(device)
2 - SET_ADDRESS
3 - GET_DESCRIPTOR(device)
4 - GET_DESCRIPTOR(configuration)
Дескриптор Устройства -
Код
static uint8_t Usb_Device_Descriptor[0x12] =
{
0x12, /* bLength */
0x01, /* bDescriptorType (Device) */
0x00, 0x02, /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
MAX_PACKET_SIZE, /* bMaxPacketSize0 */
0xc4, 0x10, /* idVendor */
0x47, 0x88, /* idProduct */
0x00, 0x01, /* bcdDevice */
0x00, /* iManufacturer */
0x00, /* iProduct */
0x00, /* iSerialNumber */
0x01 /* bNumConfigurations */
};
{
0x12, /* bLength */
0x01, /* bDescriptorType (Device) */
0x00, 0x02, /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
MAX_PACKET_SIZE, /* bMaxPacketSize0 */
0xc4, 0x10, /* idVendor */
0x47, 0x88, /* idProduct */
0x00, 0x01, /* bcdDevice */
0x00, /* iManufacturer */
0x00, /* iProduct */
0x00, /* iSerialNumber */
0x01 /* bNumConfigurations */
};
Вот кусок дескриптора конфигурации, который описывает интерфейс, описание EndPoint опустил.
Код
static uint8_t Usb_Configuration_Descriptor[0x20] =
{
/* Configuration Descriptor */
0x09, /* bLength */
0x02, /* bDescriptorType (Configuration) */
0x20, 0x00, /* wTotalLength */
0x01, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
USB_POWER_ATTIBUTES,, /* bmAttributes */
0x32, /* bMaxPower (100 mA) */
/* Interface Descriptor */
0x09, /* bLength */
0x04, /* bDescriptorType (Interface) */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0xFF, /* bInterfaceClass (Vendor) */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x00, /* iInterface */
....
....
{
/* Configuration Descriptor */
0x09, /* bLength */
0x02, /* bDescriptorType (Configuration) */
0x20, 0x00, /* wTotalLength */
0x01, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
USB_POWER_ATTIBUTES,, /* bmAttributes */
0x32, /* bMaxPower (100 mA) */
/* Interface Descriptor */
0x09, /* bLength */
0x04, /* bDescriptorType (Interface) */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0xFF, /* bInterfaceClass (Vendor) */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x00, /* iInterface */
....
....
Если описывать устройство как CDC то все работает хорошо, а вот с WinUsb не получается. В чем ошибка?