10

我正在尝试将 USB 设备设置为在连接到 Windows 8 机器时自动使用 WinUSB 作为驱动程序,如此处所述

它说:

为了让 USB 驱动程序堆栈知道设备支持扩展功能描述符,设备必须定义存储在字符串索引 0xEE 处的 OS 字符串描述符。

我的意思是我需要在内存位置 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中做到这一点?我是否正确理解了这篇文章?

任何帮助将不胜感激。

4

1 回答 1

9

这根本不是它所说的。您必须响应 USB 请求,而不是将结构放置在嵌入式系统内存的特定位置。

Windows 将在第一次看到 VID:PID:Serial 时请求索引 0xee 处的 OS 字符串描述符。设备必须以与您显示的结构格式匹配的数据包进行响应。如果返回的描述符中的所有内容都是正确的(您的示例看起来不错),Windows 将发出一个设备供应商请求,其中 bReq 设置为您在字符串描述符响应中提供的内容,即 MS_VendorCode(在您的示例中为 0x04)。

如果您的设备使用正确的操作系统功能描述符做出响应,那么奇迹就会发生。人们通常想要的魔法是让他们的设备在不提供 .inf 文件的情况下使用 winusb 驱动程序。

请注意,此请求仅发生一次。如果您正在开发一种设备,您通常需要多次执行此操作。为此,您必须从设备管理器中卸载设备,然后在 regedit 中查找您的 VIDPIDRELEASEHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags并将其删除。现在,当您再次插入设备时,它将再次执行此 OS 字符串描述符请求。

有关更多信息,请参阅https://github.com/pbatard/libwdi/wiki/WCID-Devices,它比 MS 提供的文档要清晰得多。

于 2014-01-16T19:59:16.130 回答