转自:https://blog.csdn.net/jiujiujiuqiuqiuqiu/article/details/47277685

一.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 Desktop
  2. 0x09,0x06,// Local KeyBoard
  3. 0xA1,0x01,// Main app collection
  4. 0x05,0x07,// Global KeyBoard
  5. //////////////////////////////////第1字节
  6. 0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)
  7. 0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)
  8. 0x15,0x00,// Global Logical Min
  9. 0x25,0x01,// Global Logical Max
  10. 0x95,0x08,// Global ReportCount
  11. 0x75,0x01,// Global ReportSize
  12. 0x81,0x02,// Main Input(Data,Var,Abs)
  13. //////////////////////////////////第2字节
  14. 0x95,0x01,// Global ReportCount
  15. 0x75,0x08,// Global ReportSize
  16. 0x81,0x03,// Main Input(Cnst,Var,Abs)
  17. //////////////////////////////////第3-8字节
  18. 0x95,0x06,// Global ReportCount
  19. 0x75,0x08,// Global ReportSize
  20. 0x15,0x00,// Global Logical Min
  21. 0x26,0xff,0x00,//Global Logical Max
  22. 0x19,0x00,// Local Usage Min
  23. 0x29,0x65,// Local Usage Max
  24. 0x81,0x00,// Main Output(Data,Ary,Abs)
  25. ////////////////////////////////1字节输出报告
  26. 0x15,0x00,// Global Logical Min
  27. 0x25,0x01,// Global Logical Max
  28. 0x95,0x05,// Global ReportCount
  29. 0x75,0x01,// Global ReportSize
  30. 0x05,0x08,// Global LED
  31. 0x19,0x01,// Local Usage Min
  32. 0x29,0x05,// Local Usage Max
  33. 0x91,0x02,// Main Output(Data,Var,Abs)
  34. ////////////////////////////////补足上面变成1个字节
  35. 0x95,0x01,// Global ReportCount
  36. 0x75,0x03,// Global ReportSize
  37. 0x91,0x03,// Main Output(Cnst,Var,Abs)
  38. 0xc0 // Main End collection
键盘的描述符共有8字节的输入报告和1字节的输出报告。
8字节输入报告:第1字节特殊按键,第2字节保留常量,第3-8字节普通按键。键值可以参考USB HID to PS/2 Scan Code Translation Table.
1字节输出报告:这1个字节总共用了5bits使用3bits常量来补足成1个字节。5bits用来点亮特殊键盘上的Led灯,比如键盘的大小写,数字键,小键盘的LED灯。
如果不给键盘配置OUT端点,那么键盘的1字节输出报告将由控制端点的SetReport进行传输。
(2)鼠标描述符
  1. 0x05,0x01, // Global Generic Desktop
  2. 0x09,0x02, // Local Mouse
  3. 0xa1,0x01, // Main app collection
  4. 0x09,0x01, // Local Pointer
  5. 0xa1,0x00, // Main phy collection
  6. 0x95,0x03, // Global ReportCount
  7. 0x75,0x01, // Global ReportSize
  8. 0x05,0x09, // Global Button
  9. 0x19,0x01, // Local Usage Min
  10. 0x29,0x03, // Local Usage Max
  11. 0x15,0x00, // Global Logical Min
  12. 0x25,0x01, // Global Logical Max
  13. 0x81,0x02, // Main Input(Data,Var,Abs)
  14. 0x95,0x01, // Global ReportCount
  15. 0x75,0x05, // Global ReportSize
  16. 0x81,0x03, // Main Input(Cnsr,Var,Abs)
  17. 0x95,0x03,0x75,0x08, // Global ReportCount Global ReportSize
  18. 0x05,0x01, // Global Generic Desktip
  19. 0x09,0x30, // Local X
  20. 0x09,0x31, // Local Y
  21. 0x09,0x38, // Locak Wheel
  22. 0x15,0x81, // Global Logical Min
  23. 0x25,0x7f, // Global Logical Max
  24. 0x81,0x06, // Main Input(Data,Var,Rel)
  25. 0xc0, // Main End collection
  26. 0xc0 // Main End collection

