转 关于USB HID报告描述符

原文地址

USB HID报告及报告描述符简介

在USB中,USBHOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报
告描述符(ReportDescriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。USBHID设备是通过报告来给传送数据的,报告
有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出
报告是主机发送
在USB中,USB
HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(Report
Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
    USB
HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电
脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的
是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通
过中断输出端点发出。
    而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB
HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,
而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID
时,报告中就没有ID字段,开始就是数据。
    USB报告描述符可以通过使用HID Descriptor
tool来生成。点击加粗部分可以下载此工具。
    下面通过由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)
 
  //逻辑最小值为0
    0x15, 0x00,       
            // 
 LOGICAL_MINIMUM (0)
    //逻辑最大值为1
    0x25,
0x01,                
   //   LOGICAL_MAXIMUM (1)
   
//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
    0x75, 0x01, 
              
   //   REPORT_SIZE (1)
   
//报告的个数为8,即总共有8个bits
    0x95, 0x08,    
               // 
 REPORT_COUNT (8)
    //输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
 
  //而鼠标移动这样的则报告相对值,表示鼠标移动多少
    0x81, 0x02,    
               // 
 INPUT (Data,Var,Abs)
   
//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
   
//分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
   
//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
   
//否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
   
//需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
   
//特殊键,例如ctrl,shift,del键等
    //这样的数据段个数为1
    0x95,
0x01,                
   //   REPORT_COUNT (1)
   
//每个段长度为8bits
    0x75, 0x08,       
            // 
 REPORT_SIZE (8)
    //输入用,常量,值,绝对值
    0x81,
0x03,                
   //   INPUT (Cnst,Var,Abs)
    
   //上面这8个bit是常量,设备必须返回0
    //这样的数据段个数为5
 
  0x95, 0x05,             
      //   REPORT_COUNT (5)
   
//每个段大小为1bit
    0x75, 0x01,       
            // 
 REPORT_SIZE (1)
    //用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用

    0x05, 0x08,          
         //   USAGE_PAGE (LEDs)

    //用途最小值是Num Lock,即数字键锁定灯
    0x19, 0x01, 
              
   //   USAGE_MINIMUM (Num Lock)
   
//用途最大值是Kana,这个是什么灯我也不清楚^_^
    0x29, 0x05,    
               // 
 USAGE_MAXIMUM (Kana)
   
//如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
    //1表示灯亮,0表示灯灭
 
  0x91, 0x02,             
      //   OUTPUT (Data,Var,Abs)
 
  //这样的数据段个数为1
    0x95, 0x01,       
            // 
 REPORT_COUNT (1)
    //每个段大小为3bits
    0x75,
0x03,                
   //   REPORT_SIZE (3)
   
//输出用,常量,值,绝对
    0x91, 0x03,       
            //   OUTPUT
(Cnst,Var,Abs)   
    //由于要按字节对齐,而前面控制LED的只用了5个bit,

    //所以后面需要附加3个不用bit,设置为常量。
    //报告个数为6
 
  0x95, 0x06,             
      //   REPORT_COUNT (6)
   
//每个段大小为8bits
    0x75, 0x08,       
            // 
 REPORT_SIZE (8)
    //逻辑最小值0
    0x15,
0x00,                
   //   LOGICAL_MINIMUM (0)
   
//逻辑最大值255
    0x25, 0xFF,       
            // 
 LOGICAL_MAXIMUM (255)
    //用途页为按键
    0x05,
0x07,                
   //   USAGE_PAGE (Keyboard)
   
//使用最小值为0
    0x19, 0x00,       
            // 
 USAGE_MINIMUM (Reserved (no event indicated))
   
//使用最大值为0x65
    0x29, 0x65,       
            // 
 USAGE_MAXIMUM (Keyboard Application)
    //输入用,变量,数组,绝对值

    0x81, 0x00,          
         //   INPUT
(Data,Ary,Abs)
   
//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
   
//有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
   
//无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
   
//个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
   
//字节分别为相应的键值,以次类推。
    //关集合,跟上面的对应
    0xc0 
                 
       // END_COLLECTION
};
 
   通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,

