реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinUSB
nalale
сообщение Oct 23 2014, 07:56
Сообщение #1





Группа: Новичок
Сообщений: 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 не получается. В чем ошибка?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 23 2014, 08:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
nalale
сообщение Oct 23 2014, 08:51
Сообщение #3





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



Я это читал все, но проблема в том, что Windows не видит VID и PID устройства. Поэтому и не может определить какой драйвер ставить на устройство. А если он не видит эти номера, значит не был обработан дескриптор устройства, что тоже странно, так как идентификационный номер устройству присвоился.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 23 2014, 09:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Поглядите прослушкой USB что там происходит, возможно ошибки в каких-то полях и вас отвергают как устройствоsm.gif
Go to the top of the page
 
+Quote Post
nalale
сообщение Oct 24 2014, 06:39
Сообщение #5





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
mcheb
сообщение Oct 24 2014, 06:54
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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 поставить?
Go to the top of the page
 
+Quote Post
nalale
сообщение Oct 24 2014, 07:05
Сообщение #7





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



Спасибо за замечание) ошибку исправил, но и при обоих EndPoint в режиме Bulk (0x02), устройство не определяется.
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Oct 25 2014, 20:23
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Я уже давно забыл как писать дескрипторы :-)
Все устройства делаю с двумя bulk endpoint и библиотеку libusb(сейчас libusb0).
Для нового(для меня) процессора беру пример USB MASS STORAGE.
Обнуляю класс и подкласс устройства.
После этого запускаю утилиту от libusb, которая генерит inf файл.
После того как устройство появилось в менеджере устройств без замечаний, выкашиваю функции относящиеся к USB MASS STORAGE.
Go to the top of the page
 
+Quote Post
EmbedElektrik
сообщение Jun 17 2015, 16:37
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 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 - либюсб ошибки записи дает.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 02:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016