文章目录
-
- [🧩 一、HID协议的基本概念](#🧩 一、HID协议的基本概念)
-
- [1. **什么是 HID?**](#1. 什么是 HID?)
- [🧱 二、HID 协议结构与组成](#🧱 二、HID 协议结构与组成)
-
- [1. **描述符(Descriptor)系统**](#1. 描述符(Descriptor)系统)
- [2. **报告(Report)类型**](#2. 报告(Report)类型)
- [📡 三、通信过程(以 USB 为例)](#📡 三、通信过程(以 USB 为例))
-
- [USB HID设备的典型枚举流程:](#USB HID设备的典型枚举流程:)
- [🖱️ 四、HID 示例:USB 鼠标](#🖱️ 四、HID 示例:USB 鼠标)
- [🔄 五、HID 报文的传输方式](#🔄 五、HID 报文的传输方式)
-
- [USB中断传输(Interrupt Transfer):](#USB中断传输(Interrupt Transfer):)
- [🔒 六、HID 的优点](#🔒 六、HID 的优点)
- [🔧 七、HID 自定义设备](#🔧 七、HID 自定义设备)
- [📚 八、HID 与其他协议对比](#📚 八、HID 与其他协议对比)
- [✅ 总结](#✅ 总结)
HID(Human Interface Device,人机接口设备)协议是一种用于描述人类与计算机之间交互设备(如鼠标、键盘、游戏手柄、触摸板等)通信的协议标准。它最初由 USB-IF(USB Implementers Forum)定义,用于 USB 接口,但后来也被应用于 Bluetooth、I2C、SPI 等其他总线中。
🧩 一、HID协议的基本概念
1. 什么是 HID?
- 是一种设备类协议(而不是某一具体的设备或硬件接口),归属于 USB 协议族中的一种。
- 目的是使主机能够识别不同种类的人机交互设备,并以统一方式与之通信。
🧱 二、HID 协议结构与组成
HID 设备使用 Report(报文) 作为数据交换的最小单位,通过**描述符(Descriptor)**告诉主机如何解释这些数据。
1. 描述符(Descriptor)系统
HID 协议通过多个层级的描述符,来告诉主机:
- 我是谁(设备信息)
- 我有什么功能(报告结构)
- 数据是如何组织的
主要描述符:
描述符类型 | 作用 |
---|---|
Device Descriptor | USB设备的基本信息(VID、PID、版本号) |
Configuration Descriptor | USB设备的配置信息 |
Interface Descriptor | 描述该设备的一个接口 |
HID Descriptor | 说明该接口是 HID 类型,并指定报告描述符的位置 |
Report Descriptor(重点) | 描述数据的格式与含义,例如鼠标坐标、按钮状态 |
✅ Report Descriptor 是 HID 的核心,它定义了设备发送的数据的结构,而不是数据本身。
2. 报告(Report)类型
HID 数据以 Report(报告) 的形式传输,分为三类:
类型 | 用途 |
---|---|
Input Report | 设备 → 主机,如鼠标移动、键盘按键 |
Output Report | 主机 → 设备,如键盘灯状态 |
Feature Report | 配置类信息,主机和设备都可发起 |
📡 三、通信过程(以 USB 为例)
USB HID设备的典型枚举流程:
- 设备插入 → 主机通过控制传输读取描述符。
- 主机读取 HID 描述符和 Report 描述符。
- 主机理解数据结构(例如:鼠标的 X、Y、按键)。
- 建立中断传输通道(Interrupt Transfer)进行周期性通信。
- 持续传输数据:如鼠标报告当前位置、键盘报告按键值。
🖱️ 四、HID 示例:USB 鼠标
Report Descriptor 示例(简化):
c
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection (Physical)
0x05, 0x09, // Usage Page (Buttons)
0x19, 0x01, // Usage Minimum (Button 1)
0x29, 0x03, // Usage Maximum (Button 3)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x95, 0x03, // Report Count (3)
0x75, 0x01, // Report Size (1)
0x81, 0x02, // Input (Data, Variable, Absolute)
...
-
表示:设备是鼠标,有3个按钮,有X、Y方向的坐标数据。
-
报文示例:
[0x00, 0x03, 0xFA]
- 第一个字节代表按键状态(如 Bit0=左键)
- 后两个字节是 X、Y 坐标的偏移
🔄 五、HID 报文的传输方式
USB中断传输(Interrupt Transfer):
- HID 设备不会占用总线,只在数据变化时发送。
- 鼠标、键盘等周期性发送数据(每 10ms 一次)
- 数据传输不大,但传输延迟低,实时性强。
🔒 六、HID 的优点
- 📦 无需驱动:多数系统内置了 HID 驱动,免去了驱动开发。
- 🎮 适用广泛:支持鼠标、键盘、游戏手柄等。
- 🔧 高度可配置:通过报告描述符,自定义复杂数据结构。
- 🌐 跨平台支持好:Windows、Linux、MacOS、安卓等都支持。
🔧 七、HID 自定义设备
你也可以开发一个自定义的 HID 设备(如测量仪表、遥控器),只需:
- 编写符合 HID 报告描述符的描述结构
- 将采集到的数据填入报告中发送给主机
- 主机端使用通用 HID 接口读取数据(如
libhid
、hidraw
、hidapi
)
📚 八、HID 与其他协议对比
特性 | HID | CDC(串口) | MSC(大容量存储) |
---|---|---|---|
驱动支持 | 操作系统原生支持 | 一般需安装驱动 | 操作系统原生支持 |
通信模式 | 中断传输 | 流式传输 | 块传输 |
实时性 | 高 | 中 | 低 |
应用场景 | 键盘、鼠标等 | 串口调试工具等 | U盘、存储设备 |
✅ 总结
HID 协议是一种成熟、灵活、无需额外驱动的人机接口协议,支持丰富设备类型。其核心在于 描述符 + 报告结构,设备和主机基于这个定义进行双向通信。
如果你是嵌入式开发者,想实现一个自定义 HID 外设(如触摸笔、遥控器),只需要掌握:
- HID Report Descriptor 的编写方法
- 正确组织数据并通过中断发送
- 主机端可以用
hidapi
、WinUSB、Linuxhidraw
等读取