USB传输协议分析
关键字:
一 、数据格式【包】
总体的格式如下:
同步序列【SYNC】 | 包ID【PID】 | 包特定信息 | CRC校验位 | 包结束标志【EOP】 |
信息包
1.1 、同步序列【SYNC】
所有的包都从同步序列(SYNC)字段开始的,它由8B组成【00000001】,他们在数据线上用NRZI码表示【由一个跳变来表示0】,所以这就提供了一个时钟来同步,信息包紧跟其后。
1.2 、信息包
信息包有:令牌包【SETUP】、数据包、握手包、专用包。
1.2.1 、令牌包【SETUP】
图 PID
PID 类型 | PID 名 | PID[3:0] | 描述 |
标记/令牌 (Token) | 输出(OUT)
输入(IN)
帧开始(SOF)
建立(SETUP) | 0001B
1001B
0101B
1101B | 在主机到功能部件的事务中有地址+端口号
在功能部件到主机的事务中有地址+端口号
下一个1ms时间片的开始标记和帧号【同步端点用来同步它的传输】 在主机到功能部件建立一个控制管道的事务中有地址+端口号 |
图 地址字段【ADDR】
图 端口字段【ENDP】
0[开始] | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | 1 |
图 帧字段
帧号字段是一个11位的字段,主机每过一帧就将其内容加一。帧号字段达到其最大值7FFH时归零,且它仅每个帧最初时刻在SOF标记中被发送。
1.2.2 、数据包
DATA如下
PID 类型 | PID 名 | PID[3:0] | 描述 |
数据 (DATA) | 数据0(DATA0)
数据1(DATA1) | 0011B
1011B | 偶数据包PID
奇数据包PID |
1.2.3 、握手包
握手包仅由PID构成。
PID 类型 | PID 名 | PID[3:0] | 描述 |
握手(Handshake) | 确认(ACK)
不确认(NAK)
停止(STALL) | 0010B
1010B
1110B | 接收器收到无措数据包;
接收设备部不能接收数据,或发送设备不能发送数据【暂时的】。 端口挂起,或一个控制管道请求不被支持【永久的】。 |
1.2.4 、专用包
PID 类型 | PID 名 | PID[3:0] | 描述 |
专用 (Special) | 前同步(PRE) | 1100B | 主机发送的前同步字。打开到低速设备的下行总线通信。 |
二 、事务处理
2.1 、一次事务处理的过程
2.2 、事务处理种类
事务处理包括:SETUP事务、OUT事务、IN事务。
2.2.1 、IN事务
2.2.2 、OUT事务
2.2.3 、SETUP事务
三 、USB传输类型
3.1
、概述
USB有4种传输类型:批量传输(Bulk),控制传输(Control),中断传输(Interrupt)和同步传输(Isochronous)【事务是它们的基本单位】。
3.2批量传输【由 一个或多个IN/OUT事务 构成】
批量传输的特点是以错误检测和重试的方式保证主机和功能部件之间的数据的无错发送的能力。如图所示,批量传输是由标记【令牌】,数据和握手包构成的三时相的事务;在某些流控制和挂起条件下,数据时相被握手信号替换,从而产生了没有数据传输的两时相的事务。
图8-9 批处理事务格式
当主机准备好了接收批量传输数据的时候,它发出输入标记。功能部件端口通过返回数据包,或者如果不能返回数据,则返回NAK或STALL握手作为应答 :
l ACK:主机收到合法的的数据包;
l NAK:功能部件暂时不能返回数据;
l STALL:端口永久地被停止,需要USB系统软件干涉;
l 如果收到数据时主机检测到错误,它不返回握手包给功能部件。
当主机准备好了传送成批数据的时候,它首先发出一个后跟数据包的输出标记包。如果数据由功能部件无错地接收到,那么它将返回三个握手中的一个 :
l ACK:数据包无错地接收到,通知主机可以发送下一个包;
l NAK:数据被无错地收到,但主机应该重新发送数据因为数据功能部件处于妨碍它接受数据的暂时的条件(例如缓冲满)中;
l STALL:端口被停止,告诉主机不要重试传输,因为功能部件上有错误条件。
l 如果接收到的数据有CRC或者位填充错,那么不返回任何握手。
图8-10说明了时序位和数据PID在批量传输读和写中的用法。数据包同步经数据时序切换位(Sequence Toggle Bit)和DATA0/DATA1 PID的使用而达到。当端口经历配置事件(Configuration event)的时候,批量传输端口的切换时序被初始化为DATA0。端口上的数据切换不是作为短包传送或IRP撤消的直接结果而被初始化的。
图8-10 批处理读和写
主机总是通过配置事件初始化总线传送的第一个事务为DATA0 PID。第二的事务使用DATA1 PID,并且,剩余的后继数据传送轮流切换。数据包发送器根据ACK的接收情况来切换而接收器根据数据包的接收(receipt)和验收(acceptance)的情况切换。
3.3
、控制传送
控制传送最少有2个事务阶段:设置阶段、【可选】数据阶段、状态阶段。
3.3.1
、设置阶段里【由 SETUP事务 构成】
SETUP事务在格式上类似于OUT,但是使用的是SETUP而不是OUT的PID。设置阶段总是在SETUP事务的数据时相上使用DATA0 PID。收到SETUP的功能部件必须接受建立数据并用ACK应答,如果数据被损坏,则丢弃数据且不返回握手。
图8-11 控制SETUP事务
3.3.3
、可选数据阶段【由 一个以上IN或OUT事务 构成】
它遵守和批量传送相同的协议规则。所有的数据阶段里的事务都必须有相同的方向(即全部输入或者全部输出)。在数据时相中要发送的数据的数量和其方向在设置阶段里被指定。如果数据的数量超过了先前确定的数据包大小,数据在支持最大的包大小的多个事务中被发送(输入或者输出)。任何剩下的数据都作为剩余在最后的事务中被发送。
3.3.4
、状态阶段【由 IN或OUT事务 构成】
状态阶段是以相对前面的阶段的数据流方向的变化来刻划的,并且总是使用DATA1 PID。例如,如果数据阶段由输出事务构成的,状态是单一的输入事务。如果控制传送序列没有数据阶段,那么它由建立阶段和其后的由输入事务构成的状态阶段构成。图8-12说明了事务顺序,数据时序位的值和控制读写序列的数据PID类型。时序位显示在括号中。
图8-12 控制读写序列
当控制端口在控制传送的数据和状态阶段中发送STALL握手的时候,必须对以后所有对此端口访问返回STALL握手,直到收到建立PID为止。端口收到建立PID之后,不应返回STALL握手。
表8-5 状态阶段的响应
状态响应 | 控制写传送(在数据时相发送) | 控制读传送(在握手时相发送) |
功能部件完成 | 零长度的数据包 | ACK握手 |
功能部件有一个错 | STALL | STALL握手 |
功能部件忙 | NAK | NAK握手 |
3.4
、中断传输【由 IN或OUT事务 构成】
一收到输入标记,功能部件便可返回数据,NAK或STALL。如果端口没有新的中断信息(即没有等待事务的中断)可供返回,功能部件在数据时相里返回NAK握手。如果中断端口的停止特征被设置了,功能部件将返回STALL握手。如果中断是等待事务的,功能部件象数据包那样返回中断信息。作为对数据包接收的反应,主机如果数据无错地被接受则发出ACK握手,或者如果数据包损坏则不返回握手。图8-13说明了中断事务格式。
图8-13 中断事务格式
当端口为实际的中断数据使用中断传送机制的时候,必须遵循数据切换协议。这使功能部件得知主机收到了数据,并且事件条件被清除。这种“确保的”事件传送允许功能部件只发送中断信息直到它被主机接收,而不是在USB系统软件清除中断条件之前,每次数据功能部件被选中时就必须要发送中断数据。
用于切换模式时,中断端口被端口上的任何配置事件初始化为DATA0 PID,其行为和图8-10所示的批处理一样。
另外, 中断端口可被用来为某些同步功能部件传达速率反馈信息。用于这种模式时,在每个数据包被送到主机之后,都不管握手包是否存在或类型如何,数据切换位都应该改变。只有中断输入端口支持这种能力。
3.5
、同步传输【由 同步事务 构成】
如图8-14所示,同步(ISO)传输有标记和数据时相,而没有握手时相。主机发出输入或输出标记,后跟着端口(输入)或主机(输出)传送数据的数据时相。ISO事务不支持握手时相或重试能力。
图8-14 同步事务格式
注解:设备或主机控制器都应该能接受DATA0和DATA1。设备或主机控制器应该只发送DATA0。
ISO事务不支持切换时序。
四、 USB请求
4.1 、概述
Usb通讯传输中 主机站主导地位,它发出usb请求 来向usb设备发布指令,而usb设备通过 描述符来说明其性质。
4.2 、Setup 数据包的格式【请求数据包】
| | | | |
0 | bmRequestType | 1 | 位图 | 请求特征: D7: 传输方向(数据传输阶段的方向) 0=主机至设备 1=设备至主机 D6-D5: 00=标准请求 01=类定义的一个请求 10=厂商定义的一个请求 11=保留 D4-D0: 0000=设备 0001=接口 0010=端点 0011=设备的其他元素 //4..31=保留 |
1
| bRequest | 1 | 值
| 具体请求见下表 |
2 | wValue | 2 | 值
| 此域用来传送当前请求的参数 |
4
|
wIndex
|
2
|
索引或偏移
| 字长域.根据不同的请求含义改变.典型用于传送索引或偏移. |
6 | wLength | 2 |
| 如有数据传送阶段,此为数据字节数. |
bRequest(标准请求码):
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 |
Windex:
所指为端点时:
|
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
方向 0:出结点 1:入结点 |
保留(为0) |
端点号 | ||||||
D16 |
D15 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 | |
保留(为0) | ||||||||
所指为接口时:
|
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
接口号 | ||||||||
D16 |
D15 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 | |
保留(为0) | ||||||||
4.3
、11种标准设备请求
bmRequestType
| bRequest (请求号) | wValue 值字段内容 | Windex 指针字段内容 | wLength 数据长度 | Data 数据字段内容 |
00000000B 00000001B 00000010B | CLEAR_FEATURE 清除特性 | 特性选择符 | 零 接口号 端点号 | 零 | 无 |
10000000B | GET_CONFIGURATION 获取配置 | 零 | 零 | 一 | 配置值 |
10000000B | GET_DESCRIPTOR (设备或配置描述符) | 描述符种类(设备或配置描述符)和索引 | 零或语言标志 | 描述表长 | 描述表 |
10000001B | GET_INTERFACE | 零 | 接口号 | 一 | 可选设置 |
10000000B 10000001B 10000010B | GET_STATUS | 零
| 零 接口号 端点号 | 二 | 设备, 接口 ,或 端点状态 |
00000000B | SET_ADDRESS | 设备地址 | 零 | 零 | 无 |
00000000B | SET_CONFIGURATION | 配置值 | 零 | 零 | 无 |
00000000B | SET_DESCRIPTOR | 描述表种类和索引 | 零或语言标志 | 描述表长 | 描述表 |
00000000B 00000001B 00000010B | SET_FEATURE 特性 | 特性选择符 | 零 接口号 端点号 | 零 | 无 |
00000001B | SET_INTERFACE | 可选设置 | 接口号 | 零 | 无 |
100000010B | SYNCH_FRAME 同步帧 | 零 | 端点号 | 二 | 幀号 |
3.1、SetAddress:
目的:为USB设备设定一个地址【主机指定的】,以便与USB设备的通信地址
请求号【bRequest】:05h
数据源:无
数据长度【wLength】:0
值字段内容【wValue】:新设备地:1--127
指针字段内容【Windex】:无
支持状态:默认、地址
出错表现:未指定
在设置地址请求中,器件会从建立包的内容中得到新的地址。请注意,此设置地址请求不含数据阶段,因此MCU 需要向主机写一个零长度的数据包作为应答阶段。
3.2 、GetDescriport()
目的:主机请求一个特定的描述符【设备、接口、配置、端点…】
请求号:06h
数据源:设备
数据长度:返回特定的描述符的字节的长度。1)长度:描述符>端点数据长度,设备发送字节最大为数据长度;2)长度:描述符<端点数据长度,设备发送描述符,当设备发送小于包最大值的数据包,主机就可以检测到描述符的结束。
值字段内容:对于高位字节为描述符类型,低位字节为描述符值。
指针字段内容:1)对于请求字符串描述符:语言ID;2)请求其他描述符:0
数据字段内容:请求的描述符
支持的状态:默认、地址、配置。
出错动作:设备没收到、不支持的请求,返回STALL。
3.3 、SetDescriport()
3.4、GetConfiguration
目的:主机请求目前设备的配置的值【配置号】
请求号:08h
数据源:设备
数据长度:配置值
值字段的内容:0
指针字段内容:0
数据字段内容:1
支持的状态:地址(返回0)、配置
出错动作:未指定
在获得配置请求中,MCU 必须返回当前的配置值。首先,MCU 将确定是否已配置好。如果器件尚未配置,将向主机返回一个0以告知主机设备尚未配置;如果已配置则返回1。
3.5 、SetConfiguration
目的:引导设备使用主机所选择的配置
请求号:09h
数据源:无
数据长度:无
值字段的内容:低位字节指定一个配置值。若此值与该设备支持的一个配置值匹配,则设备选中该请求的配置。0值:要求设备进入地址状态并需要一个新的SetConfiguration请求来被配置。
指针字段内容:0
数据字段内容:0
支持的状态:地址、配置
出错动作:若值不等于0或一个设备支持的配置则设备返回一个STALL。
对于设置配置请求:MCU 将从建立包中确定配置值。如果配置值为0 ,MCU
必须清除存储区中的配置标志并禁止端点;如果该值为1,
MCU 需要将配置标志置位,该标志一旦置位,MCU 还需要向主机发送零数据包作为应答阶段。
3.6、GetInterface
目的:用于具有支持多个接口的配置之设备,主机请求当前的接口号。
请求号:0Ah
数据源:设备
数据长度:1
值字段内容:0
指针字段内容:接口
数据字段内容:当前接口号
支持状态:配置
出错动作:若接口不存在,设备返回STALL
获得接口请求中,MCU 需要向主机发送一个零的数据包,作为评估板所唯一支持的接口。
3.7、SetInterface
目的:用于具有支持多个接口的配置之设备,主机请求一个接口的配置。
请求号:0bh
数据源:主机
数据长度:0
值字段内容:可替换的设置
指针字段内容:接口
数据字段内容:无
支持状态:配置
出错动作:若接口或设置不存在,设备返回STALL;若设备只支持一个默认接口,那他可能返回一个STALL。
对于评估板的设置接口请求,MCU 除了向主机发送一个零数据包,作为应答阶段之外不需要做任何事。
3.8、SetFeature
目的:主机请求使能一个设备、接口或终端
请求号:03h
数据源:无
数据长度:无
值字段内容:要使能的特性
指针字段内容:0,接口号,端点号
数据字段内容:0
支持状态:默认情况下为未定义。当地址为0k:地址0,端点0;否则设备返回stall。对于配置则为0k。
出错动作:若指定的接口或端点不存在,设备返回stall响应。
3.9、GetFeature
3.10、GetStatus
目的:主机请求设备、接口、端点的特性状态
请求号:00h
数据源:设备
数据长度:2
值字段内容:0
指针字段内容:设备:0;接口:接口号;端点:端点号
数据字段内容:设备、接口或端点状态
支持状态:默认情况下为未定义。当地址为0k:地址0,端点0;否则设备返回stall。对于配置则为0k。
出错动作:若指定的接口或端点不存在,设备返回stall响应。
3.11 、Synch_Frame
五 、USB描述符
5.1 、概述
5.1.1 、端点数据传输方式
#define Control 0x00
#define Isochronous(同步传输) 0x01
#define Bulk(批量传输) 0x02
#define Interrput 0x03
5.1.2 、描述符类型【bDescriportType】
描述符类型 | 值(十六进制) | 描述符 |
标准
| 01 | 设备描述符 |
02 | 配置描述符 | |
03 | 字符串描述符 | |
04 | 接口描述符 | |
05 | 终端描述符 | |
类 | 21 | HID描述符 |
29 | 集线器描述符 | |
HID类 | 22 | 报告描述符 |
23 | 物理描述符 |
【注】描述符前缀含义:b=B(8位);w=字(16位);bm=位图;bcd=二进制编码的十进制;i=指针;id=标识符。
5.2 、标准描述符
标准描述符包括:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。
5.2.1 、设备描述符结构体
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 此描述表的字节数 |
1 | bDecriptorType | 1 | 常量 | 该描述符种类为设备 |
2 | bcdUSB(BCD:二进制编码的十进制) | 2 | BCD码 | 此设备与描述符兼容的USB设备说明版本号(BCD 码)[1.0:0100h;1.1:0110h;2.0:0200h] |
4 | bDeviceClass | 1 | 类 | 设备类码【指定该设备是什么类型的】 如果此域的值为0则一个设置下每个接口指出它自己的类,并个接口各自独立工作。 如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了,这些接口集体的类定义。 如果此域设为FFH,则此设备的类由厂商定义。 |
5 | bDeviceSubClass | 1 | 子类 | 子类码 这些码值的具体含义根据bDeviceClass 域来看。 如bDeviceClass 域为零,此域也须为零 如bDeviceClass |
6 | bDevicePortocol | 1 | 协议 | 协议码 这些码的值视bDeviceClass 和 如果设备支持设备基础上的类相关的协议,此码标志了设备类说明上的值。 如果此域的值为FFH,此设备使用厂商定义的协议。 |
7 | bMaxPacketSize0 | 1 | 数字 | 端点0的最大包大小(仅8,16,32,64 为合法值) |
8 | idVendor | 2 | ID | 厂商标志(由USB标准付值) |
10 | idProduct | 2 | ID | 产品标志(由厂商付值) |
12 | bcdDevice | 2 | BCD 码 | 设备发行号(BCD 码) |
14 | iManufacturer | 1 | 索引 | 描述厂商信息的字串的索引。 |
15 | iProduct | 1 | 索引 | 描述产品信息的字串的索引。 |
16 | iSerialNumber | 1 | 索引 | 描述设备序列号信息的字串的索引。 |
17 | bNumConfigurations | 1 | 数字 | 可能的设置数目【这个设备支持的配置】 |
bDeviceClass:对属于USB定义的类中的一个设备来说,它可以是这个类的名字。从1到FEh之间的值是为USB定义的类而保留的。这些类,例如:集线器、打印机、通讯设备【见下表】。FFh表示这个类是给销售商指定的,并由销售商来定义。一些设备,例如HIDs,在接口描述符中指定这个类,因此对这些设备来说,这个设备描述符中这个字段是0.不是所有的设备都属于一个类的。
bDeviceClass:
#define
USB_DEVICE_CLASS_RESERVED
0x00
#define
USB_DEVICE_CLASS_AUDIO 0x01
#define
USB_DEVICE_CLASS_COMMUNICATIONS
0x02
#define
USB_DEVICE_CLASS_HUMAN_INTERFACE(HID) 0x03
#define
USB_DEVICE_CLASS_MONITOR
0x04
#define
USB_DEVICE_CLASS_PHYSICAL_INTERFACE
0x05
#define
USB_DEVICE_CLASS_POWER
0x06
#define
USB_DEVICE_CLASS_PRINTER
0x07
#define
USB_DEVICE_CLASS_STORAGE
0x08
#define USB_DEVICE_CLASS_HUB 0x09
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
设备描述符包含的信息:
关于该描述符本身的信息:bLength
、 bDecriptorType
关于设备的信息:bcdUSB、idVendor、idProduct、bcdDevice、iManufacturer、iProduct
、iSerialNumber【用于帮助主机确定载入那个驱动】
关于配置的信息:bNumConfigurations、bMaxPacketSize0
关于类的信息:
bDeviceClass、bDeviceSubClass、bDevicePortocol
5.2.2 、配置描述符结构体【通常一个配置就足够了】
偏移量 | 域 | 大小 | 值 | 描述 |
| | | 数字 | 此描述符的字节数。 |
| bDescriptorType | | 常量 | 配置描述符类型 |
| wTotalLength | | 数字 | 此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述表)【设备返回的数据数】 |
| bNumInterfaces | | 数字 | 此配置所支持的接口个数(最小值为1) |
| bCongfigurationValue | | 数字 | 【该配置号】在SetConfiguration()和getConfiguration()请求中用作参数来选定(标示)此配置。0值的SetConfiguration()请求导致设备未进入配置状态。 |
| iConfiguration | | 索引 | 描述此配置的字串描述表索引(指针) |
| bmAttributes 如下图 | | 位图(二进制位) | 配置特性: D7: 保留(设为一) D6: 自给电源 D5: 远程唤醒 D4..D0:保留(设为一) 一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量,并设置D6为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。 |
| MaxPower | | | 在此配置下需要的最大(总线)电流。以 2mA 为一个单位。 |
wTotalLength:当主机发出请求要得配置描述符时,所有相关接口与端节点的描述表都被返回,所以,wTotalLength表示配置、接口、端点描述符的总长度。
bmAttributes:
D7 1(保留) | D6 1:自供电
0:否(总线电源) | D5 1:支持远程唤醒 0:否 | D4 0(保留) | D3 0(保留) | D2 0(保留) | D1 0(保留) | D0 0(保留) |
注:远程唤醒使得一个挂起的USB设备能够告诉他的主机他需要通信,如果没有总线活动超过3ms,USB设备进入挂起状态。
配置描述符包含的信息:
关于该描述符本身的信息:wTotalLength
、bDescriptorType、bLength
关于配置的信息:bNumInterfaces、bCongfigurationValue、iConfiguration
关于电源的信息: bmAttributes、MaxPower
5.2.3 、接口描述符结构体
偏移量 | 域 | 大小 | 值 | 说明 |
| bLength | | | 此表的字节数 |
| bDescriptorType | | | 接口描述表类 |
| bInterfaceNumber | | | 【接口号】,当前配置支持的接口的数组索引(标识) [(从零开始)] |
| bAlternateSetting | 1 | | 可选设置的索引值(标识值)。用于有多个设置的接口,指定所选的设置,默认:0 |
| bNumEndpoints | 1 | | 此接口用的端点数量(除了端点0),如果是零则说明此接口只用缺省控制管道。 |
| bInterfaceClass | | | 类值 零值为将来的标准保留。 如果此域的值设为FFH,则此接口类由厂商说明。 所有其它的值由USB 说明保留。 |
| bInterfaceSubClass | | | 子类码 这些值的定义视bInterfaceClass域而定。 如果bInterfaceClass域的值为零则此域的值必须为零。 bInterfaceClass域不为FFH则所有值由USB 所保留。 |
| bInterfaceProtocol | | | 协议码:bInterfaceClass 和bInterfaceSubClass
|
| iInterface | | | 描述此接口的字串描述表的索引值。 |
接口描述符包含的信息:
关于该描述符本身的信息:bLength、bDescriptorType
关于接口的信息:bInterfaceNumber
bAlternateSetting
bNumEndpoints
bInterfaceClass
bInterfaceSubClass
bInterfaceProtocol
iInterface
5.2.4 、端点描述符结构体
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | 此描述符的字节数 |
1 | bDescriptorType | 1 | 常量 | 端点描述符类 |
| bEndpointAddress | | | 此描述符描述端点的地址和传输方向: D3-D0 : 端点号【低3,高16】 D6-D4 : 保留,为零 D7 : 方向,如果控制端点则略。 0:入端点 1:出端点 |
| bmAttributes | | | 此值描述的是在bConfigurationValue域所指的配置下端点的特性。 D1-D0 D7-D2 :保留
|
| wMaxPacketSize | | | 当前配置下此端点能够接收或发送的最大数据包的大小。 对于同步传送此值用于为每幀的数据净负荷预留时间。而通道可能在实际运行时不需要预留的带宽。实际带宽可由设备通过一种非USB定义的机制汇报给主机. 对于中断传送,批传送,控制传送.端点可能发送较小的数据包。并且在结束传送后既有可能间隙时间来重启,也有可能不需要这段时间。具体请参照第五章。
|
| bInterval | | | 主机轮询数据传送端点的时间间隔。 此域的值对于批传送的端点及控制传送的端点忽略。对于同步传送的端点此域必需为1(ms)。对于中断传送的端点此域值的范围x为1到255。(x ms) |
端点0不需要端点描述符,因为设备描述符中已经对其进行了说明。
描述符包含的信息:
关于该描述符本身的信息:bLength、bDescriptorType
关于该端点的信息:bEndpointAddress、bmAttributes、wMaxPacketSize、bInterval
5.2.5 、字符串描述符
偏移量 | 域 | 大小 | 值 | 描述 |
| | | 数字 | 此描述符的字节数。 |
1 | bDescriptorType | 1 | 常量 | 配置描述符类型 |
2 | bSTRING或wLANGID | 不确定 | 字符串 | 一种或多种语言标识代码的Unicode字符串或一个数组 |
描述符包含的信息:
关于该描述符本身的信息:bLength、bDescriptorType
关于该字符串的信息:bSTRING或wLANGID
5.3 、HID人机接口描述符
主机通过GET_DESCRIPTOR标准请求来获取HID接口的配置。HID的描述符包括5个标准USB描述符:设备、配置、接口、端点、字符串;3个类别特定描述符:HID、报表、实体。
一般,设备和配置描述符中没有定义HID的信息,而将HID的信息写在接口描述符中,所以,主机同过接口描述符来得知此设备是HID设备
在HID固件中描述符被按照下面的顺序存储和被主机得知:配置、接口、HID、端点
HID类描述符
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | HID描述符长度 |
1 | bDescriptorType | 1 | 常量 | 该描述符类型【HID:21h】 |
2 |
BcdHID |
2 | 数字 |
HID规范发布号 【1.0:0100h;1.1:0110h;2.0:0200h】 |
4 |
bCountryCode |
1 | 常量 |
识别本地硬件的国家代码【bcd码】 |
5 |
bNumDescriptors |
1 | 数字 |
支持的从属类的数量【从属于这个描述符的类描述符的数量】 |
6 |
bDescriptorType |
1 | 数字 |
从属于这个HID描述符的一个描述符【报告或物理】的类型 |
7 |
WDcscriptorLength |
2 |
数字 |
报告描述的总长度 |
9 | Additioual |
2 |
数字 |
识别描述符类型的常数。对于多于一个描述符的设备是可选的 |
10 |
wDescriptorLength 【可选】 |
2 |
数字 | 描述符的总长度,对于多于一个描述符的设备是可选的,后面可以跟着其他的wDescriptorType和wDescriptorLength字段。 |
描述符包含的信息:
关于该描述符本身的信息:bLength、bDescriptorType
关于类的信息:BcdHID 、bCountryCode、bNumDescriptors、bDescriptorType、WDcscriptorLength、Additioual bDescriptorType【可选】wDescriptorLength【可选】
用户321549 2016-5-3 10:08
用户377235 2015-11-16 18:41
好,写的不错
用户1818640 2014-11-13 17:01
sunxinjiang_422314417 2013-3-5 15:48
用户1034237 2012-9-17 15:04
用户213153 2009-8-19 10:42
用户1359843 2008-6-14 16:13
用户1193993 2008-6-13 16:30
用户384849 2008-5-4 02:23