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,即该设备只要一个装备
};
2.装备描绘符
//界说规范的装备描绘符结构
typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTE bLength;//装备描绘符的字节数巨细
BYTE bDescriptorType;//装备描绘符类型编号
WORD wTotalLength;//此装备回来的一切数据巨细
BYTE bNumInterfaces;//此装备所支撑的接口数量
BYTE bConfigurationValue;//Set_Configuration指令所需求的参数值
BYTE iConfiguration;//描绘该装备的字符串的索引值
BYTE bmAttributes;//供电形式的挑选
BYTE MaxPower;//设备从总线提取的最大电流
}
CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/233110.html