概述
对于Windows系统环境而言,要实现一个完整的USB设备功能,通常需要“嵌入式USB设备和对应的USB驱动”,以实现Windows应用与USB设备的交互。因此在涉及USB的嵌入式设备开发工作中,可能对应的USB驱动还没有完整实现,或者还未开发,或者驱动开发工作是另外的部门/公司去完成的。这种情况下,我们需要对嵌入式的USB设备进行自测验证,就需要一个USB通用的测试工具以及对应的万能通用驱动来实现。以下将介绍一种USB设备万能通用测试工具及通用驱动生成方法。
目的
为何需要这样一个通用的测试工具,总结主要有以下几种情况:
- USB设备是A公司/部门开发的,USB驱动是B公司/部门开发的,两者合作并行开发。A公司/部门USB设备开发,需要USB驱动来配合验证调试通信协议,但此时B公司驱动端还未完成,A公司/部门的调试验证工作被阻塞。
- USB设备是A公司/部门开发的,USB驱动是B公司/部门开发的。两者开发完成进行联调,发现有问题,相互甩锅,A公司/部门认为驱动端有问题,B公司/部门认为设备端有问题,两者僵持,问题定位困难。
- 应客户要求,配合客户协议使用端点0的供应商请求类型传输一些简单指令。
因此,对于USB设备开发方来说,需要一套通用的测试工具和一个通用的驱动来模拟验证通信协议,或者澄清相关问题。
测试工具
工具路径
MDK官方提供了一个USB测试工具WinUSB_Test,这工具是公开源码的,同时也直接提供了编译好的exe文件。安装了MDK软件及开发包(如STM32F4)后安装目录下应该就有了,所在目录参考下图:
工具界面
工具的界面主要分为三部分
- 需要填入正确的GUID,以选择USB设备。选择设备之后,才能跟对应的设备进行数据传输。
- 对USB设备的控制断点0进行控制传输。
- 一个USB设备可能存在多个接口,选择对应的接口对IN/OUT断点进行数据传输。
关键问题
要想使用这个软件测试USB设备,一个关键问题在于获得USB设备的GUID,而这个GUID特指的是DeviceInterfaceGUIDs,这个ID通常在驱动的inf文件中进行指定,暂不知其它查询方法。
如STM32F4 官方Pack提供的,winusb_test配套的inf驱动文件,里面有标识DeviceInterfaceGUIDs:
万能驱动生成
如果USB设备驱动是客户的,或者在inf文件中没有指定该DeviceInterfaceGUIDs,那我们则可以自己生成一个通用的万能驱动,以便我们测试。
驱动生成工具zadig
zadig是一款开源的winusb通用驱动生成工具,官网介绍,在以下几种情况下它特别适用:
- 如果你想使用一个libusb-based的应用访问一个USB设备
- 如果你想升级一个通用的驱动
- 如果你想使用WinUSB访问一个USB设备
实例演示
下面,我以常用的CP2102 USB转串口这个设备来介绍生成万能通用驱动以及使用WinUSB_Test软件进行测试的方法。
安装原始驱动
这个原始驱动不需要可以正常工作,它的目的是枚举出USB设备的所有接口及端点,以便让zadig软件可以根据其完整描述符为其生成驱动。
可以使用usbview软件查看该USB设备的接口及端点信息。
可以看到该USB转串口设备只有一个接口,接口下有两个BULK端点分别对应IN/OUT,我们目的要使用WinUSB_Test工具对这两个端点进行发送接收测试。
Zadig生成通用驱动
- 打开软件,先List All Device
- 要想指定生成驱动文件的路径,则需要打开Advance Mode,然后会在Extract Files后面出现选择生成路径的按钮
获得设备的GUID
从生成的通用驱动inf中,我们可以找到DeviceInterfaceGUIDs
可以发现,它DeviceInterfaceGUIDs使用的就是DeviceGUID,文件中找到DeviceGUID的具体值既可
安装生成的通用驱动
卸载原有驱动,并选择删除此设备的驱动程序
安装新生成的驱动
使用WinUSB_Test软件进行测试
打开软件,填入前面获得GUID,既可出现对应的USB设备
然后开启对应的接口和端口,既可进行数据收发测试了
小结与不足
本文介绍了一种使用通用工具和驱动,对嵌入式USB设备进行端点通信测试的方法,它可以很方便的用于USB设备开发的自测验证。但WinUSB_Test软件的功能较为简洁,因此如果要进行一些较为复杂的压力测试,目前的软件可能还无法达到要求。好在该软件开放了源码,未来可以根据需求,基于此软件开发更多功能,我想这工作量不会太大。
评论区