|
WinUSB |
|
|
|
Oct 23 2014, 07:56
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-14
Из: Санкт-Петербург
Пользователь №: 83 306

|
В качестве драйвера для USB устройства на МК пытаюсь использовать стандартный WinUSB. Для этой цели помимо стандартных USB-дескрипторов Microsoft требует от устройства специальных дескрипторов, для распознавания того что данное устройство работает с WinUSB - OS String Descriptor и OS Feature Descriptors. Но, если в дескрипторе интерфейса указывать класс интерфейса (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 */ }; Вот кусок дескриптора конфигурации, который описывает интерфейс, описание 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 */ .... .... Если описывать устройство как CDC то все работает хорошо, а вот с WinUsb не получается. В чем ошибка?
|
|
|
|
|
 |
Ответов
|
Oct 24 2014, 06:39
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-14
Из: Санкт-Петербург
Пользователь №: 83 306

|
Ошибку нашел. Почему то если в устройстве один EndPoint, то все работает хорошо, а если больше 1го то устройство не определяется. И мне казалось что EndPoint'ы с адресами 0x01 и 0x81 (т.е IN и OUT) - это одна точка. Таким образом если в дескрипторе интерфейса в поле bNumEndpoint записать 1, и оставить оконечную точку либо IN либо OUT, то все работает. Но мне остается непонятным почему при большем количестве EndPoints не работает. В прикрипленном файле - скрин отчета работы порта. Странность для меня в том, что если судить по этому отчету, порт не посылает запросы на получение дескрипторов, в то время, как сам МК такие запросы ловит и дескрипторы отсылает. И еще под устройством написано Connection Status - Enumeration of Device failed, но в регистре МК присвоенный номер все-таки записался.
Это дескприторы с двумя EndPpoints Код static uint8_t Usb_Device_Descriptor[0x12] = { 0x12, /* bLength */ 0x01, /* bDescriptorType (Device) */ 0x00, 0x02, /* bcdUSB */ 0xFF, /* bDeviceClass (CDC) */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ MAX_PACKET_SIZE, /* bMaxPacketSize0 */ 0xc4, 0x55, /* idVendor */ 0x47, 0x88, /* idProduct */ 0x00, 0x02, /* bcdDevice */ 0x00, /* iManufacturer */ 0x00, /* iProduct */ 0x00, /* iSerialNumber */ 0x01 /* bNumConfigurations */ }; Код 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 */ 0x02, /* bNumEndpoints */ 0xFF, /* bInterfaceClass (Vendor) */ 0x00, /* bInterfaceSubClass */ 0x00, /* bInterfaceProtocol */ 0x00, /* iInterface */ /* Endpoint 1 Descriptor */ 0x07, /* bLength (Endpoint Descriptor size) */ 0x05, /* bDescriptorType (Endpoint) */ 0x01, /* bEndpointAddress (IN | 1) */ 0x02, /* bmAttributes (Bulk) */ MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize */ 0x00, /* bInterval */ /* Endpoint 2 Descriptor */ 0x07, /* bLength (Endpoint Descriptor size) */ 0x05, /* bDescriptorType (Endpoint) */ 0x82, /* bEndpointAddress (OUT | 2) */ 0x01, /* bmAttributes (Bulk) */ MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize */ 0x00, /* bInterval */ };
Сообщение отредактировал nalale - Oct 24 2014, 06:41
|
|
|
|
|
Oct 24 2014, 06:54
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

|
Цитата(nalale @ Oct 24 2014, 10:39)  Ошибку нашел. /* Endpoint 2 Descriptor */ 0x07, /* bLength (Endpoint Descriptor size) */ 0x05, /* bDescriptorType (Endpoint) */ 0x82, /* bEndpointAddress (OUT | 2) */ 0x01, /* bmAttributes (Bulk) */ MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize */ 0x00, /* bInterval */ };[/code] 0x01, /* bmAttributes (Bulk) */ 01 = Isochronous , поэтому один Endpoint и работает. Может 10 = Bulk 11 = Interrupt поставить?
|
|
|
|
Сообщений в этой теме
nalale WinUSB Oct 23 2014, 07:56 Golikov A. ну надо виндус научить что такое устройство - буде... Oct 23 2014, 08:13 nalale Я это читал все, но проблема в том, что Windows не... Oct 23 2014, 08:51 Golikov A. Поглядите прослушкой USB что там происходит, возмо... Oct 23 2014, 09:39 nalale Спасибо за замечание) ошибку исправил, но и при об... Oct 24 2014, 07:05 misyachniy Я уже давно забыл как писать дескрипторы :-)
Все у... Oct 25 2014, 20:23  EmbedElektrik Цитата(misyachniy @ Oct 25 2014, 23:23) Я... Jun 17 2015, 16:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|