HID设备报告描述符详解_划出重点
HID报告描述符
基于HID 类的USB 人机接口设计作者:北京交通大学 涂晓强 周洪利 来源:本站原创 点击数:235 更新时间:2007-11-27您可以添加到网摘 让更多人关注此文章:目前市场上USB 设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB 设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID )。
这里介绍如何实现HID 类设备,以及如何在应用程序中对HID 类设备进行访问。
从Windows98操作系统开始,为HID 类设备提供了通用的驱动程序,所以只要按照HID 设备类的规范编写设备的固件程序,就能够让Windows 系统自动识别设备,省去了复杂的驱动程序编写过程。
1 HID 协议简介人机接口设备(HID )主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID 设备不一定非要是这些人机交互设备,只要符合HID 设备级定义规范要求的都可以认为是HID 设备。
HID 设备有以下主要特点:① 交换的数据存储在报告的结构内,设备必须支持HID 报告格式。
② 每笔事务可以携带小量或中量的数据。
低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;③ 有最大传输速度的限制。
低速设备最快10 ms 一笔事务,最高速度为800 B/s ;全速设备最快1 ms 一笔事务,最高速度为64 KB/s ;高速设备最快125 μs 一笔事务,最高速度为24.576 MB/s 。
④ 没有传输速度的保证。
当插入USB 设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID 类别,设备在定义描述符的时候必须遵守HID 规范。
图1显示了HID 各种描述符之间的关系。
事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。
图1 HID各种描述符之间的关系从图1中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。
USB HID报告描述符详解
USB 之人性化接口装置的报告描述元(1)作者: 林锡宽e-mail: sklin@.tw(原文刊于e 科技杂志vol. 30,2003 年6 月号)关于USB 的标准描述元已经在 e 科技杂志的第24 和25 期中作了完整的介绍。
有些读者来函希望能早日刊出报告描述元的介绍。
人性化接口装置HID 的类别特定描述元有三种,其中HID 描述元因为需要连接在接口描述元(标准描述元之一)之后,所以也已经在前文介绍了。
其他二个HID 类别特定描述元为报告描述元和实体描述元。
实体描述元几乎很少使用到,所以不拟介绍,虽然它不会很复杂。
本文仅专注介绍报告描述元。
相对来说,报告描述元最复杂,也不容易理解,可是却最重要,因为HID 装置与主机间的经常性数据传输都由报告描述元来规范。
因为报告描述元的复杂和难理解,使得此文的编撰花了不少时间,因此无法在上次刊完USB 标准描述元后,接着刊出。
由于内容篇幅颇长,所以仅能分为三篇陆续刊出。
本期的第一篇中仅介绍到区域性项目,下期的第二篇再继续介绍全局性项目和主项目。
这三类项目构成一个报告描述元。
最后仍需要以一个实际的范例来解说使用方法,所以第三篇文章将提供一个实际的范例:整合鼠标的键盘装置。
此外,也会将该范例的韧体程序代码提供给有兴趣的读者。
这个韧体程序代码不只是该范例的报告描述元,也含括了它的标准描述元。
概述报告(report)在这里意指数据传输(data transfer),而报告描述元则是对这些传输的数据作用途(usage)的说明。
USB 通讯协议的规范是以1 毫秒产生一个USB 讯框(frame),USB 装置可以在每一个讯框中传送和接收一个交易(transaction)。
交易是由数个封包(packet)组成,而传输是由一或数个交易来完成传递一串有意义的数据。
在这里,传输和报告的意义大同小异。
传输方式有四种,初学者只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。
hid类键盘的报告描述符的理解
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个标准请求的理解,通过此软件的观察,可以更好理解其相互之间是如何完成这个握手枚举过程的。
HID 报告描述
HID报告描述1报告描述简介Report Description,即上报事件的描述,描述所支持事件的格式及取值意义,比如鼠标按键上报格式、左键右键中间键分别对应的值等;报告描述跟JSON有些类似,都是结构数据,格式类似{usage:1,{id:0,usage:1.1,size:1,count:1,min:0,max:5,format:xx}}2描述符结构几个主要的名词解释一下:Collection,集合,相当于{},用来包含一组描述;Collection有Application和Physical之分,Application表示大项,里有可以有很多Physical子项Report,报告,在上图中只是一个ID号,来区分不同report。
Main Item,主项,例出来哪些项Report Size,每一项有多少位。
Report Count,总共有多少项Logical Minimum,每个项的取值范围中的最小值,即最小只能取的值。
Logical Maximum,每个项的取值范围中的最大值,即最大只能取的值。
Usage,用途,表示有哪些功能,一个Usage代表一个功能。
一项描述基本上是由两个字节构成,第一个字节表示名称,第二个字节表示值,如Report Size,8Report Size是名称,8是它的值。
Report Size对应的16制数据是0x75,在代码里上面的表现是0x75,0x08。
有些名称不需要带值,如Collection的结束符())为0xC0,就没有第二个字节。
3名称名称有分长字和短字,这里只介绍短字,短字是由一个字节构成,结构如下:第3~2位表示类型,有如下几种:0=Main1=Global2=Local3=Reserved第1~0位表示名称的值由多少个字节构成,具体意义如下:0=0bytes,名称后面不带值1=1bytes,名称后面带1个值2=2bytes,名称后面带2个值3=4bytes,名称后面带4个值第7~4位表示Tag,Tag与类型对应,每种类型有很多不同的Tag。
HID 报告描述符终极解析
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个字节。
USB HID键盘报告描述符
USB HID键盘报告描述符usbhid键盘报告描述符USB HID键盘报告描述符最近弄usb驱动,里面的报告描述符晕了我好几天!找了一些资料希望能对大家有帮助~~~~~~~~~~~~~~理解hidscript脚本语言:globalitem--global item mainitem--main item localitem--local item对于main项,parser解释器,将顺序解释集合中的数据,并且,解释器解释完的数据,根据主要项目的顺序,主要是输入和输出项目,相应的数据位将按顺序拼接,解释器将以关键字collection开始解释并拼接bit位信息,关键字endcollection将在完成Paser解释器的工作后,我调用keyword collection和keyword endcollection\set\,关键字collection和关键字endcollection都是mainitem主项,对应的控制字分别为:101000nn和110000nn。
如果在采集后有一个参数数据,则为10100001=0xa1,例如采集(应用)翻译成控制码后为:0xa1,0x01;0xa1的1表示有1个参数数据,0x01表示application 在hid协议中指定的索引值为0x01。
PC的HID驱动程序将通过解析器中的0x01知道,是对application进行数据流位生成,就是说hid报告描述符(reportdescriptor)所述数据流用于应用程序,包括在两种设备:mouse和keyboard,至于collection(application)里边描述的是mouse或者键盘,这将由用法进一步定义,例如用法(键盘),也就是说,描述是准确的告诉pc的hid驱动程序的paser解释器,接下来的这段信息最后生成出来的bits位数据信息,它将由PC的HID驱动程序中键盘对应的API函数处理。
当然,这只是HID硬件设备开发人员给pc的hid驱动程序的paser解释器提供的一个建议值,比如我们做ddk下的hid驱动二次开发,所以我们可以免费,但是应该遵循HID硬件设备开发者推荐的HID驱动程序API接口,因为hid硬件设备开发者比ddk开发人员更清楚送上来的bit数据流的真正物理意义.输入和输出是用于真正生成比特流数据字段的关键字。
HID报告描述详解
在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)//输入用,变量,值,绝对值。
USBHID设备报告描述符详解
USBHID设备报告描述符详解
USBHID设备报告描述符是一种描述USBHID设备报告的结构,用于定义设备报告的输入输出特性,允许设备与控制器的主机通信。
通常,报告描述符是一段二进制数据,其中包含由设备提供的输入和输出报告,以及描述报告的数据结构要求信息。
它是一种混合结构,由多个子块组成,每个子块又由一个或多个报告描述符中的域组成。
报告描述符的结构如下:
报告描述符
-
-bLengt
-bDescriptorTyp
-wDescriptorLengt
-数据
-输入报
-输出/特殊报
-特殊报
头部:报告描述符的头部包括三个字段:报告描述符的字节长度(bLength),报告描述符类型(bDescriptorType)和报告描述符的总长度(wDescriptorLength)。
bLength:报告描述符的字节长度,是报告描述符数据的字节数。
bDescriptorType:报告描述符类型,用于指示报告描述符的类型,必须为0x22
wDescriptorLength:报告描述符的总长度,用于指示报告描述符的总字节数。
数据段:数据段包括输入报告、输出/特殊报告和特殊报告。
输入报告:输入报告用于获取主机发送到设备的数据,一般由设备按定义的格式读取。
输出报告:输出报告用于将设备发送到主机的数据。
HID设备报告描述符详解_划出重点
HID设备报告描述符详解_划出重点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设备描述符介绍最近在做一个投票系统的上位机。
虽然是上位机,但还是要弄清楚下位机与自己的接口――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报告描述符详解
1、HID报告描述符介绍
USB人机界面设备,简称HID,是计算机系统中最常见的一种通信接口,它使用设备描述符(Device Descriptors)来描述设备特性,同时使用报告描述符(Report Descriptors)来描述设备支持的数据报文格式,操作系统或软件驱动可以根据报告描述符中设置的信息来识别HID设备所具有的功能,从而支持和控制HID设备。
HID报告描述符描述了与设备相关的数据信息,它是HID设备进行自然交互的基础。
2、HID报告描述符的作用
输入报告(Input Reports)可以被认为是从HID设备发送到操作系统的数据,它可以描述HID设备特性的状态,可以用来报告控制命令、操作状态、三轴分量数据等信息;输出报告(Output Reports)则相反,它表示从操作系统发送给HID设备的数据。
win7液晶触摸屏HID描述符
下面是win7触摸描述符0x05, 0x0d, // USAGE_PAGE (Digitizers) 00x09, 0x04, // USAGE (Touch Screen) 20xa1, 0x01, // COLLECTION (Application) 40x85, 0xaa, // REPORT_ID (Touch) 60x09, 0x20, // USAGE (Stylus) 80xa1, 0x00, // COLLECTION (Physical) 100x09, 0x42, // USAGE (Tip Switch) 120x15, 0x00, // LOGICAL_MINIMUM (0) 140x25, 0x01, // LOGICAL_MAXIMUM (1) 160x75, 0x01, // REPORT_SIZE (1) 180x95, 0x01, // REPORT_COUNT (1) 200x81, 0x02, // INPUT (Data,V ar,Abs) 220x95, 0x03, // REPORT_COUNT (3) 240x81, 0x03, // INPUT (Cnst,Ary,Abs) 260x09, 0x32, // USAGE (In Range) 280x09, 0x37, // USAGE (Data Valid-Finger) 300x95, 0x02, // REPORT_COUNT (2) 320x81, 0x02, // INPUT (Data,V ar,Abs) 340x95, 0x0a, // REPORT_COUNT (10) 360x81, 0x03, // INPUT (Cnst,Ary,Abs) 380x05, 0x01, // USAGE_PAGE (Generic Desktop) 400x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) 420x75, 0x10, // REPORT_SIZE (16) 450x95, 0x01, // REPORT_COUNT (1) 470xa4, // PUSH 490x55, 0x0d, // UNIT_EXPONENT (-3) 500x65, 0x00, // UNIT (None) 520x09, 0x30, // USAGE (X) 540x35, 0x00, // PHYSICAL_MINIMUM (0) 560x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 580x81, 0x02, // INPUT (Data,V ar,Abs) 610x09, 0x31, // USAGE (Y) 630x46, 0x00, 0x00, // PHYSICAL_MAXIMUM (0) 650x81, 0x02, // INPUT (Data,V ar,Abs) 680xb4, // POP 700x05, 0x0d, // USAGE PAGE (Digitizers) 710x09, 0x60, // USAGE (Width) 730x09, 0x61, // USAGE (Height) 750x95, 0x02, // REPORT_COUNT (2) 770x81, 0x02, // INPUT (Data,V ar,Abs) 790x95, 0x01, // REPORT_COUNT (1) 810x81, 0x03, // INPUT (Cnst,Ary,Abs) 83/850xc0, // END_COLLECTION 0/10xc0 , // END_COLLECTION 0/1For Windows 7, touch digitizers appear through HID as a touch digitizer (page 0x0D, usage 0x04).The following usages are required:∙X (page 0x01, usage 0x30) and Y (page 0x01, usage 0x31).∙Tip switch (page 0x0D, usage 0x42).∙In-range (page 0x0D, usage 0x32).Use tip switch to indicate finger contact and liftoff from the digitizer surface, similar to how a pen reports contact with the digitizer.If the device supports z-axis detection, it reports in-range correctly. If the device does not support z-axis detection, the driver reports packets with in-range and tip switch set when a finger comes in contact with the digitizer.Note that some earlier versions of Windows have different guidelines for how touch digitizer drivers should handle in-range reporting. The Windows XP Tablet PC OEM Preinstallation Kit (OPK) includes information about how to implement a touch digitizer driver for Windows XP. For more information, contact your Microsoft technical account manager.The following usages are optional, but you should implement them if the digitizer hardware supports them:∙Confidence (page 0x0D, usage 0x47).∙Width and height (page 0x0D, usages 0x48 and 0x49).上面是报告描述符,上面报告描述符要发12字节给电脑。
HID报告描述详解
在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固件开发(HID设备)
USB固件开发(HID设备)收藏USB固件开发(HID设备)1. HID设备的识别HID设备类除了有文档第一部分所述的一些标准描述符(包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还有自己的类专有描述符:HID描述符报告描述符物理描述符正确实现HID设备类专用描述符是主机成功识别HID设备的关键。
HID描述符和报告描述符是必须要使用的,物理描述符一般不被使用。
1.1 HID描述符HID描述符跟接口描述符、端点描述符类似,也是随配置信息一起返回给主机的,主机并不会单独发出请求来读取它。
HID描述符在配置信息中的位置是紧接接口描述符。
例如:_Config_Descriptor:.dw _Config_Descriptor_End-_Config_Descriptor //bLength: 0x09 byte.dw 0x02 //bDescriptorType: CONFIGURATION.dw _Config_Descriptor_Total-_Config_Descriptor //wTotalLength:.dw 0x00.dw 0x01 //bNumInterfaces: 1 interfaces.dw 0x01 //bConfigurationValue: configuration 1.dw 0x00 //iConfiguration: index of string.dw 0xC0 //bmAttributes: self powered, Not Support Remote-Wakeup.dw 0x32 //MaxPower: 100 mA_Config_Descriptor_End:_HID_Interface_Descriptor://Interface 1 (0x09 byte).dw 0x09 //bLength: 0x09 byte.dw 0x04 //bDescriptorType: INTERFACE.dw 0x01 //bInterfaceNumber: interface 0.dw 0x00 //bAlternateSetting: alternate setting 0.dw 0x01 //bNumEndpoints: 1 endpoints(EP1).dw 0x03 //bInterfaceClass: 人机接口设备(HID)类.dw 0xff //bInterfaceSubClass: 供应商定义.dw 0xff //bInterfaceProtocol 使用的协议:供应商定义.dw 0x00 //iInterface: index of string_HID_Interface_Descriptor_End:HID_Descriptor:.dw 0x09 //bLength: 0x09 byte.dw 0x21 //bDescriptorType: HID描述符类型编号.dw 0x01, 0x10 //HID类协议版本号,为1.1.dw 0x21 //固件的国家地区代号,0x21为美国.dw 0x01 //下级描述符的数量.dw 0x22 //下级描述符为报告描述符.dw _ReportDescriptor_End-_ReportDescriptor, 0x00 //下级描述符的长度_HID_Descriptor_End:_Endpoint3:.dw 0x07 //bLength: 0x07 byte.dw 0x05 //bDescriptorType: ENDPOINT.dw 0x83 //bEndpointAddress: IN endpoint 3.dw 0x03 //bmAttributes: Interrupt.dw 0x02, 0x00 //wMaxPacketSize: 2 byte.dw 0x0A //bInterval: polling interval is 10 ms_Config_Descriptor_Total:HID描述符其实是为了提供下级描述符(如报告描述符)的信息。
hid协议报告描述总结
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)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】,随着新的【全局项目】出现,该表在不断变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
所以“传输的数据”和“操作”只是一事件的两种描述方式。
用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名):Usage(用途)=(usage page:usage ID)举例说明:二个字节分别为x和y轴的位移数据,因此第一个字节的usage =(generic desktop:X),而第二个字节的usage = (generic desktop:Y),其中标签:用途卷标只是报告描述符诸多标签的一个。
表1列出所有的卷标,利用这些卷标取可以清楚完整的描述符操作的用途。
报告描述符的语法不同于USB标准描述符,它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(p refix),然后跟着一个括号,内为该项目的数据:item = prefix(data)。
项目分成三种类别:主项目,全局项目,区域项目。
主项目主项目中的input,ouput,feature三个卷标用来表示报告中数据的种类,这些是报告描述符中最主要的项目,其他项目都是用来修饰这三种项目。
主要项目中其他二个卷标后面再作详细的介绍。
●Input 项:表示设备操作输入到主机的数据模式。
这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以get report(input)来传输,但是通常用中断型输入管线来传输以确保在每一固定周期内都能将更新的输入报告传给主机。
●Output项:表示由主机输出到装置操作的数据格式。
这个数据格式就形成一个输出报告。
输出报告通常不适用轮询的方式来传送给设备,而是由应用软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以set re port(output)指令来将报告送到设备。
当然也可以选择用中断型输出管线来传送,只是通常不建议这样用。
●Feature项:表示由主机送到设备的组态所需数据的数据格式。
这个数据模式就形成一个特征报告。
特征报告只能用控制型管线以get report(feature)和set report(feature)指令分别来取得和设定设备的特征值。
范例:考虑一个2X16字的显示装置,它的列数、行数、字宽、和字高为固定值属于feature报告;显示状态例如“就绪”和“输入字错误”则属于input报告;光标位置和显示的字需可读写,所以属于另一个feature报告;更新显示的字则为output报告。
为了区别两个features,要用到全局项目中的report ID,每个feature报告有一个不同的report ID,因而主机请求指令要加上report ID的值:get report(feature,report ID)和Set report(feature,report ID)。
主项目用来定义报告中数据的种类和格式,而说明主项目的意义和用途的为全局项目和区域项目(Local Item)。
顾名思义,区域项目(Local Item)只能适用于列于其下的第一个主项目,不适用于其他主项目,若一个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主项目。
相反,全局性项目适用于其下方的所有主项目,除非另一个相同卷标的全局性项目出现。
为了清楚说明报告描述符,将使用“项目状态表”(item state table)用来表示在某位址处适用的全局性项目的组合。
图1显示全局性项目和区域性项目与所描述的主项目之对应关系。
区域性项目(Local Item)卷标:简单地说,区域性项目(见表1)只是说明用途而已。
Designator是要搭配实体描述符使用的,这里不对实体描述符进行介绍,所以略过这些designator标签。
标签Usage 实际上应该称作Usage ID,它搭配全域项目的Usage Page 卷标才形成前文所定义的用途{usage};但是报告描述符允许在区域项目的Usage 卷标直接用32位的方式来指定用途,这种方式称作扩充式用途指定法(extended us age)以示区别。
例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyboar d:0),和Usage Maximum(Keyboard:101)。
很明显的,扩充式用途指定法会取代『项目状态表』中的Usage Page。
还有,使用扩充式用途指定法时,数据的高16 个位为用途类页Usage Page,低16 个位则为用途识别名Usage ID。
往往一个报告数据会对应到几个操作,因而会有几个用途,例如101 按键的键盘利用不同代码代表不同的键,每一个键是一个操作,有自己的用途,要将所有Usage ID 列出不太现实,所以就需要Usage Minimum 和Usage Maximum二个标签。
以键盘为例,主项目之上只要二个区域项目:Usage Minimum (0), Usage Maxi mum (101)。
如此一来,则无键按下(Usage ID 为0)和101 键中任一键被按下(U sage ID 为1 至101)的用途都被赋于到一个报告数据上,后面会有一个范例进一步解说。
卷标String Index 类似卷标Usage,而卷标String Minimum 和String Maxi mum 则类似标签Usage Minimum 和Usage Maximum。
如果希望某个操作对应到一个字串,则用String Index 来描述该操控的报告数据,这个字符串在字符串描述符中,StringIndex (data)项目中的data 是这个字符串在字符串描述符中的位置索引。
如果需要用到几个字符串,则可以使用String Minimum 来指向字符串查阅Universal Serial Bus HID Usage Tables 文档,这两个例子的用途需要令为(Consumer: Volume)。
Usage Page 前面已经介绍过了。
Rep ort 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 Cou nt (3);那么这个报告长度为三个位,可以同时呈现出三个按键的状态(原状或被按下)。
Logical Minimum 和Logical Maximum在说明每个报告字段的数值范围,这是纯数值所以称s为逻辑数值(logical value)。
音量增减键的例子中Logical M inimum (-1),Logical Maximum (1)表示只会出现-1, 0, 1 三种数值,所以用到二位(即ReportSize(2)),0b11 代表-1,0b00 代表0,0b01 代表1。
在音量旋钮例子中,虽然用7 位作一字段,但是旋钮仅会产生0 到100 的数值,因为Log ical Minimum (0)和Logical Maximum (100)。
假如实体程序错误产生超出逻辑数值的范围,则主机将会忽略该数值,这种数值称作null value。
当要将同一种报告分成数个部分,则每一个部分要给予一个识别值,这时就需用到卷标Report ID,其数据值必须从1起算,不可使用0。
没有赋予Report ID 标签的报告,主机有可能会将其Report ID 视为0,所以Report ID (0)被要求不能使用。
这个标签对控制型管线才有意义,因为它可以在请求报告时指定R eport ID的值。
对于中断型管线,其为周期性传输报告,所以每次都会将所属报告传完,没有仅传输部分之必要,所以Report ID 标签就无意义。
其它的全局项目卷标可分为辅助工具(Push 和Pop)和物理量说明(Physic al Minimum,Physical Maximum,Unit Exponent,和Unit)。
Push 卷标将『项目状态表』存放到缓存器(stack),而Pop 卷标反过来将缓存器最顶层的『项目状态表』取回来取代目前之状态表。