2013-07-16 43 views
4

我试图设置USB设备,以便在连接到Windows 8机器时自动使用WinUSB作为驱动程序,如概述here在设备固件中支持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中做到这一点?我是否正确理解文章?

任何帮助将被apprciated。

回答

3

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

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

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

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

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

+0

这github链接看起来像我之后。谢谢! –