报告描述符
power device hid报告描述

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 设备的制造商或开发者都必须遵守这些规范。
USB的HID通信协议

USB的HID通信协议USB HID(Human Interface Device)通信协议是一种用于实现USB设备与计算机之间人机交互的通信标准。
它定义了如何将输入和输出的信息在USB总线上进行传输并进行解释。
在该协议中,设备被称为USB HID设备,计算机被称为主机。
以下是USB HID通信协议的详细介绍。
1.通信协议层次结构USBHID通信协议定义了四个层次的模型。
最底层是物理层,负责USB总线的电气特性和通信速率。
上一层是USB传输层,负责数据包传输的同步和差错检测。
再上一层是USB配置层,负责设备枚举和配置。
最顶层是HID层,负责定义设备的输入输出报告格式和解析。
2.报告描述符HID通信协议通过报告描述符定义设备的输入和输出报告格式。
输入报告描述设备向主机传输输入数据,输出报告描述主机向设备传输输出数据。
报告描述符包含了报告ID、报告大小和报告类型等信息,主机通过解析报告描述符来理解设备传输的数据。
3.报告传输设备通过中断传输和控制传输与主机进行通信。
中断传输是指设备周期性地传输输入报告给主机,主机可以根据需要设置中断传输的频率。
控制传输是指主机向设备发送控制命令或获取设备属性信息。
4.事件推送和轮询设备可以通过事件推送和轮询两种方式向主机传输数据。
事件推送是指设备主动向主机发送输入报告。
轮询是指主机定期向设备发送轮询请求,设备在收到请求后返回输入报告。
事件推送和轮询可以结合使用,以满足不同的应用需求。
5.输入报告解析主机通过解析输入报告来获取设备传输的数据。
输入报告由报告ID和报告数据组成。
主机可以根据报告描述符的信息来解析报告数据,获取具体的输入信息。
解析后的数据可以用于触发软件事件或更新设备状态。
6.输出报告处理主机通过发送输出报告向设备传输数据。
输出报告也由报告ID和报告数据组成。
设备可以根据报告描述符的信息解析报告数据,并根据需要进行相应的处理。
7.随机访问HID通信协议支持主机以随机方式访问设备的输入输出报告。
USB HID 设备类协议入门

一、应用场合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报告描述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。
usb描述符含义

usb描述符含义
USB(Universal Serial Bus)描述符是在USB设备和主机之间进行通信时使用的数据结构。
USB 描述符包含有关USB设备或设备的某个接口的信息,例如设备的厂商ID、产品ID、设备类别、端点信息等。
USB描述符通常由设备在被连接到主机时发送给主机。
以下是常见的USB描述符及其含义:
1. 设备描述符(Device Descriptor):
-包含设备的基本信息,如USB规范版本、设备类别、厂商ID、产品ID、设备版本号等。
2. 配置描述符(Configuration Descriptor):
-描述设备的一个或多个配置,每个配置可能包含一个或多个接口。
3. 接口描述符(Interface Descriptor):
-描述一个配置中的一个接口,包括接口的数量、接口的类别、子类别和协议。
4. 端点描述符(Endpoint Descriptor):
-描述接口上的每个端点(endpoint),包括端点的地址、传输类型(控制、批量、等等)、最大数据包大小等信息。
5. 字符串描述符(String Descriptor):
-包含设备的可读字符串信息,例如制造商名称、产品名称等。
这些描述符是通过设备的控制端点(Control Endpoint)进行交互的,控制端点使用标准的USB控制请求(Control Requests)来获取有关设备和接口的信息。
USB描述符是为了让主机能够正确地配置和与USB设备进行通信而设计的,它们提供了有关设备和接口的重要信息,以确保设备与主机之间的兼容性。
hid协议

