在设备固件中支持WinUSB

时间:2013-07-16 00:15:09

标签: c windows winusb

我正在尝试设置一个USB设备,以便在连接到Windows 8计算机时自动使用WinUSB作为驱动程序,如here所述。

它说:

  

为了让USB驱动程序堆栈知道设备支持扩展功能描述符,设备必须定义一个OS字符串描述符,该描述符存储在字符串索引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中这样做?我能正确理解这篇文章吗?

任何帮助都会被批准。

1 个答案:

答案 0 :(得分:4)

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

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

如果您的设备使用正确的操作系统功能描述符进行响应,则会发生魔术。人们通常想要的魔力是他们的设备使用winusb驱动程序而不提供.inf文件。

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

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