因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的
第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果

只有左ctrl键按下,则返回01 00 00 00 00 00 00 00(十六进制),如果
只有数字键1 按下,则返回00 00 59 00 00 00
00 00,如果数字
键1 和2 同时按下,则返回00 00 59 5A 00 00 00 00,如果
再按下左shift 键,则返回02 00
59 5A 00 00 00 00,
然后再释放1   键,则返回02 00 5A 00 00 00 00 00,

然后全部按键释放,则返回00 00 00 00 00 00 00 00。
这些数据(即报告)都是通过中断端点返回的。当按下Num
Lock键时,PC会发送
输出报告,从报告描述符中我们知道,Num Lock的LED对应着输出报告的最低位,

当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);

当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。

下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。
它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,

0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标
上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节

表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。
code char MouseReportDescriptor[52] = {
 
  //通用桌面设备
    0x05, 0x01,       
            // USAGE_PAGE (Generic
Desktop)
    //鼠标
    0x09, 0x02,    
               // USAGE
(Mouse)
    //集合
    0xa1, 0x01,    
               //
COLLECTION (Application)
    //指针设备
    0x09,
0x01,                
   //   USAGE (Pointer)
    //集合
 
  0xa1, 0x00,             
      //   COLLECTION (Physical)
 
  //按键
    0x05, 0x09,       
            // 
   USAGE_PAGE (Button)
    //使用最小值1
   
0x19, 0x01,             
      //     USAGE_MINIMUM (Button
1)
    //使用最大值3。1表示左键,2表示右键,3表示中键
    0x29,
0x03,                
   //     USAGE_MAXIMUM (Button 3)
 
  //逻辑最小值0
    0x15, 0x00,       
            // 
   LOGICAL_MINIMUM (0)
    //逻辑最大值1
   
0x25, 0x01,             
      //     LOGICAL_MAXIMUM
(1)
    //数量为3
    0x95, 0x03,    
               // 
   REPORT_COUNT (3)
    //大小为1bit
   
0x75, 0x01,             
      //     REPORT_SIZE (1)

    //输入,变量,数值,绝对值
   
//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键
   
//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0
    0x81, 0x02, 
              
   //     INPUT (Data,Var,Abs)
 
  //填充5个bit,补足一个字节
    0x95, 0x01,    
               // 
   REPORT_COUNT (1)
    0x75, 0x05, 
              
   //     REPORT_SIZE (5)
   
0x81, 0x03,             
      //     INPUT
(Cnst,Var,Abs)
    //用途页为通用桌面
    0x05, 0x01, 
              
   //     USAGE_PAGE (Generic Desktop)

    //用途为X
    0x09, 0x30,    
               // 
   USAGE (X)
    //用途为Y
    0x09,
0x31,                
   //     USAGE (Y)
   
//用途为滚轮
    0x09, 0x38,       
            // 
   USAGE (Wheel)
    //逻辑最小值为-127
   
0x15, 0x81,             
      //     LOGICAL_MINIMUM
(-127)
    //逻辑最大值为+127
    0x25, 0x7f, 
              
   //     LOGICAL_MAXIMUM (127)
 
  //大小为8个bits
    0x75, 0x08,       
            // 
   REPORT_SIZE (8)
    //数量为3个,即分别代表x,y,滚轮
 
  0x95, 0x03,             
      //     REPORT_COUNT (3)

    //输入,变量,值,相对值
    0x81, 0x06,    
               // 
   INPUT (Data,Var,Rel)
    //关集合
   
0xc0,                
         //   END_COLLECTION

    0xc0             
             // END_COLLECTION

};
通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,
则返回01 00 00
00(十六进制值),如果右键按下,则返回02 00 00 00,如果中键按下,
则返回04 00 00 00,如果三个键同时按下,则返回07 00 00
00。如果鼠标往右移动则
第二字节返回正值,值越大移动速度越快。其它的类推。

