Поддержка WinUSB в прошивке устройства

Я пытаюсь настроить USB-устройство для автоматического использования WinUSB в качестве драйвера при подключении к компьютеру с Windows 8, как описано здесь.

В нем говорится:

Чтобы стек драйвера USB знал, что устройство поддерживает дескрипторы расширенных функций, устройство должно определить строковый дескриптор ОС, который хранится в строковом индексе 0xEE.

Я понимаю, что мне нужно создать структуру, содержащую дескриптор, в ячейке памяти 0xEE. Как бы я сделал это в C?

Вот что я пробовал:

// The struct definition
typedef struct {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t qwSignature[14];
    uint8_t bMS_VendorCode;
    uint8_t bPad;
} usb_os_str_desc_t;

// Create a pointer to a struct located at 0xEE
volatile usb_os_str_desc_t* const extended_feature_support = (usb_os_str_desc_t*) 0xEE;

// Create a new struct at the location specified in "extended_feature_support"
(*extended_feature_support) = {
    .bLength = 0x12,
    .bDescriptorType = 0x03,
    .qwSignature = "MSFT100",
    .bMS_VendorCode = 0x04,
    .bPad = 0x00
};

Но компилятору это не нравится, он жалуется, что определение данных не имеет типа. Есть ли способ сделать это в C? Я правильно понял статью?

Любая помощь будет оценена.


person Jeremy Sigrist    schedule 16.07.2013    source источник


Ответы (1)


Это совсем не то, что говорится. Вы должны отвечать на запросы USB, а не размещать структуры в определенных местах памяти встроенной системы.

Windows, увидев VID:PID:Serial в первый раз, запросит дескриптор строки ОС с индексом 0xee. Устройство должно ответить пакетом данных, соответствующим показанному формату структуры. Если все в возвращенном дескрипторе верно (ваш пример выглядит хорошо), Windows выдаст запрос поставщика устройства с bReq, ​​установленным на то, что вы указали в ответе строкового дескриптора как MS_VendorCode (0x04 в вашем примере).

Если ваше устройство отвечает правильным дескриптором функций ОС, происходит волшебство. Волшебство, которого обычно хотят люди, заключается в том, чтобы их устройство использовало драйвер winusb без предоставления файла .inf.

Обратите внимание, что этот запрос выполняется только один раз. Если вы разрабатываете устройство, вы обычно хотите делать это много-много раз. Для этого вы должны удалить устройство из диспетчера устройств, а затем в regedit найти свой VIDPIDRELEASE в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags и удалить его. Теперь, когда вы снова подключите свое устройство, оно снова выполнит этот запрос строкового дескриптора ОС.

См. https://github.com/pbatard/libwdi/wiki/WCID-Devices для получения дополнительной информации, это намного понятнее, чем документы, предоставленные MS.

person akohlsmith    schedule 16.01.2014
comment
Эта ссылка на github выглядит так, как я искал. Спасибо! - person Jeremy Sigrist; 17.01.2014