HID协议HID(Human Interface Device)协议是一种用于计算机与人机交互设备之间通信的协议。
它定义了计算机如何与键盘、鼠标、游戏手柄等输入设备进行通信,以及如何接收和处理来自这些设备的输入信息。
HID协议被广泛应用于各种操作系统和硬件平台中,为用户提供了良好的输入设备兼容性和可靠性。
HID协议的基本原理HID协议使用了一种称为报告(Report)的数据结构进行通信。
报告是一种特定格式的数据包,用于携带输入设备发送的信息。
在HID协议中,输入设备被称为HID设备,输出设备被称为HID主机。
HID主机通过发送请求来从HID设备获取报告,而HID设备则通过发送报告来向HID主机发送输入信息。
HID协议中定义了两种类型的报告:输入报告和输出报告。
输入报告用于向HID主机发送输入数据,比如按键信息、鼠标移动等。
而输出报告用于向HID设备发送控制命令,比如控制LED灯的亮度、设置鼠标灵敏度等。
HID协议的具体实现HID协议的具体实现方式因不同的操作系统和硬件平台而异。
以下以Windows 操作系统为例,介绍HID协议的具体实现过程。
在Windows操作系统中,HID协议的实现主要涉及到以下几个方面:1.设备识别:当插入一个HID设备时,Windows会自动识别设备并加载相应的驱动程序。
驱动程序是用来将HID设备的输入信息转换为操作系统能够理解的格式。
2.报告描述:HID设备需要提供一个报告描述符,用于描述设备支持的报告类型和报告格式。
报告描述符通常以二进制格式存储在设备的固件中,并在设备插入时由操作系统读取。
3.报告传输:HID设备和HID主机之间的报告传输通常使用USB接口进行。
HID设备通过USB接口将报告发送给HID主机,而HID主机则通过USB接口向HID设备发送请求并接收报告。
4.数据处理:HID主机接收到报告后,需要对报告进行解析和处理,以获取其中的输入数据。
操作系统提供了HID API供开发者使用,开发者可以使用这些API来访问和处理HID设备的输入信息。
USB协议详解

