1.报告描述符的概念和作用

开门见山,报告描述符就是描述报告(HID接口上传输事务中的数据)的一组数据结构

首先大家可能会问,报告又是什么?我们前面讲过,USB主机一般是以中断的方式向HID设备发送或者索取数据,也就是说USB主机发送一个请求,设备要根据硬件操作,向主机提交自己的状态变化,例如鼠标,当主机给鼠标设备发送请求后,鼠标需要把自己当前位置信息发送给主机。其实大概应该清楚了,报告就是我们说的传输事务中的原生数据,如果是鼠标的话,这份报告则为鼠标左移、鼠标右移、鼠标滑轮滚动、鼠标左键、鼠标右键的当前状态数据的集合。

但是我们知道,我们看到的鼠标各各样,有很多鼠标是只有两个按键,有很多七八个按键,如下图,那么问题来了,这么多类型不一样的鼠标,主机是怎么知道鼠标设备发上来的一堆数据(报告)中哪个数据代表哪个按键,报告描述符来解决这个问题,这就是报告描述符的作用,就是描述HID设备数据的用途及属性。

主机在对HID设备进行枚举的时候,会拿到报告描述符,之后给设备发送数据或者接收到设备数据会按照报告描述符对数据的每一位进行解析。

报告描述符如果全面讲解可以单独成书(还真是两本书,书名为hid1_11.pdf和hut1_21_0.pdf,大家可以关注一个早起的程序员,然后点击下载获取),本篇文章会抓重点讲解,教会大家报告描述符的数据结构并举例,大家可以在学习过程中举一反三。

2.报告描述符中的通用项(Item)

我们知道了报告描述符的概念及作用之后,那么大家肯定想知道了报告描述符是怎么描述数据的,其实报告描述符是由一个一个通用项组成,每一个通用项可以描述一个或者多个相同功能的数据(比如同时描述8个按钮),包括数据的用途和各种属性。

3.通用项结构详解

Item有两种类型,Short Item和Long Item,结构组成如下,一般我们接触到的都是Short Item,本篇博文也主要讲解Short Item。

(1)Short Item

(2)Long Item

在 Short Item 中,起始的 1 Byte 代表了这个 Item 的大小和类型,如下:

bSize :代表后面的数据,最大 4 bytes。

bType :代表了这个 Item 是什么类型的 Item,这里有三种大的类型:Main(0x00)、Global(0x01)、Local(0x02)。

bTag :代表在对应的 Item 下的更加细的分类,也可以称之为标签。

| —— Main      分为:Input、Output、Feature、Collection、End Collection。

| —— Global    分为:Usage Page、 Logical Minimum、Logical Maximum、Physical Minimum、Physical Maximum、Report Size、Report ID等等。

| —— Local     分为 :Usage 、Usage Minimum、Usage Maximum、String 等等。

对于 bSize + bType + bTag 的 1 Byte 的组合详见下表:

4.Main、Global、Local标签功能

非常核心的核心: 在阅读 Report 的时候,都是先用Global和Local标签说明数据项的各种相关属性,然后最后用一个Main标签进行输入输出说明,Main标签的出现就是一个数据项的结束。

前面提到通用项主要分为Main、Global、Local,大家肯定会问为什么要分类,他们三个到底是用来做什么的,下面一一讲解。

Mian类标签:主要用来对数据项的描述(Input、Output、Feature)和管理(Collection、End Collection)。

  • 描述数据项:比如一个这个数据项到底是主机输入还是输出;
  • 管理数据项:比如把多个数据项组织到一起。

Global类标签:对数据项的描述,这个主要用来描述数据项的用途数据逻辑范围数据物理范围数据大小数据个数,它的用法和我们平时看到的全局变量特别像,当定义之后,之后的所有数据项都是使用定义的属性,除非再此定义,如下详细说明。

Local类标签:对数据项的描述,和Global标签的作用类似,它的用法和我们平时看到的局部变量特别像,就是作用于不一样,只在本数据内项生效。

5.核心标签功能

1.Usage Page和Usage

用于描述数据项的用途,这个标签非常复杂,当UsagePage变化时Usage子功能也会跟着变化,下面会详细讲解。也可以阅读文档“HID Usage Tables”获得更多使用细节,大家可以关注我,然后点击下载获取本书电子版,也可以去USB IF官网下载。

**2.Logical ** Maximum

描述数据逻辑单元中的范围值。这是变量或数组项将要报告的最大值。例如设备报告的一个电压值读数是1V,而一个单位是 2mV ,则 Logical Maximum 值等于 500 。

3.Logical Minimum

描述数据逻辑单元中的范围值。这是变量或数组项将要报告的最小值。

4.Physical Maximum

描述数据真实的最大值,比如电压最大为2V,一个单位是 2mV ,则该值最大仍是2000mV,表示物理真实值。

5.Physical Minimum

描述数据真实的最小值。

6.Report Size

以位(bit)为单位指定数据的大小,无符号整数。

7.Report Count

无符号整数,指定总共需要多少个同类型的数据。

8.Input

此项数据为设备到主机的。

9.Output

此项数据为主机到设备的。

10.Report ID

报告的ID,一个报告描述符可以描述多个HID功能,主机通过报告的ID就知道是哪个HID功能硬件发送的数据。举个例子,如果一个USB HID设备为键鼠一体的设备,就可以通过Report ID把键盘和鼠标的数据描述分开,这样可以实现面向对象管理,其实就是相当于实现了多个报告,设备在发送数据的时候,第一个字节永远是Report ID,如果是鼠标发送事务第一个字节(Report ID)为1,如果是键盘发送事务第一个字节(Report ID)则为2,这样分开描述数据其实也就是分开了事务功能本身,如果一个很复杂的HID设备在设计的思路上可以分治而行,可以大大减小设计难度。

