我正在尝试设置一个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中这样做?我能正确理解这篇文章吗?
任何帮助都会被批准。
答案 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提供的文档更清晰。