|
|
  |
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 23 2014, 08:13
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
ну надо виндус научить что такое устройство - будет работать как WinUSB Plug in your device to the host system. Open Device Manager and locate the device. Right-click the device and select Update driver software... from the context menu. In the wizard, select Browse my computer for driver software. Select Let me pick from a list of device drivers on my computer. From the list of device classes, select Universal Serial Bus devices. The wizard displays WinUsb Device. Select it to load the driver. так же можно сделать чтобы оно автоматически попадало на этот драйвер, если ему задать тип устройства WinUSB http://msdn.microsoft.com/ru-ru/library/ff...3(v=vs.85).aspx
|
|
|
|
|
Oct 23 2014, 08:51
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-14
Из: Санкт-Петербург
Пользователь №: 83 306

|
Я это читал все, но проблема в том, что Windows не видит VID и PID устройства. Поэтому и не может определить какой драйвер ставить на устройство. А если он не видит эти номера, значит не был обработан дескриптор устройства, что тоже странно, так как идентификационный номер устройству присвоился.
|
|
|
|
|
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 поставить?
|
|
|
|
|
Oct 24 2014, 07:05
|
Группа: Новичок
Сообщений: 4
Регистрация: 23-10-14
Из: Санкт-Петербург
Пользователь №: 83 306

|
Спасибо за замечание) ошибку исправил, но и при обоих EndPoint в режиме Bulk (0x02), устройство не определяется.
|
|
|
|
|
Jun 17 2015, 16:37
|

Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321

|
Цитата(misyachniy @ Oct 25 2014, 23:23)  Я уже давно забыл как писать дескрипторы :-) Все устройства делаю с двумя bulk endpoint и библиотеку libusb(сейчас libusb0). Для нового(для меня) процессора беру пример USB MASS STORAGE. Обнуляю класс и подкласс устройства. После этого запускаю утилиту от libusb, которая генерит inf файл. После того как устройство появилось в менеджере устройств без замечаний, выкашиваю функции относящиеся к USB MASS STORAGE. А можно попросить такой "выкошенный" пример? А то воюю уже неделю с stm32f407 - либюсб ошибки записи дает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|