USB驱动开发——USB描述符

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档