微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > USB的描述符及各种描述符之间的依赖关系

USB的描述符及各种描述符之间的依赖关系

时间:12-15 来源:互联网 点击:
USB的描述符及各种描述符之间的依赖关系.USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。

USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。

设备描述符记录的信息:设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID)和产品(PID),设备版本号,厂商字符串索引,产品字符串索引,设备序列号索引,可能的配置数等.

配置描述符记录的信息:配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量等.

接口描述符记录的信息:接口的编号,接口的端点数,接口所使用的类,子类,协议等.

端点描述符记录的信息:端点号及方向,端点的传输类型,最大包长度,查询时间间隔等.

字符串描述符记当的信息:提供一些方便人们阅读的信息,它不是必需的.

一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

举个例子说明它们之间的关系:8号教学楼的808教室.8号楼就是设备,而808或其它教室就是端点.而配置和接口,是为了方便管理端点而抽象出来的概念.一个设备可以有多个配置,但是同一时刻只能有一个配置有效.每个配置下又可有很多接口.当我们需要不同的功能时,只要选择不同的配置即可.如我们把教学楼分为两个配置:平时上课用和期末考试用。当我们做为考试用时,要将所有的教室都用上。即该配置下只有一个接口,接口下有很多端点--教室。而平时上课用时,把教室分为两类,即两个接口。一类是教师休息室,有N个教室(即该接口有N个端点),一类上课的课室,有M个教室(即该接口有M个端点)。教师休息室和课室是不能共用的(在USB中也是如此,同一个端点号不能出现在同一个配置下的两个或多个不同的接口中).但是教师休息室和课室在考试用时都可以当做考场(这在USB中也是如此,同一个端点号可用在不同的配置中)。

每种描述符都有自己独立的编号,如下:
#define DEVICE_DESCRIPTOR0x01//设备描述符
#define CONFIGURATION_DESCRIPTOR0x02//配置描述符
#define STRING_DESCRIPTOR0x03//字符串描述符
#define INTERFACE_DESCRIPTOR0x04//接口描述符
#define ENDPOINT_DESCRIPTOR0x05//端点描述符

下面分别详细介绍一下各描述符。

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
0x00,//USB分配的设备协议代码,上面一项为0时,本项也要设置为0
0x10,//端点0的最大包大小,这里为16字节
0x7104,//厂商编号,这个是需要跟USB组织申请的ID号,表示厂商代号。
0xf0ff,//该产品的编号,跟厂商编号一起配合使用,让主机注册该设备并加载相应的驱动程序
0x0100,//设备出厂编号
0x01,//设备厂商字符串的索引,在获取字符串描述符时,使用该索引号来识别不同的字符串
0x02,//描述产品字符串的索引,同上
0x03,//描述设备序列号字符串的索引,同上
0x01//可能的配置数为1,即该设备只有一个配置
};

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top