{{Ptl}}模板已弃用。 {{Ptl}}模板已弃用。
此处记录本人学习HID期间总结出来的知识点,这些知识点可以作为快速对照的手册或解答学习期间疑惑的辅助文本。
此处文档均描述1.11版本的HID接口。开发HID接口所需的基础知识点如下:
HID接口的特点就是包罗万象,上到鼠标键盘游戏手柄、下到医疗设施键盘、盲文阅读器、FIDO联机身份验证器都可以直接使用这个接口进行人机互动。
HID设备用于功能实现的基础是“数据报表”,数据报表需要设备在配置期间声明“数据报表格式”,配置结束后,就需要按照所声明的格式,将对应数据通过“数据报表”与主机进行交换。
在USB主机{{Ptl}}模板已弃用。一个HID设备时,设备需要在传输配置描述符之后,单独根据USB请求传输“数据报表格式描述符”(亦称“报告描述符”)。 数据报表格式描述符的作用看起来很简单但实施起来困难,具体作用如下:
数据报表格式描述符的基本组成格式为“报表格式项目”,报表项目有“长项目”和“短项目”两种数据格式,但由于HID1.11从不使用“长项目”,所以只能学习“短项目”数据格式,且报表项目统一由“报头”和“报文”构成。
| 数据报送顺序先报→后报 | |||||||||||||||||||||||
| 报头 | 报文 | ||||||||||||||||||||||
| 报头编码 | 报头分类 | 数据长度 | 报文第1字节 | 报文第0字节 | |||||||||||||||||||
| {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | {{Ptl}}模板已弃用。 | 01H | 00H | ||||||||||||||
按照现实生活类比,“报头”表示特性类别,“报文”表示对应内容。
| ↓“报头” | ↓“报文” |
| 姓名 | 李皇谛 |
|---|---|
| 性别 | 男性 |
| 个性签名 | 男人有梦,不过如三:至亲、挚爱、致远。 |
| 个人持有账户主页 | 哔哩哔哩 https://space.bilibili.com/7187544 萌娘百科 https://zh.moegirl.org.cn/User:%E6%9D%8E%E7%9A%87%E8%B0%9B |
“报头”内存行里的内容,不仅会决定报头对应的属性类别,还会决定报文的数据长度。
| “内存行”名词注解 |
|---|
|
学习HID乃至USB之前,必须精通数电基础。 “内存”一般指DRAM缓存,“内存”所存放的数据“内存行”是其构建的基础单位。 “内存行”表示存放对应数据的一组逻辑位,如无特殊说明,一行内存为1字节,占用8个逻辑位。
|
| 报文类型 | 原始数据 | 解析结果 |
|---|---|---|
| 空报文 | 0xC0, | END_COLLECTION |
| 1字节报文 | 0x05, 0x01, | USAGE_PAGE(Generic Desktop) |
| 2字节报文 | 0x26, 0x7F, 0xFF, | LOGICAL_MAXIMUM(32767) |
| 4字节报文 | 0x0B, 0x20, 0x00, 0xD0, 0xF1, | USAGE(0xF1D0:FIDO_Alliance, 0x0020:Input_Report_Data) |
| 观前提示 |
| |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0字节 void |
| |||||||||||||||
| 1字节 BYTE |
| |||||||||||||||
| 2字节 WORD |
| |||||||||||||||
| 4字节 DWORD |
| |||||||||||||||
“报头”由3个字段构成,总大小为1字节。4个逻辑位的“报头声明”、2个逻辑位的“报头分类”和2个逻辑位的“数据长度”,且“数据长度”会影响“报文”的数据大小。
| 原始数据 | 报头分类(翻译)1 | 报文长度 | 注意事项 |
|---|---|---|---|
| 0x00 | MAIN/基础功能 | 0字节 |
|
| 0x01 | GLOBAL/广义声明 | 1字节 | |
| 0x02 | LOCAL/狭义声明 | 2字节 | |
| 0x03 | LONG/长项目修饰符2 | 3字节 |
| 原始数据 | 报头名称 | 使用方法 | |
|---|---|---|---|
| MAIN / 基础功能 控制HID解析器执行报表制成或分组 | |||
| 0x80 | INPUT 打包数据入表 |
报表打包:根据修饰属性和注册的用途清单,创建对应内存行/寄存器。
| |
| 0x90 | OUTPUT 打包数据出表 | ||
| 0xB0 | FEATURE 打包设备特性表 | ||
| 0xA0 | COLLECTION 集合起始域 |
集合或分组:创建报文分组,提高HID解析器和电脑软件的解析效率。
| |
| 0xC0 | END_COLLECTION 集合结束域 | ||
| |||
| GLOBAL / 广义声明 修饰一个数据报表的扩展属性 | |||
| 0x00 | USAGE_PAGE 定位用途类别 |
用途注册:向HID解析器添加可能会用到的用途。其中此报头用于定位用途所在的类别表格编号。
| |
| 0x10 | LOGICAL_MINIMUM 数字域最小值 |
数据极值:划定有效数据的最大值/最小值范围。
| |
| 0x20 | LOGICAL_MAXIMUM 数字域最大值 | ||
| 0x30 | PHYSICAL_MINIMUM 实体域最小值 | ||
| 0x40 | PHYSICAL_MAXIMUM 实体域最大值 | ||
| 0x50 | UNIT_EXPONENT 实体域10乘倍数 |
实体域单位声明:声明数据对应的单位与10乘倍数。
| |
| 0x60 | UNIT 实体域单位与导数 | ||
| 0x80 | REPORT_ID 数据报表编号 |
多重数据报表:声明对应报表所处的编号。
| |
| 0x70 | REPORT_SIZE 项目占用大小 |
数据格式:声明单次注册(数据打包)所需要的项目数量与单个项目的占用大小。
| |
| 0x90 | REPORT_COUNT 打包所需项目个数 | ||
| 0xA0 | PUSH 广义声明存档 |
广义声明缓存区:用于快速复制广义声明修饰的属性
| |
| 0xB0 | POP 广义声明读档 | ||
| |||
| LOCAL / 狭义声明 具有限定范围的属性修饰符 | |||
| |||