一、USB指令
在USB规范里,对指令一词供给的单词为“Request”,但这儿为了更好的了解主机与设备之间的主从关系,将它界说成“指令”。
一切的USB设备都要求对主机发给自己的操控指令作出呼应,USB规范界说了11个规范指令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。一切USB设备都有必要支撑这些指令(个别指令在外,如Set_Descriptor、Synch_Frame)。
不同的指令虽然有不同的数据和运用意图,但一切的USB指令结构是相同的。下表所示为USB指令的结构:
表1、USB指令的结构 | ||||
偏移量 | 域 | 长度(字节) | 值 | 描绘 |
0 | bmRequestType | 1 | 位图 | 恳求特征: D7:传输方向 0=主机至设备 1=设至极主机 D6..5:品种 0=规范 1=类 2=厂商 3=保存 D4..0:接受者 0=设备 1=接口 2=端点 3=其他 4..31保存 |
1 | bRequest | 1 | 值 | 指令类型编码值(见表3) |
2 | wValue | 2 | 值 | 依据不同的指令,意义也不同 |
4 | wIndex | 2 | 索引或偏移 | 依据不同的指令,意义也不同,首要用于传送索引或偏 移 |
6 | wLength | 2 | 如有数据传送阶段,此为数据字节数。 |
下表列出了USB的11种规范指令
表2、USB的11种规范指令 | ||||||
指令 | bmRequestType | bRequest | wValue | wIndex | wLength | Data |
Clear_Feature | 00000000B 00000001B 00000010B |
CLEAR_FEATURE | 特性选择符 | 零 接标语 端点号 |
零 | 无 |
Get_Configuration | 10000000B | GET_CONFIGURATION | 零 | 零 | 一 | 装备值 |
Get_Descriptor | 10000000B | GET_DESCRIPTOR | 描绘表品种(高字节,见表5)和索引(低字节) | 零或言语标志 | 描绘表长 | 描绘表 |
Get_Interface | 10000001B | GET_INTERFACE | 零 | 接标语 | 一 | 可选设置 |
Get_Status | 10000000B 10000001B 10000010B |
GET_STATUS | 零 | 零(回来设备状况) 接标语(对像时接口时) 端点号(对象是端点时) |
二 | 设备, 接口,或 端点状况 |
Set_Address | 00000000B | SET_ADDRESS | 设备地址 | 零 | 零 | 无 |
Set_Configuration | 00000000B | SET_CONFIGURATION | 装备值(高字节为0,低字节表明要设置的装备值) | 零 | 零 | 无 |
Set_Descriptor | 00000000B | SET_DESCRIPTOR | 描绘表品种(高字节,见表5)和索引(低字节) | 零或言语标志 | 描绘表长 | 描绘表 |
Set_Feature | 00000000B 00000001B 00000010B |
SET_FEATURE | 特性选择符(1表明设备,0表明端点) | 零 接标语 端点号 |
零 | 无 |
Set_Interface | 00000001B | SET_INTERFACE | 可选设置 | 接标语 | 零 | 无 |
Synch_Frame | 100000010B | SYNCH_FRAME | 零 | 端点号 | 二 | 帧号 |
其间bRequest为指令编码值,意义见表3:
表3、USB规范指令的编码值 | |
bRequest | Value |
GET_STATUS | 0 |
CLEAR_FEATURE | 1 |
为将来保存 | 2 |
SET_FEATURE | 3 |
为将来保存 | 4 |
SET_ADDRESS | 5 |
GET_DESCRIPTOR | 6 |
SET_DESCRIPTOR | 7 |
GET_CONFIGURATION | 8 |
SET_CONFIGURATION | 9 |
GET_INTERFACE | 10 |
SET_INTERFACE | 11 |
SYNCH_FRAME | 12 |
二、USB描绘符
USB协议为USB设备界说了一套描绘设备功用和特点的有固定结构的描绘符,包含规范的描绘符即设备描绘符、装备描绘符、接口描绘符、端点描绘符和字符串描绘符,还有百规范描绘符,如类描绘符。USB设备经过这些描绘符向USB主机报告设备的各式各样特点,主机经过对这些描绘符的拜访对设备进行类型辨认、装备并为其供给相应的客户端驱动程序。
USB设备经过描绘符反映自己的设备特性。USB描绘符是由特定格局摆放的一组数据结构组成。
在USB设备枚举过程中,主机端的协义软件需求解析从USB设备读取的一切描绘符信息。在USB主向设备发送读取描绘符的恳求后,USB设备将一切的描绘符以接连的数据流方法传输给USB主机。主机从第一个读到的字符开端,依据两边规则好的数据格局,次序地解析读到的数据流。
USB描绘符包含规范描绘符、类描绘符和厂商特定描绘3种方法。任何一种设备有必要USB规范描绘符(队字符串描绘符可选外)。
在USB1.X中,规则了5种规范描绘符:设备描绘符(Device Descriptor)、装备描绘符(Configuration Descriptor)、接口描绘符(Interface Descriptor)、端点描绘符(Endpoint Descriptor)和字符串描绘符(String Descriptor)。
每个USB设备只要一个设备描绘符,而一个设备中可包含一个或多个装备描绘符,即USB设备能够有多种装备。设备的每一个装备中又能够包含一个或多个接口描绘符,即USB设备能够支撑多种功用(接口),接口的特性经过描绘符供给。
在USB主机拜访USB设备的描绘符时,USB设备按照设备描绘符、装备描绘符、接口描绘符、端点描绘符、字符串描绘符次序将一切描绘符传给主机。一设至极少要包含设备描绘符、装备描绘符和接口描绘符,假如USB设备没有端点描绘符,则它仅仅用默许管道与主机进行数据传输。
1、设备描绘符
设备描绘符给出了USB设备的一般信息,包含对设备及在设备装备中起全程效果的信息,包含制造商标识号ID、产品序列号、所属设备类号、默许端点的最大包长度和装备描绘符的个数等。一个USB设备有必要有且仅有一个设备描绘符。设备描绘符是设备连接到总线上时USB主机所读取的第一个描绘符,它包含了14个字段,结构如下:
表4、USB设备描绘符的结构 | ||||
偏移量 | 域 | 巨细 | 值 | 描绘 |
0 | bLength | 1 | 数字 | 此描绘表的字节数 |
1 | bDecriptorType | 1 | 常量 | 描绘符的类型(此处应为0x01,即设备描绘符) |
2 | bcdUSB | 2 | BCD码 | 此设备与描绘表兼容的USB设备阐明版本号(BCD码) |
4 | bDeviceClass | 1 | 类 | 设备类码: 假如此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立作业。 假如此域的值处于1~FEH之间,则设备在不同的接口上支撑不同的类。并这些接口或许不能独立作业。此值指出了这些接口团体的类界说。 假如此域设为FFH,则此设备的类由厂商界说。 |
5 | bDeviceSubClass | 1 | 子类 | 子类挖码 这些码值的详细意义依据bDeviceClass域来看。 如bDeviceClass域为零,此域也须为零 如bDeviceClass域为FFH,此域的一切值保存。 |
6 | bDevicePortocol | 1 | 协议 | 协议码 这些码的值视bDeviceClass和bDeviceSubClass的值而定。 假如设备支撑设备类相关的协议,此码标志了设备类的值。假如此域的值为零,则此设备不支撑设备类相关的协议,但是,或许它的接口支撑设备类相关的协议。假如此域的值为FFH,此设备运用厂商界说的协议。 |
7 | bMaxPacketSize0 | 1 | 数字 | 端点0的最大包巨细(仅8,16,32,64 为合法值) |
8 | idVendor | 2 | ID | 厂商标志(由USB-IF安排赋值) |
10 | idProduct | 2 | ID | 产品标志(由厂商赋值) |
12 | bcdDevice | 2 | BCD码 | 设备发行号(BCD码) |
14 | iManufacturer | 1 | 索引 | 描绘厂商信息的字符串描绘符的索引值。 |
15 | iProduct | 1 | 索引 | 描绘产品信息的字串描绘符的索引值。 |
16 | iSerialNumber | 1 | 索引 | 描绘设备序列号信息的字串描绘符的索引值。 |
17 | bNumConfigurations | 1 | 数字 | 或许的装备描绘符数目 |
其间bDescriptorType为描绘符的类型,其意义可查下表(此表也适用于规范指令Get_Descriptor中wValue域高字节的取值意义):
表5、USB描绘符的类型值 | ||
类型 | 描绘符 | 描绘符值 |
规范描绘符 | 设备描绘符(Device Descriptor) | 0x01 |
装备描绘符(Configuration Descriptor) | 0x02 | |
字符串描绘符(String Descriptor) | 0x03 | |
接口描绘符(Interface Descriptor) | 0x04 | |
端点描绘符(EndPont Descriptor) | 0x05 | |
类描绘符 | 集线器类描绘符(Hub Descriptor) | 0x29 |
人机接口类描绘符(HID) | 0x21 | |
厂商界说的描绘符 | 0xFF |
设备类代码bDeviceClass可查下表:
表6、设备的类别(bDeviceClass) | ||
值(十进制) | 值(十六进制) | 阐明 |
0 | 0x00 | 接口描绘符中供给类的值 |
2 | 0x02 | 通讯类 |
9 | 0x09 | 集线器类 |
220 | 0xDC | 用于确诊用处的设备类 |
224 | 0xE0 | 无线通讯设备类 |
255 | 0xFF | 厂商界说的设备类 |
下表列出了一个USB鼠标的设备描绘符的比如,供咱们剖析一下:
表7、一种鼠标的设备描绘符示例 | |
字段 | 描绘符值(十六制) |
bLength | 0x12 |
bDecriptorType | 0x01 |
bcdUSB | x0110 |
bDeviceClass | 0x00 |
bDeviceSubClass | 0x00 |
bDevicePortocol | 0x00 |
bMaxPacketSize0 | 0x08 |
idVendor | 0x045E(Microsoft Corporation) |
idProduct | 0x0047 |
bcdDevice | 0x300 |
iManufacturer | 0x01 |
iProduct | 0x03 |
iSerialNumber | 0x00 |
bNumConfigurations | 0x01 |
2、装备描绘符
装备描绘符中包含了描绘符的长度(属于此描绘符的一切接口描绘符和端点描绘符的长度的和)、供电方法(自供电/总线供电)、最大耗电量等。主果主机宣布USB规范指令Get_Descriptor要求得到设备的某个装备描绘符,那么除了此装备描绘符以外,此装备包含的一切接口描绘符与端点描绘符都将供给给USB主机。
表8、USB装备描绘符的结构 | ||||
偏移量 | 域 | 巨细 | 值 | 描绘 |
0 | bLength | 1 | 数字 | 此描绘表的字节数长度。 |
1 | bDescriptorType | 1 | 常量 | 装备描绘表类型(此处为0x02) |
2 | wTotalLength | 2 | 数字 | 此装备信息的总长(包含装备,接口,端点和设备类及厂商界说的描绘符) |
4 | bNumInterfaces | 1 | 数字 | 此装备所支撑的接口个数 |
5 | bCongfigurationValue | 1 | 数字 | 在SetConfiguration()恳求中用作参数来选定此装备。 |
6 | iConfiguration | 1 | 索引 | 描绘此装备的字串描绘表索引 |
7 | bmAttributes | 1 | 位图 | 装备特性: D7:保存(设为一) D6:自给电源 D5:长途唤醒 D4..0:保存(设为一) 一个既用总线电源又有自给电源的设备会在MaxPower域指出需求从总线取的电量。并设置D6为一。运转时期的实践电源形式可由GetStatus(DEVICE)恳求得到。 |
8 | MaxPower | 1 | mA | 在此装备下的总线电源消耗量。以2mA为一个单位。 |
下面是一种硬盘的装备描绘符示例:
表9、一种硬盘的装备描绘符示例 | |
字段 | 描绘符值(十六进制) |
bLength | 0x09 |
bDescriptorType | 0x02 |
wTotalLength | 0x01F |
bNumInterfaces | 0x01 |
bCongfigurationValue | 0x01 |
iConfiguration | 0x00 |
bmAttributes | 0x0C |
MaxPower | 0x32 |
3、接口描绘符
装备描绘符中包含了一个或多个接口描绘符,这儿的“接口”并不是指物理存在的接口,在这儿把它称之为“功用”更易了解些,例如一个设备既有录音的功用又有扬声器的功用,则这个设至极少就有两个“接口”。
假如一个装备描绘符不止支撑一个接口描绘符,并且每个接口描绘符都有一个或多个端点描绘符,那么在呼应USB主机的装备描绘符指令时,USB设备的端点描绘符总是紧跟着相关的接口描绘符后边,作为装备描绘符的一部分被回来。接口描绘符不行直接用Set_Descriptor和Get_Descriptor来存取。
假如一个接口仅运用端点0,则接口描绘符今后就不再回来端点描绘符,并且此接口体现的是一个操控接口的特性,它运用与端点0相关联的默许管道进行数据传输。在这种情况下bNumberEndpoints域应被设置成0。接口描绘符在阐明端点个数并不把端点0核算在内。
表10、USB接口描绘符的结构 | ||||
偏移量 | 域 | 巨细 | 值 | 阐明 |
0 | bLength | 1 | 数字 | 此表的字节数 |
1 | bDescriptorType | 1 | 常量 | 接口描绘表类(此处应为0x04) |
2 | bInterfaceNumber | 1 | 数字 | 接标语,当时装备支撑的接口数组索引(从零开端)。 |
3 | bAlternateSetting | 1 | 数字 | 可选设置的索引值。 |
4 | bNumEndpoints | 1 | 数字 | 此接口用的端点数量,假如是零则阐明此接口只用缺省操控管道。 |
5 | bInterfaceClass | 1 | 类 | 接口所属的类值: 零值为将来的规范保存。 假如此域的值设为FFH,则此接口类由厂商阐明。 一切其它的值由USB阐明保存。 |
6 | bInterfaceSubClass | 1 | 子类 | 子类码 这些值的界说视bInterfaceClass域而定。 假如bInterfaceClass域的值为零则此域的值有必要为零。 bInterfaceClass域不为FFH则一切值由USB所保存。 |
7 | bInterfaceProtocol | 1 | 协议 | 协议码:bInterfaceClass和bInterfaceSubClass域的值而定.假如一个接口支撑设备类相关的恳求此域的值指出了设备类阐明中所界说的协议. |
8 | iInterface | 1 | 索引 | 描绘此接口的字串描绘表的索引值。 |
关于bInterfaceClass字段,表明接口所属的类别,USB协议依据功用将不同的接口划分红不的类,其详细意义如下表所示:
表11、USB协议界说的接口类别(bInterfaceClass) | |
值(十六进制) | 类别 |
0x01 | 音频类 |
0x02 | CDC操控类 |
0x03 | 人机接口类(HID) |
0x05 | 物理类 |
0x06 | 图画类 |
0x07 | 打印机类 |
0x08 | 大数据存储类 |
0x09 | 集线器类 |
0x0A | CDC数据类 |
0x0B | 智能卡类 |
0x0D | 安全类 |
0xDC | 确诊设备类 |
0xE0 | 无线操控器类 |
0xFE | 特定运用类(包含红外的桥接器等) |
0xFF | 厂商界说的设备 |
4、端点描绘符
端点是设备与主机之间进行数据传输的逻辑接口,除装备运用的端点0(操控端点,一般一个设备只要一个操控端点)为双向端口外,其它均为单向。端点描绘符描绘了数据的传输类型、传输方向、数据包巨细和端点号(也可称为端点地址)等。
除了描绘符中描绘的端点外,每个设备有必要要有一个默许的操控型端点,地址为0,它的数据传输为双向,并且没有专门的描绘符,只是在设备描绘符中界说了它的最大包长度。主机经过此端点向设备发送指令,取得设备的各种描绘符的信息,并经过它来装备设备。
表12、USB端点描绘符的结构 | ||||
偏移量 | 域 | 巨细 | 值 | 阐明 |
0 | bLength | 1 | 数字 | 此描绘表的字节数长度 |
1 | bDescriptorType | 1 | 常量 | 端点描绘表类(此处应为0x05) |
2 | bEndpointAddress | 1 | 端点 | 此描绘表所描绘的端点的地址、方向: Bit 3..0 :端点号. Bit 6..4 :保存,为零 Bit 7:方向,假如操控端点则略。 0:输出端点(主机到设备) 1:输入端点(设备到主机) |
3 | bmAttributes | 1 | 位图 | 此域的值描绘的是在bConfigurationValue域所指的装备下端点的特性。 Bit 1..0 :传送类型 00=操控传送 01=同步传送 10=批传送 11=中止传送 一切其它的位都保存。 |
4 | wMaxPacketSize | 2 | 数字 | 当时装备下此端点能够接纳或发送的最大数据包的巨细。 关于实进传输,此值用于为每帧的数据净负荷预留时刻。在实践运转时,管道或许不完全需求预留的带宽,实践带宽可由设备经过一种非USB界说的机制报告给主机。关于中止传输,批量传输和操控传输,端点或许发送比之短的数据包 |
6 | bInterval | 1 | 数字 | 周期数据传输端点的时刻空隙。 此域的值关于批传送的端点及操控传送的端点无意义。关于同步传送的端点此域必需为1,表明周期为1ms。关于中止传送的端点此域值的规模为1ms到255ms。 |
下表是一种鼠标的端点描绘符的示例,该端点是一个中止端点:
表13、一种鼠标的端点描绘符示例 | |
域 | 值(十六进制) |
bLength | 0x07 |
bDescriptorType | 0x05 |
bEndpointAddress | 0x81 |
bmAttributes | 0x03 |
wMaxPacketSize | 0x04 |
bInterval | 0x0A |
5、字符串描绘符
字符串描绘符是一种可选的USB规范描绘符,描绘了如制商、设备称号或序列号等信息。假如一个设备无字符串描绘符,则其它描绘符中与字符串有关的索引值都有必要为0。字符串运用的是Unicode编码。
主机请示得到某个字符串描绘符时一般分红两步:首要主机向设备宣布USB规范指令Get_Descriptor,其间所运用的字符串的索引值为0,设备回来一个字符串描绘符,此描绘符的结构如下:
表14、USB字符串描绘符(呼应主机恳求时回来的表明言语ID的字符串描绘符) | ||||
偏移量 | 域 | 巨细 | 值 | 描绘 |
0 | bLength | 1 | N+2 | 此描绘表的字节数 |
1 | bDescriptorType | 1 | 常量 | 字串描绘表类型(此处应为0x03) |
2 | wLANGID[0] | 2 | 数字 | 言语标识(LANGID) 码0 |
… | … | … | … | … |
N | wLANGID[x] | 2 | 数字 | 言语标识(LANGID) 码X |
该字符串描绘符双字节的言语ID的数组,wLANGID[0]~wLANGID[x]指明晰设备支撑的言语,详细意义可检查USB_LANGIDs.pdf。
主机依据自己需求的言语,再次向设备宣布USB规范指令Get_Descriptor,指明所要求得到的字符串的索引值和言语。这次设备所回来的是Unicode编号的字符串描绘符,其结构如下:
表15、Unicode字符串描绘符(呼应主机恳求时真实表明字符串编码的字符串描绘符) | ||||
偏移量 | 域 | 巨细 | 值 | 描绘 |
0 | bLength | 1 | 数字 | 此描绘表的字节数(bString域的数值N+2) |
1 | bDescriptorType | 1 | 常量 | 字串描绘表类型(此处应为0x03) |
2 | bString | N | 数字 | UNICODE编码的字串 |
bString域为设备实践回来的以UNICODE编码的字符串流,咱们在编写设备端硬件驱动的时分需求将字符串转化为UNICODE编码,您能够经过一些UNICODE转化东西进行转化。