11.Collection

用于对数据描述项进行组织和管理,和End Collection一起使用

6.STM32某鼠标设备报告描述符详细说明

上面的报告描述符实现一个鼠标设备,主要有3个数据描述项组成。描述符总共描述了4个字节的报告(数据),数据描述项1描述了数据的第1个字节前3bit,代表鼠标的3个按钮,数据描述项2为了描述数据对齐操作,数据描述项3描述了数据的第2-4字节,代表鼠标的左右移动、上下移动、滚轮滚动的数据,这4个字节都是设备到主机的数据。其他的细节在注释里面讲解的很清楚。

假设设备给主机发送了当前最新4个字节的数据(报告),先低字节后高字节:0x01 0x00 0x00 0x00,主机会解析到鼠标左键被按下,鼠标没有移动,滑轮也没滚动,就是这样子理解的。

7.报告描述符用途查询

报告描述符Usage page和Usage可以通过hut1_21_0.pdf(HID Usage Tables )文档查询,首先每一个Usage Pages下面都包含多种Usage,下面会说明所有的Usage Pages,每一个Usage Pase下面的Usage大家可以直接点击查看。

我们可以点击Generic Desktop Page (0x01)去查询下面更具体的Usage,如下:

8.报告描述符生成工具介绍

我们可以用HID Descriptor Tool生成报告描述符,也可以直接打开(open file)一些标准设备的报告描述符进行学习,工具如下图,大家可以根据自己的硬件定义自己的报告描述符。

USB协议详解第10讲(USB描述符-报告描述符)的更多相关文章

  1. HTTP TCP UDP ICMP IP ARP 协议详解(10.15 第二十一天)

    ARP协议 ARP(Address Resolution Protocol)协议 地址解析协议 把网络层的IP地址翻译成在数据链路层寻址的48位硬件地址(MAC地址) 在OSI模型中ARP协议属于链路 ...

  2. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  3. linux usb 驱动详解

    linux usb 驱动详解 USB 设备驱动代码通过urb和所有的 USB 设备通讯.urb用 struct urb 结构描述(include/linux/usb.h ). urb 以一种异步的方式 ...

  4. bt协议详解 DHT篇(上)

    bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...

  5. HTTP协议详解以及URL具体访问过程

    1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从 ...

  6. (转)HTTP 协议详解(基础)

    HTTP 协议详解 作者: 小坦克  来源: 博客园  发布时间: 2012-02-14 13:32  阅读: 95523 次  推荐: 99   原文链接   [收藏]   相关文章:HTTP 协议 ...

  7. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  8. 【转载】TCP /IP协议详解

    首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...

  9. HTTP 协议详解(转载)

    原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...

  10. Fiddldr 教程之:HTTP协议详解(转)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

随机推荐

  1. Microsoft Dynamics CRM 365/2016 配置POP3/STMP邮箱(附例)

    前期准备: 必须支持pop3/stmp的邮箱 以下用网易163邮箱做的测试,注意开通了独立安全码,非邮箱登录密码 1.打开设置>>电子邮件配置 2.新建电子邮件配置 pop3/smtp 3 ...

  2. 自写Json转换工具

    前面写了简单的API测试工具ApiTools,返回的json有时需要做很多转换,于是开发了这个工具. 功能包括 1.json字符串转为表格,可以直观的展示,也可以复制,并支持转换后的表格点击列头进行排 ...

  3. 【BlueTooth】 小米手机蓝牙传输文件

    打开小米手机的蓝牙设置,寻找电脑设备(电脑装有蓝牙设备) 同时电脑也打开蓝牙面板,两个设备都开始进行匹配: 然后电脑打开蓝牙的[接收传输文件] 手机打开图库或者文件管理,找到文件发送时选择[蓝牙] 传 ...

  4. 【Java】MultiThread 多线程 Re02 线程通讯

    一.等待与唤醒 /** * 线程通讯问题 * Object wait, notify, notifyAll * Condition await signal signAll * CountDownLa ...

  5. 深度解读KubeEdge架构设计与边缘AI实践探索

    摘要:解读业界首个云原生边缘计算框架KubeEdge的架构设计,如何实现边云协同AI,将AI能力无缝下沉至边缘,让AI赋能边侧各行各业,构建智能.高效.自治的边缘计算新时代,共同探索智能边缘的新篇章. ...

  6. 你要的高效方案!基于Apache SeaTunnel快速集成SAP进入Redshift

    摘要 本文深入探讨了Apache SeaTunnel及其商业版可视化数据同步平台WhaleTunnel在数据整合领域的应用,特别是如何高效地将SAP系统中的数据同步到Amazon Redshift.通 ...

  7. Java核心技术之Date相关

    import java.time.DayOfWeek; import java.time.LocalDate; import java.util.Scanner; /** * @author Suns ...

  8. Notes for uc/OS-III User Guide

    1. Architecture F2-1(1) The application code consists of project or product files. For convenience, ...

  9. openstack硬盘扩容

    1.挂载好新硬盘后输入fdisk -l命令看当前磁盘信息2.用fdisk /dev/vda 进行分区3.进入fdisk命令,输入h可以看到该命令的帮助,按n进行分区4.这里输入e即分为逻辑分区,按p即 ...

  10. 防止npm被墙的小技巧

    方法一: 全局安装中国服务器的包管理工具 npm i cnpm --global 下载包的时候用cnpm取代npm 方法二: 在小黑板输入:npm config set registry https: ...