Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
1

Дескриптор конфигурации для WinUSB

23.10.2014, 10:34. Показов 3748. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В качестве драйвера для USB устройства на МК пытаюсь использовать стандартный WinUSB. Для этой цели помимо стандартных USB-дескрипторов Microsoft требует от устройства специальных дескрипторов, для распознавания того что данное устройство работает с WinUSB - OS String Descriptor и OS Feature Descriptors.

Но, если в дескрипторе интерфейса указывать класс интерфейса (bInterfaceClass) 0xFF (определяется производителем, что и нужно в случае WinUSB), то после запроса дескриптора конфигурации устройство определяется как неизвестное и не подает признаков жизни, хотя, как я понимаю дальше должен следовать запрос о строковом дескрипторе OS String Descriptor.

Вот кусок дескриптора конфигурации, который описывает интерфейс, описание EndPoint опустил.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static uint8_t Usb_CDC_Configuration_Descriptor[USB_CDC_CONFIG_DESCR_LENGTH] =
{     
/* 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)               */
    0xFF, /* bInterfaceSubClass                            */
    0xFF, /* bInterfaceProtocol                           */
    0x00, /* iInterface                                     */   
....
....
Если описывать устройство как CDC то все работает хорошо, а вот с WinUsb не получается. В чем ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2014, 10:34
Ответы с готовыми решениями:

Дескриптор для usb микрофона
Генерирую код CubeMX usb audio device, но контроллер определяется как динамик, пытался подставлять...

Дескриптор конфигурации USB
Каким образом можно вывести в консоль дескриптор конфигурации USB с помощью с# и можно ли сделать...

Нужно получить дескриптор окна имея дескриптор контрола
Нужно получить дескриптор окна имея дескриптор контрола, подскажите как

WinUsb
Из MSDN. Подскажите, правильно ли я понимаю, что при подключении USB устройства к Windows вместе...

Установка winusb драйвера из приложения
Здравствуйте. Пишу приложение, работающее с программаторами подключенными по USB. Программа в...

12
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.10.2014, 08:40 2
дескриптор устройства покажи
Цитата Сообщение от Nalale Посмотреть сообщение
0x20, 0x00, * * * * */* wTotalLength * * * * * * * * * **/
размер 32 байта
Цитата Сообщение от Nalale Посмотреть сообщение
0x01, /* bNumEndpoints * * * * * * * * * * * * * * * * * */
1 точка
9+9+7= получается 25 байт
как так?
2
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 08:44  [ТС] 3
да, я вчера разобрался. я почемуто решил, что точки с адресом 0x01 и 0x81 (т.е IN и OUT) это одна точка)
спасибо за ответ
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 10:46  [ТС] 4
However, если в устройстве больше 1го EndPoint то устройство не определяется. Таким образом если в дескрипторе интерфейса в поле bNumEndpoint записать 2, определить два EndPoint, и соответственно увеличить размер дескриптора до 0x20 устройство не определяется.
В прикрипленном файле - скрин отчета работы порта. Странность для меня в том, что если судить по этому отчету, порт не посылает запросы на получение дескрипторов, в то время, как сам МК такие запросы ловит и дескрипторы отсылает. И еще под устройством написано Connection Status - Enumeration of Device failed, но в регистре МК присвоенный номер все-таки записался.

Дескриптор конфигурации для WinUSB


Это дескприторы с двумя EndPpoints

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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       */
};

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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                                 */
};
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.10.2014, 11:03 5
Цитата Сообщение от Nalale Посмотреть сообщение
0x00, * * * * * */* iManufacturer * * * * * **/
* * 0x00, * * * * * */* iProduct * * * * * * * * */
* * 0x00, * * * * * */* iSerialNumber * * * * * **/
ну и где ты хочешь чтобы хост спрашивал про строки
ты же сам указал что их нет

Добавлено через 1 минуту
Цитата Сообщение от Nalale Посмотреть сообщение
скрин отчета работы порта.
там нечего не понять
у тебя Лузер?
сохрани протокол обмена и файл приложи сюда
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 11:45  [ТС] 6
Т.е для того чтобы Windows запрашивал не строковый дескриптор с описанием например производителя, а специальный для идентификации устройства как WinUSBDevice нужно записать индекс этого OS String Descriptor в дескриптор устройства? зачем в этом случае тогда жесткое требование чтобы индекс этого дескриптора был 0xEE?
A device that supports Microsoft OS descriptors must contain an OS string descriptor, stored at string index 0xEE.
• It contains a signature field that differentiates the OS string descriptor from other strings that IHVs might choose to store at 0xEE.
Тогда я могу его записать этот дескриптор в поле iProduct например с индексом 0x03, и хост потребует этот дескриптор с индексом 0х03, а не 0xEE. Я то думал, что хост пошлет запрос GET_DESCRIPTOR с требованием передачи строки с индексом 0xEE независимо от того есть у меня описания производителя и прочего или нет.

Вот протокол обмена.
usb.rar
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.10.2014, 11:56 7
Цитата Сообщение от Nalale Посмотреть сообщение
Тогда я могу его записать этот дескриптор в поле iProduct например с индексом 0x03, и хост потребует этот дескриптор с индексом 0х03,
по моему так
это EE может нужно чтобы не писать свой inf файл, для установки драйвера
как то это мимо меня прошло

дай еще описание всех дескрипторов, чтобы я смог смоделировать ситуацию

