Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinUSB
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
nalale
В качестве драйвера для 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 не получается. В чем ошибка?
Golikov A.
ну надо виндус научить что такое устройство - будет работать как 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
nalale
Я это читал все, но проблема в том, что Windows не видит VID и PID устройства. Поэтому и не может определить какой драйвер ставить на устройство. А если он не видит эти номера, значит не был обработан дескриптор устройства, что тоже странно, так как идентификационный номер устройству присвоился.
Golikov A.
Поглядите прослушкой USB что там происходит, возможно ошибки в каких-то полях и вас отвергают как устройствоsm.gif
nalale
Ошибку нашел. Почему то если в устройстве один 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                                 */
};
mcheb
Цитата(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
Спасибо за замечание) ошибку исправил, но и при обоих EndPoint в режиме Bulk (0x02), устройство не определяется.
misyachniy
Я уже давно забыл как писать дескрипторы :-)
Все устройства делаю с двумя bulk endpoint и библиотеку libusb(сейчас libusb0).
Для нового(для меня) процессора беру пример USB MASS STORAGE.
Обнуляю класс и подкласс устройства.
После этого запускаю утилиту от libusb, которая генерит inf файл.
После того как устройство появилось в менеджере устройств без замечаний, выкашиваю функции относящиеся к USB MASS STORAGE.
EmbedElektrik
Цитата(misyachniy @ Oct 25 2014, 23:23) *
Я уже давно забыл как писать дескрипторы :-)
Все устройства делаю с двумя bulk endpoint и библиотеку libusb(сейчас libusb0).
Для нового(для меня) процессора беру пример USB MASS STORAGE.
Обнуляю класс и подкласс устройства.
После этого запускаю утилиту от libusb, которая генерит inf файл.
После того как устройство появилось в менеджере устройств без замечаний, выкашиваю функции относящиеся к USB MASS STORAGE.

А можно попросить такой "выкошенный" пример? А то воюю уже неделю с stm32f407 - либюсб ошибки записи дает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.