USB设备描述符中的idVendor、idProduct和bcdDevice
2022-05-13
7573
32
USB设备描述符总其18字节,其中有三个比较重要的成员,分别为idVendor、idProduct和bcdDevice。
其实从字节意思来看:
- idVendor:代表着设备的生产商ID,由USB设备生产商向USB-IF官方来统一管理和申请。
- idProduct:代表着该生产商生产的产品编号,同一厂商下的不同idProduct代表着该公司不同的产品系列。
- bcdDevice:是一个BCD编码格式,代表着设备的出产编号,或者同一产品的版本更新迭代。
在设备管理器中还有一个字符串序列iSerialNumber,代表着该产品的出厂序列编号。
从设备描述符字段的idVendor、idProduct和bcdDevice字段解释来看,这三个成员代表着惟一的设备型号,在Windows中,使用idVendor、idProduct和bcdDevice组合成的字符串用来标识该设备,即硬件ID。我们可以通过在Widows设备管理器查看设备的硬件ID来查看设备信息。如本人电脑中的一个USB鼠标,我们在设备管理器中以“按连接列出设备”查看该设备树。
我们可以通过右键查看设备属性,在详细信息中选择硬件ID来看。
可以看到,该设备的硬件ID(只取第一个)分别为:
- USB\VID_093A&PID_2510&REV_0100
- HID\VID_093A&PID_2510&REV_0100
前面不USB或者HID代表着设备的类别,再加上后面由VID,PID和REV组成的字符串生成了设备的硬件ID.
这里的REV就是bcdDevice。
在查看REACTOS的usbccgp.sys源代码的时候,我们也可以看到该硬件ID的生成方式。
Index = swprintf(Buffer, L"USB\\VID_%04X&PID_%04X&REV_%04X",
FDODeviceExtension->DeviceDescriptor->idProduct,
FDODeviceExtension->DeviceDescriptor->bcdDevice) + 1;
Index += swprintf(&Buffer[Index], L"USB\\VID_%04X&PID_%04X",
FDODeviceExtension->DeviceDescriptor->idProduct) + 1;
由idVendor、idProduct和bcdDevice生成的硬件ID相对来说比较重要,我们在开发USB设备时候,一般就是通过这个硬件ID来进行设备的驱动更新的。设备驱动中支持的硬件ID在INF文件中指定,如:
[Strings]
DeviceID = "VID_1908&PID_2070"
[libusbDevice_WinUSB.NTx86]
%DeviceName% = USB_Install, USB\%DeviceID%
[libusbDevice_WinUSB.NTamd64]
%DeviceName% = USB_Install, USB\%DeviceID%
[libusbDevice_WinUSB.NTarm]
%DeviceName% = USB_Install, USB\%DeviceID%
可根据需要,自行加入是否需要版本信息。
在windows体统的注册表中,系统中所有枚举出的USB设备可通过注册表路径:
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
来查看。
当然,如果我们是USB设备的固件开发商,可以直接通过修改设备描述符数组中相应的字段即可。
相关文章:
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936