转 关于USB HID报告描述符,布布扣,bubuko.com

时间: 2024-10-12 19:48:09

转 关于USB HID报告描述符的相关文章

HID 报告描述符精细说明.

1,报告描述符概述    1.1) 报表描述符        报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的.报表描述符非常复杂而有弹性,因为它需要处理各种用途的设备.报表的数据必须以简洁的格式来储存,这样才不会浪费设备内的储存空间以及数据传输时的总线时间.实际上可以这样理解,报表内容的简洁,是通过报表描述符全面的.复杂的数据描述实现的.报表描述符必须先描述数据的大小与内容.报表描述符的内容与大小因设备的不同而不同,在进行报表传输之前,主机

浅析USB HID ReportDesc (HID报告描述符)

在USB中,USB Host是通过各种描述符来识别识别设备的,一般在设备枚举的过程将会获取有设备描述符/配置描述符/接口描述符/端点描述符/字符串描述符等 现在我们来介绍一下HID ReportDesc. 我们看一下在其内容为 我们先来使用HID Descriptor Tool来生成上面的数据 参考资料 1.Device Class Definition for Human Interface Devices (HID) Version 1.11 .PDF 2.HID Usage Tables

USB HID报告及报告描述符简介

在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符.        USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告.输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等:输出报告是主机发送给USB设备的,例如键盘上的数字

USB HID Report Descriptor 报告描述符详解

Report descriptors are composed of pieces of information. Each piece of information is called an Item.报告描述符由一些数据片组成.这些数据片被叫做Item.All items have a one-byte prefix that contains the item tag, item type, and item size. 每一个Item都包含一个字节的前缀,这个前缀中包含了三个信息--it

USB报告描述符的理解

报告描述符是用来描述一个报告的结构以及该报告里面的数据是用来干什么的 通过控制端点0来返回 bSize用来表示后面跟的数据的字节数 bType 用来表示条目的类型 0为主条目 1为全局条目 2为局部条目 bTag用来表示该条目的功能 主条目共有五个  输入input 输出output 特性feature 集合collection 关集合 end collection 全局条目 Usage page 用途页 Logical minimum 逻辑最小值 logical maximum逻辑最大值 ph

圈圈.报告描述符__ZC记录

1.ZC:到目前(20181126)为止,对 报告描述符的整体理解还是 有些困难,不能准确的说出(指明)其中的细节.还需要一边看报告描述符 一边对照资料查阅理解含义. ZC:现在,只理解了 一个大框架,和 其中的一部分细节(数据传输 在Collection中的 格式) ZC:下面我把 至今为止,对于 报告描述符的理解 都记录下来,方便以后查阅(隔得时间一长,我就会忘,又要重新翻资料 重新理解 甚是痛苦...) 2. 每行开始的第一字节为该条目的前缀,前缀的格式为: D7~D4:bTag(4位):

USB系列之二:读取USB设备的描述符

在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动编程,尽快看到成果,使读者对USB的开发充满信心,进而去研究USBD和HCD的编程方法.请读者自行阅读协议,文章中有关协议的详细情况,由于会涉及非常多的文字,恕不能过多解释.1.USB系统主机端的软件结构    一般来说,教科书或者协议上都会把USB主机端的软件说成有三层,第一层叫主机控制器驱动程序

lpc1768usb端点响应以及描述符定义

#ifndef __USBEP1_H_ #define __USBEP1_H_ #include "usb.h" #include "usbhw.h" extern s8 sendBuffer[4];    //鼠标数据发送缓冲区 extern u8 mouse_connect;    //鼠标连接标志 void usb_ep1_in_process(void); void usb_ep1_out_process(void); #endif #include &qu

USB HID描述符【转】

本文转载自: USB是个通用的总线,端口都是统一的.但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了.USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等.关于报告描述符,请看我以前写的:<USB HID报告及报告描述符简介 > http://group.ednchina.com/93/198.aspx.一个USB设备有一个设备描述符,设备描述符里面决定了该设