[HID]Spec简读

简述

USB协议在计算机中使用非常广泛,在外部有USB设备插入时,就会检测到并进行初始化和启动,而后遵循USB协议传输数据,供应用获取来使用。

USB设备种类过于繁多,因此被划分为了不同的设备类(Device Class),而HID(Human Interface Device Class,人机交互设备类)就是其中尤为重要的一类。当然也还有许多其他的常见的设备类:

什么是HID

人机交互?还是比较笼统,HID具体的定义是“HID设备是指那些可被用来控制和操作计算机系统的设备”。其常见的一些举例如下:

  • 键盘与指针设备—-如标准mouse,trackballs, joystick
  • 面板控制设备—-如knobs, switches, buttons, and sliders
  • 在类似手机,VCR遥控器上的控制设备—-如data gloves, throttles, steering wheels, and rudder pedals
  • 一些可能并不需要人输入但输出数据的控制设备—-如bar-code readers, thermometers, voltmeters

HID设备管理

HID设备的信息被存于其ROM中,被称为descriptor(描述符,还是用英文更贴切)的结构,因此在设计实现自己的HID设备时,弄清楚或者定义好descriptor应该是最为关键的一步。如下所示,descriptors组成了information和data:

而在设备的不同阶段和状态,会涉及到许多不同类别的descriptor:

这其中HID开发时接触最多的还是Report Descriptor了,因为Report Descriptor都被用来传输各类应用数据。

HID之所以要使用Report Descriptor,主要是扩展性考虑,用Report来表示其传输的数据类型,这样对于不同的HID设备,就不需要针对每个定义一个SubClass了。HID设备一被检测到,Report Descriptor就会被加载和解析。

Report Descriptor Format

Report Descriptor的数据组织形式是一个个的信息段,每个信息段称为Item:

Item Format

上面提到的Item的格式表示如下:

Item的第一个byte可表示Item的类型,是long item或short item,如下是一个long item示例:

Item Parser

Item parser会从接收到的Report Descriptor数据中,逐个进行Item的抽取,每抽取一个就放在Item state table的对应位置。这就是Item parser的过程了:

当一个Main item被找到时,就需要分配并初始化一个report结构,并将其中的Local item放到这个report结构下。而Global item是对于所有report结构都适用的,只是Global item会对其后面的所有的report结构都会起作用。

对于Push和Pop item的理解:

item state table相当于一个全局变量,只能暂存一个item state table(表示一个Report Descriptor的整体数据),而另外有一个stack,可以将某一时刻的item state table的快照放到该stack当中,当后面的item state table全局变量改变了,要使用之前的item state table内容时,这时候stack中暂存的item state table就要起作用咯。

Usages

用来表明Report Descriptor中数据的用途的,一个Report Descriptor中是会有多个usage的,因为其中数据本来就是分片的(items)。

Usage划分为Page和ID组合的方式,这样可以表示更多用途,即通过两级来区分用途,首先是用途page,然后对应用途page下的用途ID:

Reports

Report是HID最终实际用来进行有用数据传输的,前面的Usage在HID设备刚接入时,就会被读取,而Report Descriptor被Host读取后,HID Device可以向Host发送Reports,也可以从Host接收Reports。有三种Reports类别:

有些时候一个Report Descriptor只描述了一个Report,这时候就不需要区分是哪一个Report的问题:

而有的时候,一个Report Descriptor中描述了好几个Report,这时候就要引入一个Report ID来标识是哪个Report的数据:

Strings

一般,在用户自定义了某数据段用途,此时Strings的使用就有必要的,因为要进行比较详细的描述。

Strings和Usage一样,对一个item而言并不是必须的。

多字节值格式

有些数值是可变的,即在一定的范围之内,这个数值可能用多个byte区域来表示,这些bit的排列都是按照little endian来排列的,如下是一个实例:

Orientation

一些有方向性的数据表示时,HID设备一般有统一的方向上的规定:

如上面就是坐标的方向正负规定,另外还有on(1)/off(0)表示和true(1)/false(0)的统一规定。

Null Values

HID设备有忽略一个report中某些数据段的能力。这里的意思是,通过声明report中的某bit区域可以放置比实际control产生的数据要大的数值的(一个control就是一个控制,如键按下,用data来描述一个control的内涵的)。

当host或device收到这个超出实际control含义的数据时,也不会去改变这个数据。

如果每次发给device的report的某个数据段,Application都不会去改变它,这个数据段应当提供一个Null Value。

Null Value举例:

比如一个8 bit的数据段,数据可以表示从0到0xFF的,但是该数据段已声明有效范围是0到0x7F,那接收到的在0x80到0xFF之间的数值都会被忽略掉。

HID设备的Descriptor

三种Descriptor,HID Descriptor, Report Descriptor和Physical Descriptor。

HID Descriptor

Report Descriptor

Report Descriptor的意义:

只要通过查看Report Descriptor,App就可以知道详细的HID设备的数据的含义,进而进行对应的处理。

Global和Local item是对Main item内容的附加限定:

Control的再次说明:

一个HID device可能有多个control,一个control就是一个方面的控制功能,如一个按键控制功能,一个LED控制功能等。

Report必须具备的item

关于其中的Input(Output or Feature)类型的说明:

Feature item,是Host可以通过application来设置Device的一些特性,比如复位坐标原点,扫描频率等,这些设置可能Device并不能很明显的看到,是在Device内部的一些属性特征的改变。

而Output,则是对Device执行的某些命令控制操作,例如点灯,播放音频等。

Physical Descriptor

用来描述人在控制某个动作时,有怎样的物理上的要求。比如去按下其中第二个按钮时,需要使用左手等这类描述。

时间: 2024-08-28 13:38:53

[HID]Spec简读的相关文章

大道至简 读后有感

大道至简  读后有感 结束大一的课程,自己总结收获,并没有觉得自己在计算机方面有了什么明显的进步,很想在以后的学习里能有所进步,而且这学期又新增了很重要的java课程,所以决定痛下决心,好好学习一番,便想以这<大道至简>作为开篇. 这几天看了本书的第一章,第一章的总体理念为编程的精义,共分为5个小结,即编程的精义,会或不会写程序,程序等于结构加算法,语言以及在没有工程的时代. 在编程的精义这一小节中,开篇便以愚公移山这一寓言故事来类比编程这一项工作,它通过古文中的话来形象的比喻了编程工作中的各

React v16-alpha 源码简读【未完待续】

一.物料准备 1.克隆react源码, github 地址:https://github.com/facebook/react.git 2.安装gulp 3.在react源码根目录下: $npm install $gulp default (建议使用node 6.0+) gulp将文件处理在根目录下的build文件夹中,打开build查看react的源码,结构清晰,引用路径明了 二.从生成 virtual dom 开始 react 生成一个组件有多种写法: es 5下:var Cp=React.

简读《构建之法》,所想问题展示

1,<构建之法>这本书全局语言通俗,学生很容易读懂,但是存在一个隐患:学过软件工程,我们只是笼统的理解,而对这方面的专业知识很少了解,该怎么办? 2,书中提到的软件结构,软件设计与实现具体是怎样的?怎么理解它们之间的关系? 3,软件在不断更新和增加功能的负担下,一定程度下会崩溃.若有一个软件,即将考虑添加下一个功能,但是在添加这个功能之后,系统一定会崩溃,但是这个功能对这个软件的市场前景起着至关重要的作用,这是该怎么办? 4,软件设计和软件构建有区别吗?不同之处是什么? 5,当软件中的依赖关系

简读《构建之法》提问

一.         文中提到了软件工程和计算机科学的关系与区别,那么究竟是软件催促着硬件的更新还是硬件的更新导致了软件的更新.文中说软件的重点在于构架,硬件上也有架构这一说,那么这两个之间有没有关系呢,是不是新的软件构架侧生了新的硬件架构. 二.       文中有一句很矛盾的话:百分之白的代码覆盖率不等同于百分之百的正确性,这里的代码覆盖率是什么意思.个人理解是代码所包含的所有可能的运行结果,如果是这样,那么既然所有的结果都包含了怎么会没有百分之百的正确性? 三.   书上说过有代码复审这一

Java volatile关键字简读

Java volatile关键字解读-多变的,易变的 volatile访问内存内存模型: - 1.常用变量是由主内存加载到缓存,线程进一步获取变量内容. - 2.volatile每次访问直接访问主内存cpu,保证缓存一致性,实现轻量级同步 Demo public class VolatileDemo { private static volatile boolean flag = false; public static void main(String[] args){ Thread thre

简读《我编程,我快乐:程序员职业规划之道》

晚上洗完澡觉得没啥事干,打开电脑看到刚好有本这个书就读起来了.没想到还有点意思,就一口气翻完,下面是我简要勾勒出来的东西. 做团队中最差的,明智的选择你的圈子 通才很少,所以很珍贵 成为专家 热爱它,不然就离开它 要主动问,不要等到别人来告诉你 练习,练习,再练习 topCoder code Kata 选择一个项目,像读书一样研读并且做笔记,归纳出好的方面和坏的方面 每天都有可汇报的成绩 要有雄心,但不要搞得路人皆知 记录开发日志, Google never forgets Demo or di

android.support.v4包中的LruCache源码简读

package android.util; import java.util.LinkedHashMap; import java.util.Map; /** * A cache that holds strong references to a limited number of values. Each time * a value is accessed, it is moved to the head of a queue. When a value is * added to a fu

Android 自定义View背景动画 流程简读 &lt;2&gt;

这一篇主要根据上一篇的大致说明,我相信如果看完这一篇,对开发自定义View将会有很大的帮助, 先介绍ColorStateList和StateListDrawable两个类: ColorStateList说明:https://developer.android.com/reference/android/content/res/ColorStateList.html StateListDrawable说明:https://developer.android.com/reference/androi

express简要代码简读

express 是一个js的web框架,对http库进行了二次封装.下面是一段精简简要解读,带注释. 依赖npm外部库:express.body-parser.multer body-parser是一个进行解析request的body段区域的js库 multer是一个进行解析文件upload的库 使用这三个库,会使js web开发变得更加优雅 var express = require('express');//express模块,需要安装 var bodyParser = require('b