《USB的HID通信协议模版.docx》由会员分享,可在线阅读,更多相关《USB的HID通信协议模版.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、USB 事务处理是主机和设备之间数据传输的根本单位,由一系列具有特定格式的信息包组成。因此,要了解完整的 USB 通信协议,必需从 USB 的信息传输单元包及其数据域谈起。通过由下而上,从简洁至简洁的通信协议单位组成各种简洁的通信协议,进而构建出完整 的通信协议。16.4.1 包包Packet是 USB 系统中信息传输的根本单元,全部数据都是经过打包后在总线上传输的。首先了解一下包的组成。USB 包由五局部组成,即同步SYNC字段、包标识符PID字段、数据字段、循环冗余校验CRC字段和包结尾EOP字段,包的根本格式如下:同步字段SYNC PID 字段 数据字段 CRC 字段 包结尾字段EOP在
2、 USB 的数据传输中,全部的传输包都起始于SYNC,接着是 PID,后面是包中所包含的数据信息,接下来是用来检测包中数据错误的循环冗余校验信息,最终以包结尾作为完毕标志。下面我们将一一介绍每个字段。1. 同步SYNC字段SYNC 字段由 8 位组成,作为每个数据信息包的前导。顾名思义,它是用来产生同步作用的,目的是使 USB 设备与总线的包传输率同步,它的数值固定为00000001。2. 包标识符PID字段PID 字段是紧随在 SYNC 字段后面,用来表示数据信息包的类型。在USB 协议中,依据PID 的不同,USB 包有着不同的类型,分别表示具有特定的意义。如下所示:PID0 PID1 P
3、ID2 PID3包标识符长度为一个字节8 个数据位,由 4 个位的包类型字段和 4 个位的校验字段构成。PID 是 USB 包类型的唯一标志,USB 主机和 USB 设备在接收到包后,必需首先对包标识符解码得到包的类型,并推断其意义从而做出下一个反响。包标识符中的校验字段是通 过对类型字段的每个位求反码产生的,它是用来对包类型字段进展错误检测用的,旨在保 证对包的标识符译码的牢靠性,假设4 个检验位不是它们各自的类型位的反码,则说明标识符中的信息有错误。表 16-2 中列出了信息包的类型,包括令牌、数据、握手或特别四种信息包类型。为简化对USB 的生疏,有关高速传输的局部没有在表中列出。3.
4、数据字段在 USB 包中,数据字段是用来携带主机与设备之间要传递的信息,其内容和长度依据包标识符、传输类型的不同而各不一样。并非全部的USB 包都必需有数据字段,例如握手包、专用包和 SOF 令牌包就没有数据字段。在 USB 包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是首先传输字节的最低位,最终传输字 节的最高位。(1) 设备地址ADDR数据域ADDR 数据域由 7 位组成,可用来寻址多达 127 个外围设备。(2) 端点ENDP数据域ENDP 数据域由 4 位组成。通过这 4 个位最多可寻址出 32 个端点。这个 ENDP 数据域仅用在 IN、OUT 与
5、 SETUP 令牌信息包中。对于慢速设备可支持端点0 以及端点 1 作为中断传输模式,而全速设备则可以拥有 16 个输入端点IN与 16 个输出端点OUT共 32 个端点。(3) 帧序列号当 USB 令牌包的 PID 为 SOF 时,其数据字段必需为 11 位的帧序列号。帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。当帧序列号到达最大数时将自动从0 开头循环。(4) 数据它仅存于 DATA 信息包内,依据不同的传输类型,拥有不同的字节大小,从0 到 1023 字节实时传输。4. 循环冗余校验CRC字段依据不同的信息包类型,CRC 数据域由不同数目的位所组成。其中重要的数据信息
6、包承受CRC16 的数据域16 个位,而其余的信息包类型则承受CRC5 的数据域5 个位。其中的循环冗余码校验 CRC,是一种错误检测技术。由于数据在传输时,有时候会发生错误,因此 CRC 可依据数据算出一个校验值,然后依此推断数据的正确性。5. 包结尾EOP字段包的发送方在包的结尾发出包结尾信号。它表现为差分线路的两根数据线保持2 比特低位时间和 1 比特空闲位时间。USB 主机依据 EOP 推断数据包的完毕。16.4.2 信息包格式依据信息包所实现的功能,其可以分为3 种类型:令牌包、数据包和握手包。其中,令牌包定义了数据传输的类型,数据包中含有需要传输的数据,握手包指明白数据接收是否成功
7、。1. 令牌token包在 USB 系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类型,它是事务处理的第一阶段。令牌包格式如下:8 位 8 位 7 位 4 位 5 位SYNC PIDADDR ENDP CRC5令牌包中较为重要的是 SETUP、IN 和 OUT 这三个令牌包。它们用来在根集线器和设备端点之间建立数据传输。一个 IN 包用来建立一个从设备到根集线器的数据传送,一个OUT 包用来建立从根集线器到设备的数据传输。IN 包和 OUT 包可以对任何设备上的任何端点编址。一个 SETUP 包是一个 OUT 包的特别情形,它是“高优先级的”,也就是说设备必需承受它,即使设备正在进展数
8、据传输操作的过程中也要对其进展响应。SETUP 包总是指向端点 0 的。2. 数据data包一个数据信息包包含了 4 个数据域:SYNC、PID、DATA 与 CRC16。在这里要留意的是DATA 数据域内所放置的位值,需依据USB 设备的传输速度慢速、高速与全速以及传输类型中断传输、批量传输、等时传输而定,且须以8 字节为根本单位。也就是,假设传输的数据缺乏 8 字节,或传输到最终所剩余的也缺乏8 字节,仍须传输 8 字节的数据域。格式如下:8 位 8 位 01023 字节 16 位SYNC PIDDATA CRC163. 握手Handshake包握手信息包是最简洁的信息包类型。在这个握手信
9、息包中仅包含一个PID 数据域而已,它的格式如下所列:8 位 8 位SYNC PID其中仅包含 SYNC 与 PID 两个数据域。16.4.3 事务在 USB 上数据信息的一次接收或发送的处理过程称为事务处理Transaction。事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理、设置(SETUP)事务处理和帧开头、帧结尾等类型。在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接着 SETUP 和 OUT 包后的是 DATA 包,DATA0 和 DATA1 包是交替地发送的,在 DATA 包后面,设备将回应一个握手信号,假设设备可以接收数据,就回应ACK 包,假设设备忙
10、,就回应 NAK 包,假设设备出错,则回应 STALL 包;在 IN 事务中,IN 包后面是设备发来的 DATA 包或 NAK 包或 STALL 包,假设设备忙或出错,就发 NAK 包或 STALL 包给主机,假设设备数据预备好发送,则发 DATA 包,DATA0 和 DATA1 包也是交替地发送的,紧接着DATA 包后面是主机发给设备的握手包,ACK 表示主机可以接收数据,NAK 包代表主机忙,STALL 包代表主机出错。下面我们再分别介绍这些事务。1输入IN事务处理输入事务处理表示 USB 主机从总线上的某个 USB 设备接收一个数据包的过程,接下来分析输入事务处理的各种典型状况:(1)
11、正常的输入事务处理1. 主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC52. 设备-主机(数据信息包) SYNC DATA0 DATA CRC163. 主机-设备(握手信息包) SYNC ACK(2) 设备忙时的输入事务处理1. 主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC52. 设备-主机(握手信息包) SYNC NAK(3) 设备出错时的输入事务处理1. 主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC52. 设备-主机(握手信息包) SYNC STALL2输出OUT事务处理(1) 正常的输出事务处理1. 主机-设备(令牌信
12、息包) SYNC OUT ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备-主机(握手信息包) SYNC ACK(2) 设备忙时的输出事务处理1. 主机-设备(令牌信息包) SYNC OUT ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备-主机(握手信息包) SYNC NAK(3) 设备出错时的输出事务处理1. 主机-设备(令牌信息包) SYNC OUT ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备
13、-主机(握手信息包) SYNC STALL3设置SETUP事务处理(1) 正常的设置事务处理1. 主机-设备(令牌信息包) SYNC SETUP ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备-主机(握手信息包) SYNC ACK(2) 设备忙时的设置事务处理1. 主机-设备(令牌信息包) SYNC SETUP ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备-主机(握手信息包) SYNC NAK(3) 设备出错时的设置事务处理1. 主机-设备(令牌信息包) SYN
14、C SETUP ADDR ENDP CRC52. 主机-设备(数据信息包) SYNC DATA0 DATA CRC163. 设备-主机(握手信息包) SYNC STALL16.4.4 USB 传输类型在 USB 的传输中,制定了 4 种传输类型:把握传输、中断传输、批量传输以及实时传输。这里只具体介绍把握传输,其他传输类型只作简要说明。1. 把握传输把握传输是 USB 传输中最重要的传输,唯有正确地执行完把握传输,才能进一步正确地执行其他传输模式。由于每个 USB 设备可能速度、传输的包的大小等信息有可能不同,因此每个USB 设备内部都记录着该设备的一些信息也就是接下来将要介绍的设备描述符,当
15、在主机上检测到USB 设备时,系统软件必需读取设备描述符,以确定该设备的类型和操作特性,以及对该设备进展相应的配置,这些工作都是通过把握传输来完成。每个USB 设备都必需实现一个缺省的把握端点,该端点总是 0 号端点。把握传输类型分为 23 个阶段:设置阶段、数据阶段很多据把握没有此阶段以及状态阶段。依据数据阶段的数据传输的方向,把握传输又可分为3 种类型:把握读取读取USB 描述符、把握写入配置 USB 设备以及很多据把握。以下介绍各阶段的工作。阶段一:设置阶段USB 设备在正常使用之前,必需先配置,本阶段由主机将信息传送给USB 设备,定义对USB 设备的恳求信息如:读设备描述符。主机一般
16、会从USB 设备猎取配置信息后再确定此设备有哪些功能。作为配置的一局部,主时机设置设备的配置值。我们统称这一阶段 为设置阶段。设置阶段由设置事务完成,也就是该阶段包含了SETUP 令牌信息包、紧随其后的 DATA0数据信息包该信息包里的数据即为设备恳求,本章将后续介绍以及ACK 握手信息包。它的作用是执行一个设置的数据交换,并定义此把握传输的内容。阶段二:数据传输阶段数据传输阶段是用来传输主机与设备之间的数据。把握读取是将数据从设备读到主机上,读取的数据USB 设备描述符。该过程如图 16-8 所示。对每一个数据信息包而言,首先,主时机发送一个IN 令牌信息包,表示要读数据进来。然后,设备将数
17、据通过 DATA1 数据信息包回传给主机。最终,主机将以以下的方式加以响应:当数据已经正确接收时,主机送出ACK 令牌信息包;当主机正在劳碌时,发出NAK 握手信息包;当发生了错误时,主机发出STALL 握手信息包。把握写入则是将数据从主机传到设备上,所传的数据即为对USB 设备的配置信息,该过程如图 16-9 所示。对每一个数据信息包而言,主机将会送出一个OUT 令牌信息包,表示数据要送出去。紧接着,主机将数据通过DATA0 数据信息包传递至设备。最终,设备将以以下方式加以响应:当数据已经正确接收时,设备送出ACK 令牌信息包;当设备正在劳碌时,设备发出 NAK 握手信息包;当发生了错误时,
18、设备发出STALL 握手信息包。阶段三:状态阶段状态阶段用来表示整个传输的过程已经完全完毕了。请留意,状态阶段传输的方向必需与数据阶段的方向相反。即原来是 IN 令牌信息包,这个阶段应为 OUT 令牌信息包;反之, 原来是 OUT 令牌信息包,这个阶段应为 IN 令牌信息包。对于把握读取而言,主时机送出OUT 令牌信息包,其后再跟着 0 长度的 DATA1 信息包。而此时,设备也会做出相对应的动作,送 ACK 握手信息包、NAK 握手信息包或 STALL 握手信息包。相对地对于把握写入传输,主时机送出 IN 令牌信息包,然后设备送出表示完成状态阶段的0 长度的 DATA1 信息包,主机再做出相
19、对应的动作:送ACK 握手信息包、NAK 握手信息包或 STALL 握手信息包。2. 实时传输实时传输适用于必需以固定速率抵达或在指定时刻抵达,可以容忍间或错误的数据上。实时传输一般用于麦克风、喇叭等设备。实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。3. 批量传输用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。4. 中断传输中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从 USB 设备到主机。16.4.5 设备列举1. 描述符USB 描述符就似乎是 USB 外围设备的“身份证”一样,具体地记录着外围
20、设备相关的一切信息。为了描述不同的数据,就需以不同类型的USB 描述符来加以描述,它共有以下几种类型:设备描述符、配置描述符、接口描述符和端点描述符,这几个描述符是必需具有的, 下面将结合实例具体介绍;其他的描述符,例如,字符串描述符、数种不同的群组描述符 以及报告描述符则可以依据不同的设备进展选择。(1) 设备描述符设备描述符具有 18 字节的长度,并且是主机向设备恳求的第一个描述符。以以下出设备描述符的范例、数值以及各个字段的意义:DeviceDesc: ;表示设备描述符.byte $12 ; bLength 域,表示该描述符的字节长度为 18 个字节.byte $01 ; bDescri
21、ptorType 域描述符类型,1 代表设备.byte $10,$01 ; bcdUSB 域表示符合 USB 1.10 标准,$210 代表 2.10 标准.byte $00 ; bDeviceClass 域,群组码,0 表示每个接口都有自身的群信息,;不同的接口操作相互独立.byte $00 ; bDeviceSubClass 域,设备次群组假设群组码为 0,设备次群组必需为 0.byte $00 ; bDeviceProtocol 域,设备协议0 表示无群组特定协议.byte $08 ; bMaxPacketSize0 域,端点 0 的最大信息包大小只能为 8、16、32 或 64.byt
22、e $70,$0C ; idVendor 域,制造商 ID2 字节.byte $00,$00 ; idProduct 域,产品 ID2 字节.byte $00,$01 ; bcdDevice 域,以 BCD 表示设备发行序号2 字节.byte $01 ; iManufacturer 域,制造商的字符串描述符索引1 字节,本实例中指; String1Desc 处的字符串描述符.byte $02 ; iProduct 域,产品的字符串描述符索引1 字节,本实例中指; String2Desc 处的字符串描述符.byte $00 ; iSerialNumber 域,设备序号的字符串描述符索引1 字节,
23、;本实例中指 String0Desc 处的字符串描述符.byte $01 ; bNumConfigurations 域,配置数目为 1(2) 配置描述符配置描述符具有 9 字节的长度,针对设备赐予配置的信息。以以下出配置描述符的范例、数值以及各个字段的意义:ConfigDesc: ;表示配置描述符.byte $09 ; bLength 域,表示该描述符的字节长度为 9 个字节1 字节.byte $02 ; bDescriptorType 域,描述符类型,2 代表配置1 字节.byte $20,$00 ; wTotalLength 域,描述符的总长度为 32 个字节,包括配置描述符; 9 字节,
24、接口描述符 9 字节,两个端点描述符各 7 字节.byte $01 ; bNumInterfaces 域,该配置支持的接口数目1 字节.byte $01 ; bConfigurationValue 域,配置值,作为 Set Configuration 恳求的配置值.byte $00 ; iConfiguration 域,配置的字符串描述符的索引1 字节.byte $C0 ; bmAttributes 域,配置的属性自供电,不具有远程唤醒的特征.byte $00 ; MaxPower 域,表示当 USB 设备操作时,它从总线上;获得的最大电源以 2mA 为单位(3) 接口描述符接口描述符具有 9
25、 字节的长度,用来描述每一个设备的接口特性。以以下出接口描述符的范例、数值以及各个字段的意义:InterfaceDesc: ;表示接口描述符.byte $09 ; bLength 域,表示该描述符的字节长度为 9 个字节.byte $04 ; bDescriptorType 域,描述符类型,4 代表接口.byte $00 ; bInterfaceNumber 域,接口数目以 0 为基值表示一个接口.byte $00 ; bAlternateSetting 域,交互设置值为 0由于只有一个接口.byte $02 ; bNumEndpoints 域,端点数目设置为 2.byte $FF ; bIn
26、terfaceClass 域,接口群组,$FF 表示是供给商说明书.byte $01 ; bInterfaceSubClass 域,接口次群组.byte $FF ; bInterfaceProtocol 域,接口协议,$FF 表示该接口使用的;是供给商说明的协议.byte $00 ; iInterface 域,接口的字符串描述符的索引,本实例没有(4) 端点描述符端点描述符具有 7 字节长度,用来描述端点的属性以及各个端点的位置。该实例中有两个端点,我们首先介绍端点 1 描述符:Endpoint1Desc: ;表示端点 1 描述符.byte $07 ; bLength 域,表示该描述符的字节长
27、度为 7 个字节.byte $05 ; bDescriptorType 域,描述符类型,5 代表端点.byte $81 ; bEndpointAddress 域,端点地址0x81IN,0x02=OUT,;本实例端点编号为 1 且为 IN 端点.byte $03 ; bmAttributes 域,传输类型的属性设置为中断传输;0把握,1实时,2批量,3中断.byte $08,$00 ; wMaxPacketSize 域,最大信息包的大小设置为 8 个字节.byte $0A ; bInterval 域,轮询间隔,以 ms 为单位,在此设置为 10ms接下来介绍端点 2 描述符: Endpoint2
28、Desc: ;表示端点 2 描述符.byte $07 ; bLength 域,表示该描述符的字节长度为 7 个字节.byte $05 ; bDescriptorType 域,描述符类型,5 代表端点.byte $02 ; bEndpointAddress 域,端点地址0x81IN,0x02=OUT,;本实例端点编号为 2 且为 OUT 端点.byte $03 ; bmAttributes 域,传输类型的属性设置为中断传输;0把握,1实时,2批量,3中断.byte $08,$00 ; wMaxPacketSize 域,最大信息包的大小设置为 8 个字节.byte $0A ; bInterval
29、域,轮询间隔,以 ms 为单位,在此设置为 10ms2. USB 设备恳求在 USB 接口的通信协议中,由于主机是取得确定的主控权,因此,主机与设备之间就必需遵循某种已沟通的特定命令格式,以到达通信的目的。而这个命令格式就是USB 标准书中所制定的“设备恳求”。这个设备恳求的设置、去除与取得都须通过把握传输的数据交换来完成。表 16-3 中列出了标准设备恳求的数据格式内容。表 16-3 各字段含义解释如下。bmRequestType 域打算了特定恳求的特征,该域的D7 表示在把握传输的数据阶段,数据传输的方向。假设 wLength 的值为 0,表示没有数据阶段,该位可以无视; D6:5表示了该
30、恳求所属的类型,USB 标准中定义了全部的 USB 设备必需支持的一系列的标准恳求,此外,群组和供给商也可以定义一些其他的恳求;D4:0表示接收 端,恳求可以针对设备、接口或设备的一个端点,当针对一个接口或端点时,wIndex 域打算了是哪个接口或端点。bRequest 域表示特定恳求,假设 bmRequestType 域的类型字段为 0,可以依据 USB 指定的一系列的标准恳求,结合该域的值,知道这是什么恳求。将在下面介绍这些恳求。wValue 域的值依据恳求的不同而不同,用来传递一个参数给设备。wIndex 域的值依据恳求的不同而不同,用来指定一个接口或端点。wLength 域表示把握传输
31、的数据阶段中传输数据的字节大小,数据传输的方向由bmRequestType 域中的 D7 位打算,假设该域的值为 0,表示没有数据阶段。下面结合实例分别介绍几个主要的设备恳求。(1) 去除特性(Clear Feature)该恳求是用来取消一个特性,其格式如下: bmRequestType bRequest wValue wIndex wLength Data 00000000B(设备)00000001B(接口)00000010B(端点) CLEAR_FEATURE01H 特性选择 0接口端点 0 无该恳求中的 wValue 表示特性选择器,它对应的值为:0端点,1设备。当某个特性不允许取消,或
32、该特性根本不存在,或者是指向一个根本不存在的接口或端点时, 该恳求将会导致设备恳求失败。假设端点被固件设为停顿状态,主机软件(总线驱动程序)也可以发送一个值为 0 的 CLEAR_FEATURE 命令去除该端点的停顿状态,本实例中就是这样使用该恳求的。(2) 取得描述符(Get Descriptor)该恳求可以取得 USB 设备中存在的特定的描述符,其格式如下: bmRequestType bRequest wValue wIndex wLength Data 10000000B GET_DESCRIPTOR06H 描述符类型与描述符指针 0 或语言 ID 描述符的长度 各个描述符该恳求中的
33、wValue 的高字节表示要取得描述符类型,低字节表示描述符的索引值, 描述的类型有:1 表示设备描述符,2 表示配置描述符,3 表示字符串描述符,4 表示接口描述符,5 表示端点描述符。wIndex 的值为 0 或语言 ID;当要取得描述符是字符串描述符时,该域的值为语言 ID;当为其他的描述符时,该域为0。wLength 表示要返回的数据长度,假设 SETUP 阶段的地址使用的是预设地址0ENDP 字段为0,这时的 wLength 值会大于实际的描述的值。这是为什么呢?缘由是用户以预设的地址 0 来取得设备描述符时,不管设多少字节,用户最多只取其前8 字节,即在把握传输过程只有一次数据阶段
34、。但是,假设用户以的地址ENDP 字段不为 0来取得设备描述符时,这时 wLength 的值就要留意了。(3) 设置地址(Set Address)该恳求给 USB 设备设置地址,从而可以对该USB 设备进展进一步的访问。其格式如下:bmRequestType bRequest wValue wIndex wLength Data00000000B SET_ADDRESS05H 设备地址 0 0 无该恳求与其他的恳求有一个重要的不同点,该恳求下,USB 设备始终不转变它的地址,直到该恳求的状态阶段被成功地完成,而其他恳求的操作都是在状态阶段之前完成,可以阅读本实例加深对该点的理解。假设特定的设备
35、地址大于127,或者 wIndex 或 wLength 为非 0 值,那么该恳求不执行。(4) 设置配置(Set Configuration)该恳求对设备进展设置。其格式如下:bmRequestType bRequest wValue wIndex wLength Data 00000000B SET_CONFIGURATION09H 设置值 0 0 无该恳求中的 wValue 域的低字节表示设置的值,该值必需为0 或者与配置描述符中的配置值相匹配。假设设置值等于 0,表示设备在地址状态。假设 wIndex 或 wLength 为非 0 值,那么该恳求不执行。另外还有其他的恳求,这里不再具体介绍,读者可以参考相关的资料。 在学习了描述符和 USB 设备恳求的根底上,接下来就能进展设备列举了。3. 设备列举设备列举可以简洁地概括为这样的一个过程:主机通过USB 设备恳求来取得设备描述符并对该设备进展配置。该过程可以简化为如下5 个步骤:第一步,使用预设的地址 0 取得设备描述符。其次步,设置设备的地址。第三步,使用地址取得设备描述符。第四步,取得配置描述符。第五步,设置配置描述符。设备列举使用的是把握传输。上述的5 个步骤必需符合把握传输的根本架构,第一步、第三步和第四步使用的是把握读取,其次步和第五步使用的是很多据把握。