USB HID介绍HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB 协议的相关内容。
USB设备描述符-概述当插入USB设备后,主机会向设备请求各种描述符来识别设备。
那什么是设备描述符呢?Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB 设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。
描述符的作用就是通过命令操作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。
USB有那些标准描述符?USB有5种标准描述符:设备描述符、配置描述符、字符描述符、接口描述符、端点描述符。
描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。
由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。
在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。
其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
设备描述符struct _DEVICE_DEscriptOR_STRUCT{BYTE bLength; //设备描述符的字节数大小BYTE bDescriptorType; //描述符类型编号,为0x01WORD bcdUSB; //USB版本号BYTE bDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型,0x00不是在设备描述符中定义的,如HIDBYTE bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的,HID 设备此值为0BYTE bDeviceProtocl; //USB分配的设备协议代码,同上HID设备此值为0BYTE bMaxPacketSize0; //端点0的最大包的大小WORD idVendor; //厂商编号WORD idProduct; //产品编号WORD bcdDevice; //设备出厂编号BYTE iManufacturer; //描述厂商字符串的索引BYTE iProduct; //描述产品字符串的索引BYTE iSerialNumber; //描述设备序列号字符串的索引BYTE bNumConfiguration; //可能的配置数量}配置描述符struct _CONFIGURATION_DEscriptOR_STRUCT{BYTE bLength; //配置描述符的字节数大小BYTE bDescriptorType; //描述符类型编号,为0x02WORD wTotalLength; //配置所返回的所有数量的大小BYTE bNumInterface; //此配置所支持的接口数量BYTE bConfigurationVale; //Set_Configuration命令需要的参数值BYTE iConfiguration; //描述该配置的字符串的索引值BYTE bmAttribute; //供电模式的选择BYTE MaxPower; //设备从总线提取的最大电流}字符描述符struct _STRING_DEscriptOR_STRUCT{BYTE bLength; //字符串描述符的字节数大小BYTE bDescriptorType; //描述符类型编号,为0x03BYTE SomeDescriptor[36]; //UNICODE编码的字符串}接口描述符struct _INTERFACE_DEscriptOR_STRUCT{BYTE bLength; //接口描述符的字节数大小BYTE bDescriptorType; //描述符类型编号,为0x04BYTE bInterfaceNunber; //接口的编号BYTE bAlternateSetting;//备用的接口描述符编号BYTE bNumEndpoints; //该接口使用端点数,不包括端点0BYTE bInterfaceClass; //接口类型 HID设备此值为0x03BYTE bInterfaceSubClass;//接口子类型 HID设备此值为0或者1BYTE bInterfaceProtocol;//接口所遵循的协议BYTE iInterface; //描述该接口的字符串索引值}端点描述符struct _ENDPOIN_DEscriptOR_STRUCT{BYTE bLength; //端点描述符的字节数大小BYTE bDescriptorType; //描述符类型编号,为0x05BYTE bEndpointAddress; //端点地址及输入输出属性BYTE bmAttribute; //端点的传输类型属性WORD wMaxPacketSize; //端点收、发的最大包的大小BYTE bInterval; //主机查询端点的时间间隔}HID设备描述符温习了以上内容,我们再来看看HID协议与这些描述符之间的关系。
描述符是什么意思

描述符是什么意思
描述符是什么意思?就是程序员用来解释某些代码的,当然这也可以作为其他领域专家理解的描述,例如:说人话、举例子等。
所有用户都有相同的描述符。
当你对这段代码做任何改动时,都会被所有的用户所看到并且能看懂。
描述符是解释的对象,描述符有两种表示形式:变量名和变量值;而变量名则由字母数字及下划线组成。
您所选的项目,是您在使用 Visual Studio 中创建的一系列产品集合。
每个产品都包含多个描述符。
每个描述符均可用于创建对象、方法或类。
Visual Studio 将描述符视为类的属性。
因此,创建的对象的属性将与其所包含的描述符有关。
例如,“文档”类可具有“新建文档”、“打开文档”、“保存文档”、“删除文档”、“打印文档”、“搜索文档”、“发送邮件”等属性。
描述符是一个特殊的标识符,可以帮助程序员编写和维护更好的代码,提高代码可读性。
程序员只需知道变量名称及它们之间的关联,就可以实现编程语言的基本功能。
如果需要编译的源程序长度过大,那么仅用描述符很难清楚地描述所有信息。
另外,多个产品中的某个部分可能是多重复杂性的。
例如,一个产品可能包括不同的方法和属性,因此需要描述符来协调它们之间的关系。
这样做不但可以节省时间,还能减少重复的工作,因为当进行修改时,必须首先修改相应的描述符。
此外,某个产品中可能存在不止一种技术方案。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
报告大小指明数据项的位数。报告计数指明有多少个这样的数据项。
例如,定义以下数据项:
逻辑最小值(0)
逻辑最大值(0x7f)
报告大小(8)
那么它的意思就是,此报告中数据字段的大小是8位,本身可以表示0~255之间的任何数,但是逻辑值的范围被定义在0~127之间,所以实际上数据字段的数据不能超过127,否则视为无效报告。
报告描述符,顾名思义就是描述“报告”格式的,这个格式使主机和设备能遵循着同一个规则来解释一个报告中所含有的数据。与HID描述符不同,主机会发出单独的请求来读取报告描述符。关于报告描述符的组成,HID设备类定义文档中明确指出,一个报告描述符必须包含但不仅限于以下数据项:
输入(输出或特征)
用法(也可用“用法最小值与最大值”来定义一连串用法)
.dw 0x9, 0x1 //用法(供应商用法1)
.dw 0x15, 0x0 //逻辑最小值(0),全局项,修饰下面所有的主项
.dw 0x26, 0xff, 0x0 //逻辑最大值(255),全局项,修饰下面所有的主项
.dw 0x75, 0x8 //报告大小(8),全局项,修饰下面所有的主项
.dw 0x95, 0x7 //报告计数(7),全局项,修饰下面所有的主项
再举一个例子:
逻辑最小值(0)
逻辑最大值(3)
报告大小(2)
这个例子的意思是,此报告中数据字段的大小是2位,逻辑值范围是0~3,那么数据字段的值与逻辑值是一一对应且相等的,即0(00b),1(01b),2(10b),3(11b)。
第三个例子:
再举一个例子:
逻辑最小值(-1)
逻辑最大值(1)
报告大小(2)
4. Windows HID编程接口
一般使用WriteFile或HidD_SetFeature来向设备发送数据(报告),使用ReadFile来读取设备发过来的数据(报告)。详情可以参考另一文章《Windows主机端与自定义USB HID设备通信详解》。
用法页
逻辑最小值
逻辑最大值
报告大小
报告计数
报告描述符看起来比较复杂,无论是HID设备类定义文档,还是其他参考书籍,都会花较大的篇幅来阐述它。要把它完全理解是需要一点时间的,而且就算是理解了也不一定能写出“像样”的报告描述符来。学习总有一个过程,入门才是最重要的,只要入了门,后面的事情就会慢慢变得简单,无需在一开始的时候说明。
输入项(输出或特征)指明了报告的类型,其中隐含了报告的传输方向以及报告数据所具有的数学特性。
用法和用法页一起指明了数据项的用法,每个数据项都必须指明用法,否则主机端不能成功解析报告描述符。用法页是全局的,修饰列于其后的所有数据项,直到出现新的用法页为止;用法则是局部数据项,局部数据项只修饰列于其后的第一个主数据项内的数据项,一旦出现新的主数据项,那么用法必须重新指定。这其中隐含的意思是,每个主数据项前面都必须有修饰它的用法与用法页组合。(“用法”表示的是一个单独的用法,而“用法最小值”和“用法最大值”可以替代“用法”,代表某个范围的用法。)
.dw 0xb1, 0x06 //特征(数据,变量,相对值)
//下面开始一个新的主项目,前面提到的全局项仍对这个主项目有效,譬如报告大小等
.dw 0x09, 0x01 //用法(供应商用法1),局部项,修饰下面的“输出”主项
.dw 0x85, 0x04 //报告ID(4),全局项,之前的报告ID项失效
_ReportDescriptor: //报告描述符
.dw 0x06, 0x00, 0xff //用法页,供应商自定义,修饰其下所有的主项
.dw 0x09, 0x01 //用法(供应商用法1),局部项,只修饰下面的“集合”主项。
.dw 0xa1, 0x01 //集合开始,主项
.dw 0x85, 0x1 //报告ID(1),全局项,可以修饰其下所有的主项,但是在这个报告描述中由于后面出现了新的报告ID,所以它只是修饰下面的“输入”主项。
1.2报告描述符
要解释报告描述符,首先得清楚什么是“报告”。“报告”是主机和HID设备之间进行数据交换的最小单位。也就是说,在主机完成对设备的识别之后,在具体应用上的数据交换就得以“报告”的方式进行。“报告”的类型有三种:输入报告、输出报告和特征报告。输入报告就是设备发给主机的报告,而输出报告就是主机发给设备的报告,特征报告是主机发给设备的报告,特征报告常在自定义HID设备中被用作主机向设备发送自定义数据。
这个例子的意思是,此报告中数据字段的大小是3位,逻辑值范围是-1~1,那么数据字段的值与逻辑值是按左对齐的方式部分对应的,即数据字段值0(00b)对应逻辑值-1,数据字段值1(01b)对应逻辑值0,数据字段值2(10b)对应逻辑值1,数据字段值3(11b)无效。
这里举一个HID自定义设备的报告描述符的例子,这个例子比鼠标和键盘更简单。更具体的内容,譬如常用的鼠标和键盘,可以参看官方文档Device Class Definition for Human Interface Devices(HID).pdf和HID Usage Tables.pdf。
.dw 0x81, 0x6 //输入(数据,变量,相对值),主项,说明此报告的属性
//下面开始一个新的主项目,前面提到的全局项仍对这个主项目有效,譬如报告大小等
.dw 0x09, 0x01 //用法(供应商用法1),局部项,修饰下面的“特征”主项
.dw 0x85, 0x03 //报告ID(3),全局项,之前的报告ID项失效
.dw 0x91, 0x6 //输出(数据,变量,相对值)
.dw 0xc0 //结合结束
_ReportDescriptor_End:
以上描述符定义了4个不同的报告,用报告ID区分。HID设备定义文档上有讲,在一个报告ID之后而在下一个报告ID之前范围内的所有数据项都属于一个报告,发送报告时会把报告ID附在这个报告的前面义区分报告。
.dw 0xb1, 0x6 //特征(数据,变量,相对值)
//下面开始一个新的主项目,前面提到的全局项仍对这个主项目有效,譬如报告大小等
.dw 0x09, 0x01 //用法(供应商用法1),局部项,修饰下面的“特征”主项
.dw 0x85, 0x02 //报告ID(2),全局项,之前的报告ID项失效