雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

USB设备通用测试工具和万能驱动

2024-06-21 47

概述

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

工具界面

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

  1. 需要填入正确的GUID,以选择USB设备。选择设备之后,才能跟对应的设备进行数据传输。
  2. 对USB设备的控制断点0进行控制传输。
  3. 一个USB设备可能存在多个接口,选择对应的接口对IN/OUT断点进行数据传输。
    image-1680223352891

关键问题

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

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

万能驱动生成

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

驱动生成工具zadig

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

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

实例演示

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

安装原始驱动

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

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

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

Zadig生成通用驱动

  • 打开软件,先List All Device
    image-1680228087484
  • 要想指定生成驱动文件的路径,则需要打开Advance Mode,然后会在Extract Files后面出现选择生成路径的按钮
    image-1680228102649
    image-1680228108131

获得设备的GUID

从生成的通用驱动inf中,我们可以找到DeviceInterfaceGUIDs
image-1680228125753
image-1680228131913
可以发现,它DeviceInterfaceGUIDs使用的就是DeviceGUID,文件中找到DeviceGUID的具体值既可
image-1680228144744

安装生成的通用驱动

卸载原有驱动,并选择删除此设备的驱动程序
image-1680228157990
image-1680228176870

安装新生成的驱动

image-1680228217903

使用WinUSB_Test软件进行测试

打开软件,填入前面获得GUID,既可出现对应的USB设备
image-1680228233437
然后开启对应的接口和端口,既可进行数据收发测试了
image-1680228245649

小结与不足

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

更新于:5个月前
赞一波!

文章评论

评论问答