USB设备万能通用测试工具及使用方法

概述

对于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)后安装目录下应该就有了,所在目录参考下图:

QQ截图20211024115419

工具界面

工具的界面主要分为三部分

第1部分:需要填入正确的GUID,以选择USB设备。选择设备之后,才能跟对应的设备进行数据传输。

第2部分:对USB设备的控制断点0进行控制传输。

第3部分:一个USB设备可能存在多个接口,选择对应的接口对IN/OUT断点进行数据传输。

软件界面

关键问题

要想使用这个软件测试USB设备,一个关键问题在于获得USB设备的GUID,而这个GUID特指的是DeviceInterfaceGUIDs,这个ID通常在驱动的inf文件中进行指定,暂不知其它查询方法。

如STM32F4 官方Pack提供的,winusb_test配套的inf驱动文件,里面有标识DeviceInterfaceGUIDs

驱动inf文件

guid在inf文件中位置

万能驱动生成

如果USB设备驱动是客户的,或者在inf文件中没有指定该DeviceInterfaceGUIDs,那我们则可以自己生成一个通用的万能驱动,以便我们测试。

驱动生成工具

zadig是一款开源的winusb通用驱动生成工具,官网介绍,在以下几种情况下它特别适用:

  • 如果你想使用一个libusb-based的应用访问一个USB设备
  • 如果你想升级一个通用的驱动
  • 如果你想使用WinUSB访问一个USB设备

实例演示

下面,我以常用的CP2102 USB转串口这个设备来介绍生成万能通用驱动以及使用WinUSB_Test软件进行测试的方法。

安装原始驱动

原始驱动

这个原始驱动不需要可以正常工作,它的目的是枚举出USB设备的所有接口及端点,以便让zadig软件可以根据其完整描述符为其生成驱动。

可以使用usbview软件查看该USB设备的接口及端点信息。

USB接口端点信息

可以看到该USB转串口设备只有一个接口,接口下有两个BULK端点分别对应IN/OUT,我们目的要使用WinUSB_Test工具对这两个端点进行发送接收测试。

Zadig生成通用驱动
  • 打开软件,先List All Device

List All Devices

  • 按下图步骤选择设备、WinUSB驱动、以及生成方式(Extract Files)。

    表示只为该设备生成驱动,而不直接安装驱动,待会我们自己手动安装驱动既可。

zadig生成驱动

  • 要想指定生成驱动文件的路径,则需要打开Advance Mode,然后会在Extract Files后面出现选择生成路径的按钮

Advanced Mode

选择驱动生产路径

获得设备的GUID

从生成的通用驱动inf中,我们可以找到DeviceInterfaceGUIDs

生成的inf文件

接口ID1

可以发现,它DeviceInterfaceGUIDs使用的就是DeviceGUID,文件中找到DeviceGUID的具体值既可

设备ID

安装生成的通用驱动
  • 卸载原有驱动,并选择删除此设备的驱动程序

    卸载原驱动

    删除设备驱动

  • 安装新生成的驱动

    安装新驱动

使用WinUSB_Test软件进行测试
  • 打开软件,填入前面获得GUID,既可出现对应的USB设备

填入GUID

  • 然后开启对应的接口和端口,既可进行数据收发测试了

端点发送接收

小结与不足

本文介绍了一种使用通用工具和驱动,对嵌入式USB设备进行端点通信测试的方法,它可以很方便的用于USB设备开发的自测验证。但WinUSB_Test软件的功能较为简洁,因此如果要进行一些较为复杂的压力测试,目前的软件可能还无法达到要求。好在该软件开放了源码,未来可以根据需求,基于此软件开发更多功能,我想这工作量不会太大。

资料获取

本文中涉及的资料,请关注ETRD公众号,回复 USBTEST 关键字进行获取。

资料包括:

  • WinUSB_Test 的源码及EXE文件
  • Zadig-2.6软件
  • usbview软件
  • Zadig生成的CP2102通用驱动

ETRD