Добавлено через 4 минуты
Цитата Сообщение от Nalale Посмотреть сообщение
Вот протокол обмена.
зачем ты его в html сконвертул?
не понятно что засылают что возвращают
запусти Лузер запусти захват подключи устройство потом останови захват
потом файл сохранить и должен сохранится файл с расширением ulz
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 12:09  [ТС] 8
Здесь 2 файла, один отчет когда один EndPoint, второй отчет когда два Endpoint.
MyDevice.rar

Дескрипторы в случае двух EndPoint

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define USB_CDC_DEVICE_DESCR_LENGTH   0x12
 
static uint8_t Usb_Device_Descriptor[USB_CDC_DEVICE_DESCR_LENGTH] =
{
    USB_CDC_DEVICE_DESCR_LENGTH,            /* 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       */
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define USB_CDC_CONFIG_DESCR_LENGTH   0x20
 
static uint8_t Usb_Configuration_Descriptor[USB_CDC_CONFIG_DESCR_LENGTH] =
{     
/* 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)                */
    0x02,       /* bmAttributes (Bulk)                       */
    MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize                 */
    0x00,       /* bInterval                                 */
};

И в случае одного EndPoint

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define USB_CDC_DEVICE_DESCR_LENGTH   0x12
 
static uint8_t Usb_Device_Descriptor[USB_CDC_DEVICE_DESCR_LENGTH] =
{
    USB_CDC_DEVICE_DESCR_LENGTH,            /* 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       */
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define USB_CDC_CONFIG_DESCR_LENGTH   0x19
 
static uint8_t Usb_Configuration_Descriptor[USB_CDC_CONFIG_DESCR_LENGTH] =
{     
/* Configuration Descriptor */
    0x09,                /* bLength                         */
    0x02,                /* bDescriptorType (Configuration) */
    0x19, 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                                     */   
        
        /* 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                                 */
};
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.10.2014, 12:14 9
Цитата Сообщение от Nalale Посмотреть сообщение
Здесь 2 файла, один отчет когда один EndPoint, второй отчет когда два Endpoint.
опять все не слава богу, у меня 32разрядная версия у тебя 64разрядная
жди когда доберусь до 64 битной машины
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 16:28  [ТС] 10
Хорошо, спасибо за участие))

Добавлено через 4 часа 0 минут
When a new device is attached to a computer for the first time, an operating system that supports Microsoft OS Descriptors will request the string descriptor that is at index 0xEE. The Microsoft OS String Descriptor contains an embedded signature field that the operating system uses to differentiate it from other strings that might be at index 0xEE.
The operating system queries for the string descriptor at index 0xEE during device enumeration--before the driver for the device has loaded--which might cause some devices to malfunction. Such devices are not supported by versions of the Windows operating system that support Microsoft OS Descriptors.
Все таки мне кажется указывать явно, что присутствует Microsoft OS String Descriptor не надо. Windows в любом случае должен отправить запрос на этот дескпритор, не зависимо есть он в устройстве или нет.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.10.2014, 18:14 11
Цитата Сообщение от Nalale Посмотреть сообщение
Все таки мне кажется указывать явно, что присутствует Microsoft OS String Descriptor не надо. Windows в любом случае должен отправить запрос на этот дескпритор, не зависимо есть он в устройстве или нет.
у меня есть несколько "коробочек" сделанные под "фирменную" программу
так вот раньше фирма ставила свой драйвер, а потом перешла на WinUSB
коробочки тем не менее продолжают работать
но запроса на строку EE я в них не вижу
поковыряюсь может что нибудь выясню
дай ссылку, откуда цитаты ставишь
это описание WinUSB?
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
24.10.2014, 18:48  [ТС] 12
ну да, это с MSDN все.
например вот.
0
3 / 3 / 1
Регистрация: 19.03.2013
Сообщений: 34
29.10.2014, 10:46  [ТС] 13
Вобщем все получилось. Если кому интересно будет, суть такова.
Про Windows Compatible ID Devices написано тут.
Подключаем устроство в котором написан OS_String_Descriptor. После чего запускем regedit.exe. Ищем HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\. Ищем раздел "VID+PID+BCD_RELEASE_NUMBER", смотрим занчение поля osvc. Если оно 00 хх, то раздел удаляем, и перезапускаем устройство. В этом случае устройству приходит запрос по передачи OS_String_Descriptor, и в разделе "VID+PID+BCD_RELEASE_NUMBER" значение osvc устнавливается в 01 хх, что и означает что OS_String_Descriptor успешно запрошен и получен.
1
29.10.2014, 10:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2014, 10:46
Помогаю со студенческими работами здесь

WinUSB не видит USB носителей
Не путать с WinToUSB. Подглядел на ремонтке https://remontka.pro/winusb-bootable-usb/ софтина...

USB Composite HID + WinUSB
Доброго времени суток! Не выходит объединить два примера из Microchip Solutions v2010-10-19, USB...

Использование драйвера winusb. Не удается корректно записать в драйвер
Решил воспользоваться стандартным WDF-драйвером Winusb.sys из WDK 7600. Все делал согласно...

Не получается найти WinUSB-устройство: SetupDiEnumDeviceInterfaces его не видит
Итак, есть WinUSB устройство (китайский телефон, на самом деле это COM-порты, и в линуксе можно...

[Решено]Низкая скорость USB при использовании WinUSB
Разбираюсь с USB в STM32F103. Сделал в контроллере 2 endpoint`a EP1_IN и EP2_OUT. В прерывании ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru