首页 > 其他分享 >USB协议详解第10讲(USB描述符-报告描述符)

USB协议详解第10讲(USB描述符-报告描述符)

时间:2024-09-17 19:25:00浏览次数:1  
标签:10 USB 报告 描述符 Usage 描述 数据 鼠标

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)一些标准设备的报告描述符进行学习,工具如下图,大家可以根据自己的硬件定义自己的报告描述符。

标签:10,USB,报告,描述符,Usage,描述,数据,鼠标
From: https://www.cnblogs.com/linhaostudy/p/18417401

相关文章

  • D10【python接口自动化学习】-python基础之内置数据类型
    day10列表学习日期:20240917学习目标:内置数据类型--列表:如何处理同类数据?学习笔记:列表的定义创建列表#创建列表colours=['red','blue','green']print(colours)#将列表打印出来['red','blue','green']print(type(colours))#<class&#......
  • 【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣965, 2331, 100, 1379
    1.力扣965:单值二叉树1.1题目:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例1:输入:[1,1,1,1,1,null,1]输出:true示例2:输入:[2,2,2,5,2]输出:false提示:给定树的节点数范围是 [1,......
  • 【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623
    1.力扣1022:从根到叶的二进制之和1.1题目:给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0->1->1->0->1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出......
  • D50 树的直径 P3629 [APIO2010] 巡逻
    视频链接: P3629[APIO2010]巡逻-洛谷|计算机科学教育新生态(luogu.com.cn)//两次DFS+树形DPO(n)#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=100005;intidx=1,head[N],to[N<<1],ne[N<<1],w[N<......
  • opencv-python学习笔记10-图像形态学处理
    目录一、基本概念: (1)结构元素(StructuringElement):(2)膨胀(Dilation):(3)腐蚀(Erosion):(4)开运算(Opening)(5)闭运算(Closing)(6)形态学梯度(MorphologicalGradient)(7)顶帽(Top-hat)和黑帽(Black-hat)转换(8)应用领域 二、膨胀:(1)基本概念:(2)原理:(3)方法:(4)OpenCV中的膨胀函数:(5)代码示例:(6)应用领域:(7......
  • CPU探针和监控指标事项(不少于100种)
    在机器监控中,CPU的监控指标确实非常多样化。以下是20多种重要的CPU指标及其作用:CPU使用率(CPUUtilization)作用:反映CPU整体负载情况,通常以百分比表示。用户时间(UserTime)作用:显示CPU在用户模式下执行程序的时间比例。系统时间(SystemTime)作用:表示CPU在内核模式下执......
  • Luogu P10812
    题目描述给定一根\(1\)到\(N\)的数轴。一开始有一个棋子在\(N\)。每次棋子\(x\)可以跳到\(x-1,x+1\)或\(x\)的因子处(不能超出\(1\)到\(N\))。每个点只能到达一次。求棋子到达\(1\)的方案数。思路由于求倍数比因子简单,所以把问题变成从\(1\)到\(N\),每次跳倍......
  • stm32f103 MPU6050利用DMP进行姿态解算(硬件iic,hal库)
    ​最近在捣鼓平衡车,需要用到MPU6050进行姿态解算,参考了一些文章,也自己解决了一些问题参考:2_小学生都能搞定的MPU6050DMP库向STM32HAL库的移植_哔哩哔哩_bilibili由于在移植的时候用的DMP是官网下载,所以和视频的讲解有些许不同的地方,如果所有资料都是按照视频中来的话,理论上是......
  • 跟着问题学10——RNN详解及代码实战
    1循环神经网络RecurrentNeuralNetwork什么是序列信息呢?通俗理解就是一段连续的信息,前后信息之间是有关系地,必须将不同时刻的信息放在一起理解。比如一句话,虽然可以拆分成多个词语,但是需要将这些词语连起来理解才能得到一句话的意思。RNN就是用来处理这些序列信息的任务......
  • USB gadget驱动框架(六)
    本节主要介绍udc驱动枚举过程,需结合udc驱动、composite.c、function等一同分析整个过程。udc驱动中断处理函数当host检测到DP上拉,则认为有新的device插入,此时host将发起进入枚举流程,整个枚举流程大部分是在中断函数中处理,协议对时间有相关的要求,因此整个枚举流程是不能加入过多......