216 计算机高级接口实践
表。实验台可以显示发送和接收的有效数据字节数。
==========USB接口传输控制实验========== 寄存器 R1:00000000 = 00H R2:00000000 = 00H 时钟 00 年 01 月 01 日 00 点 00 分 00 秒 R3 R4 R5 R6 R7 R8 时钟自动回传:关闭 USB:控制模式 传输计数:收0000 发0000 中断 打开 计数 结束 进入 回传 清零 实验 图8-7 高级接口实验台HID实验界面
USBView是Microsoft提供的一个简单的USB测试软件,该工具软件是一个完全的绿色软件,只有一个EXE程序文将件,不需要安装,在Windows环境下直接运行。
USBView其主要功能是获得USB设备的各个描述符。
可以运行USBView获得实验台仿真的HID设备的描述符,运行USBView后显示以下程序界面。
图8-8 USBView运行界面
窗口的左侧显示全部的USB设备连接树,在其中找到一个显示“USB人体工程学设备”的分支,选中后右侧窗口显示全部的(报表描述符除外)描述符。USBView显示的高级接口实验台的HID仿真设备的描述符如下。
Device Descriptor: bcdUSB: bDeviceClass: 0x0110 0x00 bDeviceSubClass: bDeviceProtocol: bMaxPacketSize0: idVendor: idProduct: bcdDevice: iManufacturer: iProduct: iSerialNumber: bNumConfigurations:
ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Speed: Full Device Address: 0x02 Open Pipes: 4
Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Bulk wMaxPacketSize: 0x0010 (16) bInterval: 0x0A
Endpoint Descriptor: bEndpointAddress: 0x01 Transfer Type: Bulk wMaxPacketSize: 0x0010 (16) bInterval: 0x0A
Endpoint Descriptor: bEndpointAddress: 0x82 Transfer Type: Interrupt wMaxPacketSize: 0x0040 (64) bInterval: 0x01
Endpoint Descriptor: bEndpointAddress: 0x02 Transfer Type: Interrupt wMaxPacketSize: 0x0040 (64) bInterval: 0x01
第8章 USB接口HID设备 217 0x00 0x00 0x10 (16) 0x045E (Microsoft Corporation) 0x930A 0x0100 0x01 0x02 0x03 0x01
8.6.2 设备的初始化
在将高级接口实验台连接到计算机并操作实验台进入HID接口实验后,Windows系统会发现设备并读取设备的各种描述符,可以通过一个USB工具软件截取Windows和设备之间的请求应答过程。工具软件BusHound可以实现这个功能。
BunHound是一个功能全面的总线分析仪软件,可以实现对计算机通过各种接口连接的设备的通信过程进行截取和分析。图8-9是BusHound的设备连接树(Devices)界面。
当高级接口实验台与计算机通过USB接口连接并操作实验台进入HID实验,可以在BusHound的设备连接树中找到一个“USB人体工程学设备”项目。选中该项目可以实现对设备的通信过程的截取。
选中高级接口实验台的HID设备项,进入到采集(Capture)界面,先控制实验台退出HID实验,按BusHound的采集界面的Stop按钮,再按Run按钮,然后控制实验台进入HID实验界面。Windows系统发现设备并请求设备的各种描述符,然后完成对设备的必要的设置,BusHound可以采集到以上通信过程。
218 计算机高级接口实践
图8-9 BusHound的设备树显示界面
图8-10 BusHound的采集显示界面
第8章 USB接口HID设备 219
下面分析BusHound截取的数据内容。 ? 主机发送:80 06 00 01 00 00 12 00 Get_Descriptor请求,请求设备回传设备描述符。
? 设备发送:12 01 10 01 00 00 00 10 5e 04 0a 93 00 01 01 02 03 01 设备描述符内容:USB版本=1.1、类别/协议码=0、EP0的最大包尺寸=10、
VID=045E、PID=930A、版本=1.0、厂商、产品和序列号字符串索引、配置数=1。 ? 主机发送:80 06 00 02 00 00 09 00
Get_Descriptor请求,请求设备回传配置描述符。 ? 设备发送:09 02 37 00 01 01 04 80 32
配置描述符内容:该描述符及后续描述符总长度=55、支持接口数=1、配置标示符=1、总线供电、最大100mA。 ? 主机发送:80 06 00 02 00 00 37 00
Get_Descriptor请求,请求设备回传配置、接口、HID和端点描述符。
? 设备发送:09 02 37 00 01 01 04 80 32 09 04 00 00 04 03 00 00 05 09 21 01 01 00
01 22 34 00 07 05 81 02 10 00 0a 07 05 01 02 10 00 0a 07 05 82 03 40 00 01 07 05 02 03 40 00 01 按顺序为: 9字节配置描述符:含义同上。
9字节接口描述符:标示符=0、支持的端点=4、类别=HID。
9字节HID描述符:版本=1.01、有1个报表描述符(长度为52) 7字节端点描述符:1号批量输入,包尺寸=16。 7字节端点描述符:1号批量输出,包尺寸=16。
7字节端点描述符:2号中断输入,包尺寸=64、1ms轮询。 7字节端点描述符:2号中断输出,包尺寸=64、1ms轮询。 ? 主机发送:00 09 01 00 00 00 00 00
Set_Configuation请求,配置号=1。 ? 主机发送:21 0a 00 00 00 00 00 00 Set_Idle请求,设定间隔时间为0。 ? 设备发送:04 00 00 c0
STALL,不支持请求。
? 主机发送:81 06 00 22 00 00 74 00
Get_Descriptor请求,请求设备回传报表描述符。
? 设备发送:06 a0 ff 09 01 a1 01 09 02 a1 00 06 a1 ff 09 03 09 04 15 80 25 7f 35 00
45 ff 75 08 95 40 81 02 09 05 09 06 15 80 25 7f 35 00 45 ff 75 08 95 40 91 02 c0 c0 报表描述符。
8.6.3 HID测试程序的实现
使用Visual Basic编写一个针对高级接口实验台的应用程序,实现与设备的通信。该测试程序实现以下功能:
? 查找设备:根据指定的VID和PID实现设备查找; ? 获得设备能力:调用相应的API,获得设备的能力;
? 发送报表:将界面输入的R1~R8的数值按照报表的指定格式传送到设备; ? 接收报表:将设备的界面显示的R1~R8的数值读取到应用程序; ? 显示API函数调用信息:显示每一个API函数的调用结果; ? 关闭设备。
220 计算机高级接口实践
下图是程序运行的界面显示。
图8-11 针对实验台的HID测试程序显示界面
在获得能力的API函数的调用结果中,输入报表和输出报表的长度为65字节,在发送和接收报表时的长度设定都需要设为65。但在该实验中真正用到的有效数据只有8个寄存器的数据,占用其中的8个字节,报表的首字节(第0个)为0,表示Report ID。第1、2个字节分别55h、AAh为用户定义的标示字。第3、4字节为用户定义命令编码,输出报表中为01、08,输入报表中为02、08。从第5到第12字节顺序为R1、R2、…R8的值。之后的数据为保留字节。 'HID查找、能力检测、输入报表、输出报表演示程序 '修改自许永和的《介面设计与实习 使用Bisual Basic》 Option Explicit '变量定义 ****************************************************************************** Dim Capabilities As HIDP_CAPS Dim DataString As String Dim DetailData As Long Dim DetailDataBuffer() As Byte Dim DeviceAttributes As HIDD_ATTRIBUTES Dim DevicePathName As String Dim DeviceInfoSet As Long Dim ErrorString As String Dim HidDevice As Long