USB HID设备是通过报告(report)来传输数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机;输出报告是主机发送给USB设备。

报告描述符是用来描述一个报告的结构以及该报告里面的数据是用来干什么用?

报告

报告里面包含的是所要传输的数据,数量为整数字节,被划分为一个个域。通常,输入报告是通过中断输入端点返回的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。通过报告描述符,USB主机分析出报告里面的数据所表示的含义,与普通的描述符一样,都是通过输入端点0来返回,主机使用获取报告描述符请求来获取报告描述符,注意这个请求是发送到接口的,而不是设备。

报告结构

报告描述与前面所遇到的描述符结构不一样,它并没有描述符长度和描述符类型等信息,而是由一个条目(item)组成的。

HID协议中规定了两种条目:短条码和长条目。条目前缀的结构如下:

短条目由1字节的前缀后面跟上可选的数据字节组成。可选的数据字节可以为0字节、1字节、2字节或者4个字节。前缀的最低两位D1和D0为bSize,用来表示后面所跟踪的数据的字节数,0位0字节,1为1字节,2为2字节,3为4字节。D3和D2位bType,表示条目的类型,0为主(main)条目,1为全局(global)条目,2为局部(local)条目,3为保留值。bTag表示该条目的功能,具体请参看HID协议及HID用途表。

主条目总共有5个,分别为Input(输入)、Output(输出)、Feature(特性)、Collection(集合)和End Collection(关集合)。主条目用来定义或者分组报告的数据域。

全局条目主要用来选择用途页 ,定义数据域的长度,数量,报告ID等。全局条目在出现后对接下来的所有主条目都有效,除非遇到另外一个全局条目来改变它。常用的全局条目有:Usage Page(用途页)、Logical Minimum(逻辑最小值)、Logical Maximum(逻辑最大值)、Physical Minnimum(物理最小值)、Physical Maximum(物理最大值)、Report Size(数据域大小)、Report Count(数据域数量)和Report ID(报告ID)。其中,Report Size用来描述某个数据域有多少位;Report Count用来描述这样的数据域有多少个;Logical Minimum和Logical Maximum用来描述数据域的取值范围。

局部条目用来定义控制的条件,例如,该数据域的用途、用途大小值、用途最大值等。局部条目只在局部有效,遇到一个主条目后,它的效用结束了。常用的局部条目有:Usage(用途)、Usage Minimum(用途最小值)、Usage Maximum(用途最大值)。

例如:

/*    HID报告描述符                                            */
const uint8_t HID_ReportDescriptor[] = {// 全局条目,说明用途,0XFF自定义0x05, 0xFF, // USAGE_PAGE(User define)// 全局条目,说明用途,0XFF自定义0x09, 0xFF, // USAGE(User define)// 这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示该集合是一个应用          集合// 它的性质在前面有页用途和用途定义为普通桌面应用0xa1, 0x01, // COLLECTION (Application)// 全局条目,选择用途页1为普通桌面0x05, 0x01, // USAGE_PAGE(1)// 局部条目,说明用途的最小值为00x19, 0x00, // USAGE_MINIMUM(0)// 局部条目,说明用途的最大值为2550x29, 0xFF, // USAGE_MAXIMUM(255)// 全局条目,说明返回的数据的逻辑值最小为00x15, 0x00, // LOGICAL_MINIMUM (0)// 全局条目,说明返回的数据的逻辑值最大为2550x25, 0xFF, // LOGICAL_MAXIMUM (255)// 全部条目,说明每个数据域的长度为8字节0x75, 0x08, // REPORT_SIZE (8)// 全局条目,说明数据域的数量为320x95, 0x40, // REPORT_COUNT (32)// 这是一个主条目。它说明这三个8位的数据域是输入用的,属性为:Data,Var,Abs0x81, 0x02, // INPUT (Data,Var,Abs)// 全局条目,选择用途页2为普通桌面0x05, 0x02, // USAGE_PAGE(2)// 局部条目,说明用途的最小值为00x19, 0x00, // USAGE_MINIMUM (0)// 局部条目,说明用途的最大值为2550x29, 0xFF, // USAGE_MAXIMUM (255)// 全局条目,说明返回的数据的逻辑值最小为00x15, 0x00, // LOGICAL_MINIMUM (0)// 全局条目,说明返回的数据的逻辑值最大为2550x25, 0xFF, // LOGICAL_MAXIMUM (255)// 全部条目,说明每个数据域的长度为8字节0x95, 0x08, // REPORT_COUNT (8)// 全局条目,说明数据域的数量为320x75, 0x20, // REPORT_SIZE (32)  32字节命令// 这是一个主条目。它说明这三个8位的数据域是输出用的,属性为:Data,Var,Abs0x91, 0x02, // OUTPUT (Data,Var,Abs)// 关闭集合0xc0 // END_COLLECTION
};