鼠标描述符有4字节输入报告。第1个字节前3位表示左右中三键,后面3个字节分别表示X轴,Y轴,滑轮。

关于USBHID协议以及鼠标键盘描述符的解释【转】的更多相关文章

  1. USB学习小记-HID类键盘的报告描述符的理解

    前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...

  2. USB协议-USB的描述符及其之间的关系

    USB只是一个总线,只提供一个数据通路而已.USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为.具体的一个设备实现什么功能,要由设备自己来决定.那么,USB主机是如何知道一个设备的功能以及行为 ...

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

    在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID ...

  4. USB描述符解析-->枚举.

    枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符  02H ...

  5. USB描述符【整理】

    USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主 ...

  6. HID 报告描述符精细说明.

    1,报告描述符概述    1.1) 报表描述符        报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的.报表描述符非常复杂而有弹性,因为它 ...

  7. USB 描述符

    标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. // Standard Device Descriptor typedef struct { u8 ...

  8. Python 描述符是什么?以及如何实现

    先看一个例子,@property.被@property修饰的成员函数,将变为一个描述符.这是最简单的创建描述符的方式. class Foo: @property def attr(self): pri ...

  9. usb的hid鼠标键盘报告描述符(五)

    title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...

随机推荐

  1. asp.net 网页拉伸 到300%不变形方法一

    网页拉伸到300%控件和表格不会出现太大变形 方法: 1.对主页面采用百分比宽度(Width="100%") 2.对于表格使用百分比宽度,包括表格宽度和表格中顶端td宽度 3.对t ...

  2. nil Nil NULL NSNull 之间的区别

    nil -> Null-pointer to objective- c objectNIL -> Null-pointer to objective- c class  表示对类进行赋空值 ...

  3. Software-Defined Networking:A Comprehensive Survey--Day3

    (接Day2的内容 +2s) E. Layer V: Northbound Interfaces 南行接口已经得到广泛接受(OpenFlow),但现在就定义北向接口还为时尚早,开发不同的控制器经验一定 ...

  4. idea打jar包没有MANIFEST文件坑

    看到横线处没有,将此处的main\java 删除掉 meta-inf文件夹必须在src文件夹下,才能打包成功, idea自动加了 main/java 会导致打包时,找不到该manifest文件,不会将 ...

  5. Java 工厂方法模式

    在工厂对象上调用创建方法,生成接口的某个实现的对象 通过这种方式,接口与实现分离 方法接口 /** * 方法接口 */ public interface Service { void method1( ...

  6. 基于Vue-cli 快速搭建项目

    Vue-cli可以快速帮助我们创建一个项目,这是官方给我们提供的脚手架.下面我说一下vue-cli的使用方法. 一.准备工作 在使用vue-cli时,首先需要安装nodejs,npm,其次需全局安装v ...

  7. 51nod 1480 打广告(二分+线段树)

    题意 给出n个区间和m个区间,从这n个区间里选一个区间a,这m个区间选一个区间b,使得a&b的长度*c最大. 思路 如果这n个区间里有一个区间包含另一个区间,那另外一个区间就可以忽略掉,进行\ ...

  8. 洛谷P3302 森林

    题意:给定森林,可以把两棵树连起来或者询问链上第k大. 解:启发式合并. 我一开始想到了启发式合并但是发现这样做之后一棵子树就不是一段连续的区间了,那就不能子树xxx了,很迷惘. 后来看了题解发现本来 ...

  9. redirect和forward的区别

    异同 1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以 ...

  10. jQuery获取radio选中后的文字

    原文链接:http://blog.csdn.net/zhanyouwen/article/details/51393216 jQuery获取radio选中后的文字转载 2016年05月13日 10:3 ...