USB驱动开发——USB描述符
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB驱动开发——USB描述符
观察USB设备
1.usbview
图1 通用串行总线控制器
usbview 在C:\WINDDK\2600\src\wdm\usb\usbview\objchk\i386文件夹下,如图2所示的usbview.exe文件。
图2 usbview目录
图3 usbview观察USB外接设备
如图3所示,可以看出端口8(port8),以及图形右边关于插入U盘的描述信息。
2.bus hound 使用指南
bus hound 5.0使用方法如下:
1.请下载安装bus hound 5.0全功能版:/down/view.asp?id=28
2.安装完毕后请一定要重启,否则软件不能工作;
3.进行USB监控的主要步骤如下:
(1)启动软件,将USB设备插入USB口;
(2)在DEVICE内选择设备,例如我的设备是一个U盘,则设备为USB DEVICE,选中该设备,可以在下面的PROPERTIES看到设备的总线类型,设备的电源以及各个端点的功能,在该设备下面还有两个分支:USB AUDIO DEVICE 和 "USB人体学输入设备"(这就是本设备占用的两个接口),一样在PROPERTIES里面可以看到他们的类代码为0x01和0x03。
(3)在看完基本信息后,将上述的某个接口,或者全部打勾。
(4)切换到"SETTING"选项卡,将MAX PHASE设置为512,这样你就可以看到完全的DESCRIPTOR 和其他的数据了。
(5)在"PHASE TO CAPTURE"里面的几个和USB相关的选项如下:
CDB:命令描述符块;
CTL:USB控制传输;
DI/D数据输入/输出;
LEN:数据长度;
INSOC:同步传输;
RSET:总线复位;
URB:USB请求块;
USTS:USB状态。
查看USB数据传输就把它们都打勾就行了;
(6)在"Coloumn to display"里面,把里面的全部打勾。注意,这样要把窗体最大化才可以看见全部数据。
(7)在"CAPTURE"选项卡里面可以看捕捉的数据了,在文本框输入文字,再点旁边的箭头,可以查询。按STOP,再按START可以清屏。
(8)举个例子,接上设备,在文本框输入GET DESCRIPTOR(大小写无所谓),点箭头,可以找到你的DESCRIPTOR,但是值得注意的是这个DESCRIPTOR主要是CONFIG,如果是设备描述符会有专门的说明GET DEVICE DESCRIPTOR;这个软件好像不会捕捉STRING DESCRIPTOR。设备返回的信息在DI里面。
图4 bus hound界面
图5 bus hound捕获
图6 bus hound界总线命令设置
USB的描述符及各种描述符之间的依赖关系
USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。
USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。具体内容参见USB2.0协议第九章《USB设备架构》。
关于报告描述符,请看:《USB HID报告及报告描述符简介 》/93/198.aspx。
一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
每种描述符都有自己独立的编号,如下:
#define DEVICE_DESCRIPTOR 0x01 //设备描述符
#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符
#define STRING_DESCRIPTOR 0x03 //字符串描述符
#define INTERFACE_DESCRIPTOR 0x04 //接口描述符
#define ENDPOINT_DESCRIPTOR 0x05 //端点描述符
下面分别详细介绍一下各描述符。具体的内容可以在DDK下面找到,具体路径如下:C:\WINDDK\2600\inc\wxp。当然不同的安装环境路径就不一样,笔者是按照默认安装路径安装的,因此在C盘下面。具体的安装请参考《Windows驱动开发环境配置》介绍。
1.设备描述符
//定义标准的设备描述符结构。
typedef struct _DEVICE_DCESCRIPTOR_STRUCT
{
BYTE blength; //设备描述符的字节数大小
BYTE bDescriptorType; //设备描述符类型编号
WORD bcdUSB; //USB版本号
BYTE bDeviceClass; //USB分配的设备类代码
BYTE bDeviceSubClass; //USB分配的子类代码
BYTE bDeviceProtocol; //USB分配的设备协议代码
BYTE bMaxPacketSize0; //端点0的最大包大小
WORD idVendor; //厂商编号
WORD idProduct; //产品编号
WORD bcdDevice; //设备出厂编号
BYTE iManufacturer; //设备厂商字符串的索引
BYTE iProduct; //描述产品字符串的索引
BYTE iSerialNumber; //描述设备序列号字符串的索引
BYTE bNumConfigurations; //可能的配置数量
}
DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;
//实际的设备描述符示例
code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //设备描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小,这里是18字节
DEVICE_DESCRIPTOR, //设备描述符类型编号,设备描述符是01
0x1001, //USB版本号,这里是USB01.10,即USB1.1。由于51是大端模式,所以高低字节交换
0x00, //USB分配的设备类代码,0表示类型在接口描述符中定义
0x00, //USB分配的子类代码,上面一项为0时,本项也要设置为0