USB(六)-HID(报告描述符的结构实现)相关推荐

  1. USB描述符(附加USB HID报告描述符 )

    USB描述符介绍 USB描述符是主机识别USB设备的依据,主机根据设备的描述符来加载相应的驱动 USB描述符的作用 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送Get ...

  2. HID 报告描述符的填充方式

    前言 本文结合博文:http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/ 以及实践,介绍HID 报告描述符的编写过程中 ...

  3. USB。标准键盘的报告描述符解析。

    标准键盘的USB HID报告描述符主要描述了键盘的输入报告(input report)和输出报告(output report).输入报告用于描述键盘按键数据的传输,输出报告用于控制键盘上的LED指示灯 ...

  4. DIY蓝牙键盘(2) - 理解HID报文描述符

    1. 前情回顾 上篇主要讲了键盘报文的分类与格式,并留下了一个问题:那主机为什么知道我这些报文的格式?那肯定是主机要提前知道我们发的报文的格式,那么问题就变成了:在发送报文前我们要怎么通知主机,让它知 ...

  5. USB HID设备报告描述符详解

    概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明. USB通讯协议的规范是以1ms产生一个USB帧(Frame),USB设备可 ...

  6. HID报表描述符(目前最全的解析,也是USB最复杂的描述符)

    说一下为什么写这篇文章,主要是最近在做关于USB-HID设备的描述符,看到关于HID报表描述符的解析有点少,自己看了下,后续还会发布还有关于USB的各种解析,有兴趣可以看看,可以让你更加明白USB工作 ...

  7. 蓝牙HID规范的报告描述符【另外一篇文章】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  8. Windows Touchpad 报告描述符实例

    最近在做USB touchpad,发现touchpad和touchscreen有些区别,而且不同的操作系统也有些差异,下面以windows系统进行说明: 根据微软文档(https://docs.mic ...

  9. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

最新文章

  1. 深度学习无法解决的问题,只有强化学习才能解决
  2. JavaScript作用域链
  3. 非常好!!!Linux源代码阅读——环境准备【转】
  4. 快讯|MIT遥控机器人;日本推出带摄像头的智能AI马桶;德国在线零售商Zalando引进拣货机器人等...
  5. 实现定时中断_无线传感器网络实验报告(二)Timer定时应用实验
  6. Excel复制粘贴——跳过空单元格案例
  7. iOS开发者《用2块钱快速创建你的网站或博客》
  8. VSCode中文字体那个最好看
  9. vim-airline use patched fonts
  10. Python|如何正确安装PaddleOCR
  11. oracle创建完成 sys密码怎么修改,如何重置密码 oracle sys和system
  12. 类神经网络训练不起来怎么办——机器学习模型训练指南
  13. Linux下常用压缩 解压命令和压缩比率对比
  14. 激光雷达SLAM方法汇总 | 自动驾驶和移动机器人领域
  15. OCIStmtExecute发送接收处理的定位
  16. bzoj1003 [ZJOI2006]物流运输(最短路+dp)
  17. 2.3 高密度散点图
  18. UIPATH 数据提取
  19. 安装Docker详细步骤总结
  20. android 文字闪烁效果,Android Shader应用开发之霓虹闪烁文字效果

热门文章

  1. 基于51单片机的万年历(算法实现)
  2. matlab 逻辑回归实现,逻辑回归原理介绍及Matlab实现
  3. 电商用户RFM分析(平均值计算中心点)
  4. 在线画图软件项目结构图
  5. mysql workbench安装教程_MySql可视化工具MySQL Workbench使用教程
  6. Bootstrap全部知识点总结
  7. 基于单片机体温心率检测仪系统设计(毕业)资料
  8. 使用LINUX云服务器搭建web、小程序服务器MySql+Java+Tomcat
  9. 运放电路的知识点(二)
  10. 英语语法篇 - 英语的补语