同样的soc板子用的同一个USB驱动设备名称,厂商和产品ID都一样,使用什么方法来区别?
今天在本站USB中文网 http://www.usbzh.com 的技术交流群中有位同学提问:
- 各位老铁,我们自己的soc板子用的usb一个驱动,那么usb设备名称,厂商和产品ID就一样了,这个是没有方法来区别下
- 比如一个PC同时插入我们的3块USB
对于这个问题,就是典型的多个相同的板板接入电脑中,并且由于硬件的设备信息一致,会导致在设备管理器中出现多个相同的设备。
对于与此相关联的问题记得自己当时写了一篇关于HID的相关文章,详见:
HID 枚举系统中所有HID设备信息代码示例:http://www.usbzh.com/article/detail-111.html
从文章至少是HID设备来看,这种情况至少在Windows下是存在的。通过HID的示例代码来看,对于同一种设备类型,系统会对这种设备类型注册相同的设备接口GUID,这个系统会根据这个接口GUID来创建一个设备链接名。
这里我们区分一下Windows USB设备ID或者说名称的几个概念:
从上面来看,这里比较关键的就是实例ID,这个在Windows驱动中会通过IRP_MN_QUERY_ID的BusQueryInstanceID来获取。详见:windows加载即插即用PNP设备的过程 http://www.pnpon.com/article/detail-160.html
设备的链接名其实就是这些设备的相关信息的组合,成一个比较长的名字,具体可详见设备链接名:
本对于本人的计算机中关于USB鼠标的HID设备根设备:
我们分别查看设备的属信息:
我们再通过Winobj查看其对位的链接名:
再通过设备管理器查看设备的
从上图可以看到,设备链接名包括:
- 设备的总线类型:USB
- 设备的硬件ID:VID,PID
- 设备的类型 :GUID_DEVINTERFACE_USB_DEVICE {A5DCBF10-6530-11D2-901F-00C04FB951ED}
- 设备的实例名:这部分与设备的位置和第几个同类型设备枚举有关。
以上的这些信息在Windows应用层都是可以通过SetupApi函数来获取,而在内核中是可以通过 Windows驱动中获取设备PDO的属性信息http://www.usbzh.com/article/detail-546.html 可以获得。
其实在早些的时候,记得大概第一次做windows驱动时,记得同事是在板卡上设备一个拨码开关,通过读取这个拨码开组合不同的值来确定是那个设备。但这是一个风险,就是如果相同的板卡拨码开关置相同的值时,又会有问题的。