USB HID设备报告描述符详解
power device hid报告描述
![power device hid报告描述](https://img.taocdn.com/s3/m/8363dfbdf71fb7360b4c2e3f5727a5e9856a27bd.png)
power device hid报告描述
HID (Human Interface Device) 报告格式通常用于描述那些通过 USB 接口与计算机通信的设备,例如键盘、鼠标、游戏控制器等。
这些报告包含描述设备属性和功能的详细信息,以便操作系统能够正确地识别和处理来自设备的输入。
一个HID 报告通常包含以下几个部分:
1. 描述符(Descriptor): 描述符是一个字节序列,它提供了有关设备的类型、子类和其他信息。
例如,它可能包括设备的供应商 ID、产品 ID、版本信息等。
2. 全局属性 (Global Properties): 这些属性描述了设备的一些全局设置,例如它是否支持数据报告、是否支持中断传输等。
3. 局部属性 (Local Properties): 这些属性提供了关于设备的功能和行为的
详细信息。
例如,如果设备是一个键盘,那么局部属性可能包括键盘布局、按键的数量和功能等。
4. 输入/输出元素 (Input/Output Elements): 这些元素描述了设备的数据元素,例如按钮、轴、开关等。
每个元素都有一个描述符,描述该元素的功能和行为。
在创建 HID 报告时,必须遵循特定的语法和格式规则,以确保操作系统能够正确地解析和处理报告。
这些规则是由 HID 规范定义的,任何想要创建HID 设备的制造商或开发者都必须遵守这些规范。
hid类键盘的报告描述符的理解
![hid类键盘的报告描述符的理解](https://img.taocdn.com/s3/m/52e1578077232f60dccca15f.png)
USB学习小记-HID类键盘的报告描述符的理解前言断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的。
利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧。
在学习过程中,刚开始主要参考了周立功编写的一本《PDIUSBD12 USB 固件编程与驱动开发》,后面的学习主要参考电脑圈圈的资料包,包括里面的HID类的英文协议文档,还有一位台湾前辈几年前写的几篇文章,还有网络下有下得到的一些例程。
在此感谢各位大虾前辈的分享。
一、学习流程1,先大致看下USB1.1中文版的协议(就是网上能找到的翻译版),先了解一下USB1.1的工作流程(可能此时的你会对其中很多内容都很含糊,不过没关系,请坚持!);2,选择一款最常用的USB芯片,比如我选择的NXP的PDIUSBD12.有很多使用该芯片的源码可以在上网搜索得到,而且周立功公司为其写了一本书,前面的章节对USB的工作流程作了一个简单而又清晰的讲解,而不致让人陷入协议的海洋里;3,有了对USB1.1协议的大致了解,选好了开发的平台(我刚好手上有一块周立功公司的EASEARM2200的开发板,上面有D12)之后,先跑一下附带的例程(此开发板配套的例程是基于UCOS2系统的,刚开始用它来参考肯定晕)。
没有能跑的例程,那就上网找一下经验证的例程,比如电脑圈圈在EDNCHINA建立的USB学习小组里有很好的几个例程,而且都是基于51+D12的,所以极具参考价值。
我是参考周立功公司出的那本书来学习的,电脑圈圈的例程与此书的例子书写风格较相似,所以可以互相参考。
如果也没有开发板,那可购买一套电脑圈圈他们搞活动的套件或者直接用51+D12自己搭一下,这样就可以直接用电脑圈圈写的例程了,可以避免走很多弯路。
4,有了例程的直观印象后,此时可以上BUS HOUND5.0了。
此软件可以观察到USB设备与主机(PC)之间的通讯数据,特别那11个标准请求的理解,通过此软件的观察,可以更好理解其相互之间是如何完成这个握手枚举过程的。
USBHID协议详情
![USBHID协议详情](https://img.taocdn.com/s3/m/333c047d14791711cc79179c.png)
USB HID类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB鼠标、USB键盘、USB游戏操作杆、USB触摸板、USB轨迹球、电话拨号设备、VCR遥控等等设备。
另外,使用HID设备的一个好处就是操作系统自带了HID类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API调用即可完成通信,所有很多简单的USB设备喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
1、HID设备描述符当插入USB设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID类,设备在定义描述符的时候必须遵守HID规范。
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、物理描述符。
HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
设备和主机的通信是通过报告的形式来实现的。
而物理描述符不是必需的。
5个标准描述符中与HID设备有关的部分有:设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为0。
接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备是一个启动设备(BootDevice,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。
如果为0则只有在操作系统启动后才能识别并使用您的HID设备)。
HID接口描述符中bInterfaceProtocol的含义bInterfaceProtocol的取值含0 NO1 键2 鼠3~255 保1.1 HID描述符HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。
USB HID报告及报告描述符简介
![USB HID报告及报告描述符简介](https://img.taocdn.com/s3/m/e7ad629851e79b89680226d8.png)
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以到下载,为了方便大家,我顺便上传了一份。
/Upload/Blog/2007/4/2/af7c3443-ad61-4465-ADC7-a74d28bbc322.zip下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。
code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application)//表示用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//用途最小值,这里为左ctrl键0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)//用途最大值,这里为右GUI键,即window键0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)//逻辑最小值为00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值为10x25, 0x01, // LOGICAL_MAXIMUM (1)//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75, 0x01, // REPORT_SIZE (1)//报告的个数为8,即总共有8个bits0x95, 0x08, // REPORT_COUNT (8)//输入用,变量,值,绝对值。
USBHID协议
![USBHID协议](https://img.taocdn.com/s3/m/8a6640e86f1aff00bed51ea2.png)
USB HID 类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB 鼠标、USB 键盘、USB 游戏操作杆、USB 触摸板、USB 轨迹球、电话拨号设备、VCR 遥控等等设备。
另外,使用HID 设备的一个好处就是操作系统自带了HID 类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API 调用即可完成通信,所有很多简单的USB 设备喜欢枚举成HID 设备,这样就可以不用安装驱动而直接使用。
1、HID 设备描述符当插入USB 设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID 类,设备在定义描述符的时候必须遵守HID 规范。
HID 设备的描述符除了 5 个USB 的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括 3 个HID 设备类特定描述符:HID 描述符、报告描述符、物理描述符。
HID 描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID 描述符。
设备和主机的通信是通过报告的形式来实现的。
而物理描述符不是必需的。
5 个标准描述符中与HID 设备有关的部分有:设备描述符中bDeviceClass 、bDeviceSubClass 和bDeviceProtocol 三个字段的值必须为0。
接口描述符中bInterfaceClass 的值必须为0x03 ,bInterfaceSubClass 的值为0 或1,为1 表示HID 设备是一个启动设备(Boot Device ,一般对PC 机而言才有意义,意思是BIOS 启动时能识别并使用您的HID 设备,且只有标准鼠标或键盘类设备才能成为Boot Device 。
如果为0 则只有在操作系统启动后才能识别并使用您的HID 设备)。
HID 接口描述符中bInterfaceProtocol 的含义bInterfaceProtocol 的取值含NO1键2鼠3~255保1.1 HID 描述符HID 描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID 设备只有一个HID 描述符。
USBHID键盘报告范文描述符
![USBHID键盘报告范文描述符](https://img.taocdn.com/s3/m/9c504d8085868762caaedd3383c4bb4cf7ecb763.png)
USBHID键盘报告范文描述符HIDScript脚本语言的理解:Globalitem--全局项Mainitem--主项localitem--局部项对于Main项,parer解释器,将顺序解释集合中的数据,并且,解释器解释完的数据,将按Main项出现的先后顺序,主要是Input和Output项,顺序拼接生成对应的数据bit位,解释器将以关键字Collection开始解释并拼接bit位信息,关键字EndCollection将结束paer解释器的工作,我把关键字Collection和关键字EndCollection叫做\集合\,关键字Collection和关键字EndCollection都是Mainitem主项,对应的控制字分别为:101000nn和110000nn,如果Collection后边有1个参数数据,那么即为:10100001=0某A1,如Collection(Application)翻译成控制码后为:0某A1,0某01;0某A1的1表示有1个参数数据,0某01表示Application在HID协议中规定的索引值为0某01,pc的HID驱动程序在parer解释器中会通过0某01得知,是对Application进行数据流位生成,就是说HID报告描述符(ReportDecriptor)所描述的数据流是为了Application使用的,Application在中包含两种设备:moue和keyboard,至于Collection(Application)里边描述的是moue还是keyboard,将具体的由Uage进一步限定,如:Uage(KeyBoard),也就是说明确告诉pc的HID驱动程序的paer解释器,接下来的这段信息最后生成出来的bit位数据信息,将交由pc的HID驱动程序中KeyBoard对应的API函数处理,当然这只是HID硬件设备开发者给pc的HID驱动程序的paer解释器提供的一个建议值,比如我们做DDK下的HID驱动二次开发,那么我们可以很随意,但是HID硬件设备开发者,建议使用的HID驱动程序API接口,最好遵守,因为HID硬件设备开发者比DDK开发人员更清楚送上来的bit数据流的真正物理意义.Input和Output是用来真正生成bit位流数据域的关键字,他们描述的东西是最后通过ub总线实实在在发送到pc或者从pc接收的数据位,当然这些bit数据流数据域所代表的意义以及某段bit位们所代表的意思以及这些bit将交由pc上HID驱动程序的哪一个API接口来做进一步解析(是moue还是keyboard),需要其他描述符来描述,比如前边的Uage就是其中的1个描述符,如果一个HID设备同时提供2种不同的功能,那么就会分别生成2个bit位流数据域,每个bit位流数据,将交由不同的驱动解析,比如,一个keyboard可能还集成了一个附属的鼠标功能,那么键盘数据信息将由HIDcript脚本描述的keyboard对应bit数据位流传送,moue数据将由HIDcript脚本描述的moue对应bit数据位流传送,但同一个Input 管道怎么能传送两个独立的数据流呢,答案很简单:不能,所以又引入了一个ReportID的概念,ID 用来标识多条独立的bit数据流,pc的HID驱动程序根据ID,将这些独立的bit数据流们路由到相应的API处理函数上去,进而不同的bit数据流数据最终都能够被自己对应的API驱动函数正确接收并解析处理.对于2字节、4字节等多字节数据的传输,是按小端模式little-endian进行的.这些多字节数据的最小值由LogicalMinimum定义,最大值由LogicalMa 某imum定义,如果两个值均为非负值,那么bit位流数据就是无符号数,如果没有明确指定,那么作为有符号数处理,另外HID1.1协议不允许传输浮点数据.硬件开发者应该时刻清除自己写的HIDcript脚本所描述的数据流将来应该由PC上的HID驱动程序怎么使用,另外对于硬件开发者来说,对于不允许PC驱动修改的bit 位数据,HID1.1协议制定者强烈建议采用NULL数值,最好不要随便填其他值.----------------------------------------------Mainitem--主项当前一共5个:1)Input2)Output3)Feature4)Collection5)EndCollection----------------------------------------------Globalitem--全局项当前一共13个:1)UagePage2)LogicalMinimum---var变量或array数组的逻辑最小值3)LogicalMa某imum4)PhyicalMinimum5)PhyicalMa某imum6)UnitE某ponent---单位的指数值,是10的指数7)Unit---单位索引号:可以是时间单位、电流单位、电压单位和距离单位等等.8)ReportSize9)ReportID---数据流的ID值设置10)ReportCount11)Puh12)Pop13)Reeved---保留----------------------------------------------localitem--局部项当前一共11个:1)Uage---定义UagePage下面某个功能item的起始索引值,比如Keyboard功能,LED功能等,这也告诉pc的HID解释器,Input或Output变量或数组的相应生成数据位用来描述Uage引用到的那个功能,如:用来描述Keyboard功能或LED功能等.2)UageMinimum---定义与array或bitmap关联的uage定义的某个功能下的起始值Uage作为UagePage的一个子功能索引号,同时Uage自己也有很多子功能,或者说有很多个子值,这里就是定义这些子值的范围值,之后和用Input或Output生成bit位数据流,进行相应关联.(可以用多维数组来说明,可能会更明确一点)前一个基础上Uage(6),当然在HIDDecriptorTool里边6有它的字符串名,即:Uage(Keyboard),然后80就是Keyboard里边的一个索引取值,查找之后是:KeyBoardLeftArrow,所以Uage_Minimum(80)就等于Uage_Minimum(KeyBoardLeftArrow)Uage的顺序先后和ReportCount定义的bit位组的先后顺序依次一一对应,UageMinimum和UageMa某imum之间的Uage的索引值也将依次与ReportCount定义的bit位组的先后顺序依次一一对应上。
STM32 USB HID详解
![STM32 USB HID详解](https://img.taocdn.com/s3/m/83497cf3172ded630b1cb6a2.png)
STM32 USB HID详解1、USB简介2、USB描述符USB只是一个总线,只提供一个数据通路而已。
USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为。
具体的一个设备实现什么功能,要由设备自己来决定。
那么,USB主机是如何知道一个设备的功能以及行为呢?这就要通过描述符来实现了。
描述符中记录了设备的类型、厂商ID和产品ID(通常依靠它们来加载对应的驱动程序)、端点情况、版本号等众多信息。
标准的USB设备有5种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。
下面详解:2.1、设备描述符一个USB设备只有一个设备描述符。
设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符。
配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
2.3、接口描述符在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符。
接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。
2.4、[类描述符]该描述符不是必须的,如果配置的USB类型有类特殊描述符(如HID类),它跟在相应的接口描述符之后。
在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符。
端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
2.6、[字符串描述符]字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。
3、USB HID为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。
除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。
hid协议报告描述总结
![hid协议报告描述总结](https://img.taocdn.com/s3/m/18483db448649b6648d7c1c708a1284ac9500563.png)
HID报告描述符主要内容整理●刚刚接触USB(HID)时对【报告描述符】感到难于理解, 因此就更无从下手。
下面根据2个主要的协议文本整理出一些常用信息, 不完整, 备忘。
⏹主要参考文本:⏹【协议文本1】: 《Device Class Definition for Human Interface Devices (HID)》Ver1.11【协议文本2】: 《Universal Serial Bus HID Usage Tables》Ver1.12每个协议文本后面的附录都有很多例子可供参考借鉴。
0、主要术语与概念(1)报告(Report): HID设备与主机交换信息的单位(报告字节数似乎没有限制);(2)报告描述符(Report Description): 用许多【项目】说明报告的格式与【用途】;(3)用途(Usage): 用于指出报告中某个数据域的意义或目的, 32bit。
高16bit用途页(Usage Page)指出用途的大类, 低16bit用途ID(Usage ID)指出用途大类下的子用途;(4)项目(Item):报告描述符用于说明数据域的某种属性的数据, 有短项目和长项目之分, 短项目1~5B, 长项目3~255B;(5)共有3种类型的项目: 主项目、全局项目(Global)、局部项目(Local);(6)主项目(Main Item)共有5个, 其中的Input、Output和Feature会产生实际的数据域并附带说明其操作特性(见2.1);其余2个Collection和End Collection是一对括号, 其间的内容构成一个【集合】, 用于限定集合中信息的整体特性;(7)全局项目(Global Item): 说明其后主项目产生的数据域的某方面特性, 一旦说明一直有效, 除非遇到一个新的全局项目说明改变其值;(8)局部项目(Local Item): 说明其后主项目产生的数据域的某方面特性, 但只对其后的一个主项目有效;(9)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】, 随着新的【全局项目】出现, 该表在不断变化。
USB的描述符详解总结
![USB的描述符详解总结](https://img.taocdn.com/s3/m/11d6b309c381e53a580216fc700abb68a982adcd.png)
USB的描述符详解总结U S B的描述符详解总结USB的描述符与命令请求详解⼀、描述符1.什么是描述符所谓描述符,就是⽤于描述设备特性的具有特定格式排列的⼀种数据组织结构。
2.描述符的作⽤描述符的作⽤在于设备向主机汇报⾃⼰的信息、特征,主机根据这些信息从⽽加载相应的驱动程序。
3.描述符的分类描述符分为三⼤类:标准描述符、设备类描述符、⼚商描述符。
除字符串描述符可选外,任何设备都必须包含剩下的⼏种标准描述符。
在中规定了5种标准的描述符:设备描述符配置描述符接⼝描述符端点描述符字符串描述符规定的设备类描述符有:集线器类描述符、⼈机接⼝类描述符。
下表是三种描述符的类型值:表描述符的类型值类型描述符描述符值标准描述符设备描述符(DeviceDescriptor) 0x01 配置描述符(ConfigurationDescriptor)0x02 字符串描述符(StringDescriptor)0x03 接⼝描述符(InterfaceDescriptor)0x04 端点描述符(EndPointDescriptor)0x05 (DeviceQualifierdescriptor) 0x06 (BOSdescriptor) 0x0F (DeviceCapabilitydescriptor) 0x10Document number:NOCG-YUNOO-BUYTT-UU986-1986UT4.设备类DeviceClass在描述符中,只有设备描述符和接⼝描述符中会有类别之分,即只有设备和接⼝会分类使⽤,不过有些类别的使⽤只需经过设备或接⼝的区分就可彻底清楚明⽩,这说明在设备类别和接⼝类别的定义上会有共同的类别名称。
⽽有些类别则是设备或接⼝独享的,下表是与使⽤设备相关的类别划分交叉或共【说明:】在设备或接⼝分类上均可彻底分清使⽤的(Usage=Both),即在任⼀处描述符中定义即可的分清楚使⽤的类(Usage=Both)的基本类有:02h-------------通信及CDC控制类;DCh------------诊断设备类;EFh-------------混杂设备类;FFh-------------⼚商定义的设备类。
USBHID设备报告描述符详解
![USBHID设备报告描述符详解](https://img.taocdn.com/s3/m/79081371b80d6c85ec3a87c24028915f804d840b.png)
USBHID设备报告描述符详解
USBHID设备报告描述符是一种描述USBHID设备报告的结构,用于定义设备报告的输入输出特性,允许设备与控制器的主机通信。
通常,报告描述符是一段二进制数据,其中包含由设备提供的输入和输出报告,以及描述报告的数据结构要求信息。
它是一种混合结构,由多个子块组成,每个子块又由一个或多个报告描述符中的域组成。
报告描述符的结构如下:
报告描述符
-
-bLengt
-bDescriptorTyp
-wDescriptorLengt
-数据
-输入报
-输出/特殊报
-特殊报
头部:报告描述符的头部包括三个字段:报告描述符的字节长度(bLength),报告描述符类型(bDescriptorType)和报告描述符的总长度(wDescriptorLength)。
bLength:报告描述符的字节长度,是报告描述符数据的字节数。
bDescriptorType:报告描述符类型,用于指示报告描述符的类型,必须为0x22
wDescriptorLength:报告描述符的总长度,用于指示报告描述符的总字节数。
数据段:数据段包括输入报告、输出/特殊报告和特殊报告。
输入报告:输入报告用于获取主机发送到设备的数据,一般由设备按定义的格式读取。
输出报告:输出报告用于将设备发送到主机的数据。
HID设备报告描述符详解_划出重点
![HID设备报告描述符详解_划出重点](https://img.taocdn.com/s3/m/72a23b838762caaedd33d435.png)
USB/HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control trans fer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(b ounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(str eam-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(inter rupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
关于USBHID协议以及鼠标键盘描述符的解释【转】
![关于USBHID协议以及鼠标键盘描述符的解释【转】](https://img.taocdn.com/s3/m/0903592fdc36a32d7375a417866fb84ae45cc39a.png)
关于USBHID协议以及⿏标键盘描述符的解释【转】转⾃:⼀.HID设备识别前⾯有提到关于SCSI协议的USB设备实现。
现在来谈谈USBHID设备。
HID全称Human Interface Device。
HID协议⾥增加了HID描述符和报告描述符,以及特定的关于HID的类请求。
HID设备的通信是通过报表来进⾏的。
据说,报告描述符是USB设备中最难的描述符了。
关于HID描述符可以参考HID协议。
接下来我们谈谈报告描述符。
⼆.报告描述符每⼀个HID设备都有⾃⼰的报告描述符。
报告描述符有三种类项⽬:Main类项⽬,Global类项⽬,Local类项⽬。
具体看下表Global作⽤域是遇到下⼀个同名Global,Local作⽤域是遇到下⼀个Main(Input,Output,Feature)。
Usage Min-Max表⽰有⼏种功能,Logical Min-Max表⽰有⼏种状态。
每个报告描述符都有报告ID,报告ID是⽤来区别复合设备的。
在报告描述符⾥没有写报告ID,默认报告ID是0。
USB的控制端点可以进⾏Input,Output,Feature项⽬的传输,中断端点可以进⾏Input,Output传输。
三.⿏标和键盘的报告描述符(1)键盘的报告描述符1. 0x05,0x01,// Global Generic Desktop2. 0x09,0x06,// Local KeyBoard3. 0xA1,0x01,// Main app collection4. 0x05,0x07,// Global KeyBoard5. //////////////////////////////////第1字节6. 0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)7. 0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)8. 0x15,0x00,// Global Logical Min9. 0x25,0x01,// Global Logical Max10. 0x95,0x08,// Global ReportCount11. 0x75,0x01,// Global ReportSize12. 0x81,0x02,// Main Input(Data,Var,Abs)13. //////////////////////////////////第2字节14. 0x95,0x01,// Global ReportCount15. 0x75,0x08,// Global ReportSize16. 0x81,0x03,// Main Input(Cnst,Var,Abs)17. //////////////////////////////////第3-8字节18. 0x95,0x06,// Global ReportCount19. 0x75,0x08,// Global ReportSize20. 0x15,0x00,// Global Logical Min21. 0x26,0xff,0x00,//Global Logical Max22. 0x19,0x00,// Local Usage Min23. 0x29,0x65,// Local Usage Max24. 0x81,0x00,// Main Output(Data,Ary,Abs)25. ////////////////////////////////1字节输出报告26. 0x15,0x00,// Global Logical Min27. 0x25,0x01,// Global Logical Max28. 0x95,0x05,// Global ReportCount29. 0x75,0x01,// Global ReportSize30. 0x05,0x08,// Global LED31. 0x19,0x01,// Local Usage Min32. 0x29,0x05,// Local Usage Max33. 0x91,0x02,// Main Output(Data,Var,Abs)34. ////////////////////////////////补⾜上⾯变成1个字节35. 0x95,0x01,// Global ReportCount36. 0x75,0x03,// Global ReportSize37. 0x91,0x03,// Main Output(Cnst,Var,Abs)38. 0xc0 // Main End collection键盘的描述符共有8字节的输⼊报告和1字节的输出报告。
HID设备描述符介绍
![HID设备描述符介绍](https://img.taocdn.com/s3/m/a887353b2e60ddccda38376baf1ffc4ffe47e2bf.png)
HID设备描述符介绍最近在做一个投票系统的上位机。
虽然是上位机,但还是要弄清楚下位机与自己的接口――HID。
因为windows下已经有一个usb监听程序――USB HOUND。
所以,我选择先写好下位机的程序,成功发送数据后,再进行上位机程序的编写。
下位机程序,重点在于HID设备的描述符配置。
什么是描述符?HID设备通过设备描述符来标识自己的设备信息,如设备ID、厂商名称、版本、配置数量等;通过配置描述符集合来标识自己的配置信息,包括:配置描述符(总述)、接口描述符(接口类型,鼠标,键盘,自定义设备等)、端点描述符(端点读写类型,支持的数据包属性等)和HID描述符(HID版本、下级描述符信息等)。
通过字符串描述符来定义自己的一些字符串,如厂商名称等;通过报告描述符来标识数据流的格式,如数据用途(鼠标、键盘、自定义等)、长度、大小等。
网上的很多示例和介绍都使用c语言,但是,我遇到的源码,却是汇编编写的,所以我以我的项目为例,用汇编来介绍各个描述符结构,也算是个不一样的体验吧。
具体的描述介绍如下:设备描述符deviceDesc: ; Device descriptorDB deviceDescEnd - deviceDesc ; bLength 该描述符长度DB DESC_TYPE_DEVICE ; bDescriptorType 类型DW 0200H ; bcdUSB (USB 2.0) USB 版本DB 00H ; bDeviceClass (given by interface) 类代码DB 00H ; bDeviceSubClass 子类代码DB 00H ; bDeviceProtocol 设备协议DB EP0_PACKET_SIZE ; 端点0最大包长DW 0451H ; idV endor (Texas Instruments) 厂商ID (VID)#if (chip==2531)DW 16A9H ; idProduct (CC2531 HID) 产品ID (PID)#elif (chip==2511)DW 16A5H ; idProduct (CC2511 HID)#elseDW 16A7H ; idProduct (CC1111 HID)#endifDW 0100H ; bcdDevice (v1.0) 设备版本号DB 01H ; iManufacturer 描述厂商的字符串索引DB 02H ; iProduct 描述产品的字符串索引DB 00H ; iSerialNumber 产品序列号字符串的索引DB 01H ; bNumConfigurations 可能的配置数deviceDescEnd:在里面,最重要的是VID和PID,它一般用来标识你的USB设备。
USBHID报告描述符详解
![USBHID报告描述符详解](https://img.taocdn.com/s3/m/e403a840bfd5b9f3f90f76c66137ee06eff94e08.png)
USBHID报告描述符详解
1、HID报告描述符介绍
USB人机界面设备,简称HID,是计算机系统中最常见的一种通信接口,它使用设备描述符(Device Descriptors)来描述设备特性,同时使用报告描述符(Report Descriptors)来描述设备支持的数据报文格式,操作系统或软件驱动可以根据报告描述符中设置的信息来识别HID设备所具有的功能,从而支持和控制HID设备。
HID报告描述符描述了与设备相关的数据信息,它是HID设备进行自然交互的基础。
2、HID报告描述符的作用
输入报告(Input Reports)可以被认为是从HID设备发送到操作系统的数据,它可以描述HID设备特性的状态,可以用来报告控制命令、操作状态、三轴分量数据等信息;输出报告(Output Reports)则相反,它表示从操作系统发送给HID设备的数据。
usbHid
![usbHid](https://img.taocdn.com/s3/m/c07e1208a76e58fafab00399.png)
一、应用场合USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。
用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。
另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。
所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
二、USB HID类可采用的通信管道所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。
控制管道主要用于以下3个方面:接收/响应USB主机的控制请示及相关的类数据在USB主机查询时传输数据(如响应Get_Report请求等)接收USB主机的数据中断管道主要用于以下两个方面:USB主机接收USB设备的异步传输数据USB主机发送有实时性要求的数据给USB设备从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据传输时,USB主机通过控制管道将数据传输给USB设备。
三、与USB HID设备有关的描述符HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,另一篇文章:USB开发基础--USB命令(请求)和USB描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。
除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为零。
接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS 启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。
HID报告描述详解
![HID报告描述详解](https://img.taocdn.com/s3/m/bbb0b12e7375a417866f8f8c.png)
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB 设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID 来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。
code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application)//表示用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//用途最小值,这里为左ctrl键0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)//用途最大值,这里为右GUI键,即window键0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)//逻辑最小值为00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值为10x25, 0x01, // LOGICAL_MAXIMUM (1)//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75, 0x01, // REPORT_SIZE (1)//报告的个数为8,即总共有8个bits0x95, 0x08, // REPORT_COUNT (8)//输入用,变量,值,绝对值。
USB设备键值表描述符说明
![USB设备键值表描述符说明](https://img.taocdn.com/s3/m/fcfc203254270722192e453610661ed9ac51554f.png)
USB设备键值表描述符说明1.1 设备描述符的结构偏移量/字节域大小/字节说明0 bLength 1 该描述符的长度1 bDescriptorType 1 描述符类型2 bcdUSB 2 USB版本4 bDeviceClass 1 类代码5 bDeviceSubClass 1 子类代码6 bDeviceProtocol 1 设备所使用的协议7 bMaxPackeSize0 1 端点0最大包长8 idVender 2 厂商ID10 idProduct 2 产品ID12 bcdDevice 2 设备版本号14 iManufacturer 1 描述厂商的字符串的索引15 iProduct 1 描述产品的字符串的索引16 iSerialNumber 1 产品序列号字符串的索引17 bNumConfigurations 1 可能的配置数2.1 配置描述符的结构偏移量/字节域大小/字节说明0 bLength 1 该描述符的长度1 bDescriptorType 1 描述符类型2 wTotalLength 2 配置描述符集合总长度4 bNumInterfaces 1 该配置所支持的接口数5 bConfigurationValue 1 该配置的值6 iConfigurations 1 描述该配置的字符串的索引值7 bmAttributes 1 该设备的属性8 bMaxPower 1 设备所需要的电流2.2 接口描述符的结构偏移量/字节域大小/字节说明0 bLength 1 该描述符的长度1 bDescriptorType 1 描述符类型2 bInterfaceNumber 1 该接口的编号3 bAlternateSetting 1 该接口的备用编号4 bNumEndpoints 1 该接口所使用的端点数5 bInterfaceClass 1 该接口所使用的类6 bInterfaceSubClass 1 该接口所使用的子类7 bInterfaceProtocol 1 该接口所使用的协议8 iConfiguration 1 描述该接口的字符串索引值2.3 HID描述符的结构偏移量/字节域大小/字节说明0 bLength 1 该描述符的长度1 bDescriptorType 1 描述符类型2 bcdHID 2 HID协议的版本4 bCountryCode 1 国家代码5 bNumDescriptors 1 下级描述符的数量6 bDescriptorType 1 下级描述符的类型7 wDescriptorLength 1 下级描述符的长度9 bDescriptorType 2 下级描述符的类型10 wDescriptorLength 2 下级描述符的长度... ... ...(可选)2.4 端点描述符的结构偏移量/字节域大小/字节说明0 bLength 1 该描述符的长度1 bDescriptorType 1 描述符类型2 bNumEndpointAddress 1 该端点的地址3 bmAttributes 1 该端点的属性4 wMaxPackeSize 2 该端点支持的最大包长度6 bInterval 1 端口的查询时间3.1 USB鼠标发送的数据结构USB鼠标发送的数据为4字节,在第1字节中,bit0为左键(1为按下,0为未按下),bit1为右键(1为按下,0为未按下),bit3为中键(1为按下,0为未按下),剩余五位为0,这是为了凑够1字节而填充一些数据。
hid协议报告描述总结
![hid协议报告描述总结](https://img.taocdn.com/s3/m/5bb31ec9561252d380eb6efb.png)
HID报告描述符主要内容整理刚刚接触USB(HID)时对【报告描述符】感到难于理解,因此就更无从下手。
下面根据2个主要的协议文本整理出一些常用信息,不完整,备忘。
●主要参考文本:⏹【协议文本1】:《Device Class Definition for Human Interface Devices(HID)》Ver1.11⏹【协议文本2】:《Universal Serial Bus HID Usage Tables》Ver1.12每个协议文本后面的附录都有很多例子可供参考借鉴。
0、主要术语与概念(1)报告(Report):HID设备与主机交换信息的单位(报告字节数似乎没有限制);(2)报告描述符(Report Description):用许多【项目】说明报告的格式与【用途】;(3)用途(Usage):用于指出报告中某个数据域的意义或目的,32bit。
高16bit用途页(Usage Page)指出用途的大类,低16bit用途ID(Usage ID)指出用途大类下的子用途;(4)项目(Item):报告描述符用于说明数据域的某种属性的数据,有短项目和长项目之分,短项目1~5B,长项目3~255B;(5)共有3种类型的项目:主项目、全局项目(Global)、局部项目(Local);(6)主项目(Main Item)共有5个,其中的Input、Output和Feature会产生实际的数据域并附带说明其操作特性(见2.1);其余2个Collection和End Collection 是一对括号,其间的内容构成一个【集合】,用于限定集合中信息的整体特性;(7)全局项目(Global Item):说明其后主项目产生的数据域的某方面特性,一旦说明一直有效,除非遇到一个新的全局项目说明改变其值;(8)局部项目(Local Item):说明其后主项目产生的数据域的某方面特性,但只对其后的一个主项目有效;(9)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】,随着新的【全局项目】出现,该表在不断变化。
USB HID设备报告描述符详解
![USB HID设备报告描述符详解](https://img.taocdn.com/s3/m/16804526af45b307e87197ea.png)
USB HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,out put和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
HID 报告描述符终极解析
![HID 报告描述符终极解析](https://img.taocdn.com/s3/m/3d18430aaf1ffc4ffe47ac87.png)
USB HID Report终极解析 HID的报告描述符巨难懂,关键是数据格式与每一位代表的意思。
经过三天的研究,终于将HID Report的每一个数据位的含义弄清楚了,现将数据解析如下,最后附上了一个HID 通信的Report例子。
以一个键盘的HID Report为例:键盘的HID报告描述符:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION};具体分析如下:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)// 分析根据HID短项目数据格式短项目的编码形式如下:0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节(BSize 用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,out put和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
所以“传输的数据”和“操作”只是一事件的两种描述方式。
用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名):Usage = (usage page:usage ID)举例说明:二个字节分别为x和y轴的位移数据,因此第一个字节的usage =(generic desktop:X),而第二个字节的usage = (generic desktop:Y),其中generic desktop为用途的大类别(称作用途类页)之一,x和y轴的操作用途属于此用途类页。
文件universal serial Bus HID Usage Table完整列出所有的usag e pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途。
该文件的附录A有十多个报告描述符的范例,值得研究下。
表1、报告描述符的标签标签:用途卷标只是报告描述符诸多标签的一个。
表1列出所有的卷标,利用这些卷标取可以清楚完整的描述符操作的用途。
报告描述符的语法不同于USB标准描述符,它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(p refix),然后跟着一个括号,内为该项目的数据:item = prefix(data)。
项目分成三种类别:主项目,全局项目,区域项目。
主项目中的input,oupu t,feature三个卷标用来表示报告中数据的种类,这些是报告描述符中最主要的项目,其他项目都是用来修饰这三种项目。
主要项目中其他二个卷标后面再作详细的介绍。
●Input 项:表示设备操作输入到主机的数据模式。
这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以get report(input)来传输,但是通常用中断型输入管线来传输以确保在每一固定周期内都能将更新的输入报告传给主机。
●Output项:表示由主机输出到装置操作的数据格式。
这个数据格式就形成一个输出报告。
输出报告通常不适用轮询的方式来传送给设备,而是由应用软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以set re port(output)指令来将报告送到设备。
当然也可以选择用中断型输出管线来传送,只是通常不建议这样用。
●Feature项:表示由主机送到设备的组态所需数据的数据格式。
这个数据模式就形成一个特征报告。
特征报告只能用控制型管线以get report(feature)和set report(feature)指令分别来取得和设定设备的特征值。
●范例:考虑一个2X16字的显示装置,它的列数、行数、字宽、和字高为固定值属于feature报告;显示状态例如“就绪”和“输入字错误”则属于in put报告;光标位置和显示的字需可读写,所以属于另一个feature报告;更新显示的字则为output报告。
为了区别两个features,要用到全局项目中的report ID,每个feature报告有一个不同的report ID,因而主机请求指令要加上report ID的值:get report(feature,report ID)和Set report(feature,report ID)。
主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全局项目和区域项目。
顾名思义,区域性项目只能适用于列于其下的第一个主项目,不适用于其他主项目,若一个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主项目。
相反,全局性项目适用于其下方的所有主项目,除非另一个相同卷标的全局性项目出现。
为了清楚说明报告描述符,将使用“项目状态表”(item state table)用来表示在某位址处适用的全局性项目的组合。
图1显示全局性项目和区域性项目与所描述的主项目之对应关系。
区域性项目卷标:简单地说,区域性项目(见表1)只是说明用途而已。
Designator是要搭配实体描述符使用的,这里不对实体描述符进行介绍,所以略过这些designator标签。
标签Usage 实际上应该称作Usage ID,它搭配全域项目的Usage Page 卷标才形成前文所定义的用途{usage}﹔但是报告描述符允许在区域项目的Usage 卷标直接用32位的方式来指定用途,这种方式称作扩充式用途指定法(extended usage)以示区别。
例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyb oard:0),和Usage Maximum(Keyboard:101)。
很明显的,扩充式用途指定法会取代『项目状态表』中的Usage Page。
还有,使用扩充式用途指定法时,数据的高16 个位为用途类页Usage Page,低16 个位则为用途识别名Usage ID。
往往一个报告数据会对应到几个操作,因而会有几个用途,例如101 按键的键盘利用不同代码代表不同的键,每一个键是一个操作,有自己的用途,要将所有Usage ID 列出不太现实,所以就需要Usage Minimum 和Usage Maximum 二个标签。
以键盘为例,主项目之上只要二个区域项目:Usage Minimum (0), Us age Maximum (101)。
如此一来,则无键按下(Usage ID 为0)和101 键中任一键被按下(Usage ID 为1 至101)的用途都被赋于到一个报告数据上,后面会有一个范例进一步解说。
卷标String Index 类似卷标Usage,而卷标String Minimum 和String Ma ximum 则类似标签Usage Minimum 和Usage Maximum。
如果希望某个操作对应到一个字串,则用String Index 来描述该操控的报告数据,这个字符串在字符串描述符中,StringIndex (data)项目中的data 是这个字符串在字符串描述符中的位置索引。
如果需要用到几个字符串,则可以使用String Minimum 来指向字符串描述符中被用到字符串的最先位置索引,和String Maximum 来指向最后位置索引。
标签Delimiter 很少用到,请参考Universal Serial Bus HID Usage Tables 文件中Appendix B 的范例详细说明。
全局项目卷标全局项目的卷标事实上只要Usage Page,Logical Minimum,Logical Maxi mum,Report Size,Report ID,Report Count 就足够了。
表2 列了二个音量操作的例子(音量增减键和音量旋钮)将用来辅助说明这些卷标,不过主项目括号内的数据会在后文中再做说明。
表2、音量操作举例查阅Universal Serial Bus HID Usage Tables 文档,这两个例子的用途需要令为(Consumer: Volume)。
Usage Page 前面已经介绍过了。
Report Size 用来设定主项目(Input,Output,Feature)的报告字段大小,它的单位是位。
主项目会对每个操作产生一个报告字段,字段大小则由Report Size 决定。
而Report Count 用来设定主项目之报告字段的数目,其等于操作的数目。
音量增减键的例子中ReportCount (1)表示主项目Input 只产生一个字段,所以可知只有一个音量增减键﹔而Report Size (2)表示这个字段为2 位。
另一个音量旋钮例子也是只有一个旋钮,所以用Report Count (1)﹔但是因为Report Size (7),所以该旋钮的数据字段为7位,可以表示0到127之数值。
再举一例,如果是鼠标的三个按键,每个按键占用一个一位的字段,则Report Size (1), Report Count (3)﹔那么这个报告长度为三个位,可以同时呈现出三个按键的状态(原状或被按下)。
Logical Minimum 和Logical Maximum 在说明每个报告字段的数值范围,这是纯数值所以称为逻辑数值(logical value)。
音量增减键的例子中Logical Mini mum (-1),Logical Maximum (1)表示只会出现-1, 0, 1 三种数值,所以用到二位(即ReportSize(2)),0b11 代表-1,0b00 代表0,0b01 代表1。
在音量旋钮例子中,虽然用7 位作一字段,但是旋钮仅会产生0 到100 的数值,因为Logica l Minimum (0)和Logical Maximum (100)。