HID协议

文章目录

    • [🧩 一、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设备的典型枚举流程:

  1. 设备插入 → 主机通过控制传输读取描述符。
  2. 主机读取 HID 描述符和 Report 描述符
  3. 主机理解数据结构(例如:鼠标的 X、Y、按键)。
  4. 建立中断传输通道(Interrupt Transfer)进行周期性通信。
  5. 持续传输数据:如鼠标报告当前位置、键盘报告按键值。

🖱️ 四、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 接口读取数据(如 libhidhidrawhidapi

📚 八、HID 与其他协议对比

特性 HID CDC(串口) MSC(大容量存储)
驱动支持 操作系统原生支持 一般需安装驱动 操作系统原生支持
通信模式 中断传输 流式传输 块传输
实时性
应用场景 键盘、鼠标等 串口调试工具等 U盘、存储设备

✅ 总结

HID 协议是一种成熟、灵活、无需额外驱动的人机接口协议,支持丰富设备类型。其核心在于 描述符 + 报告结构,设备和主机基于这个定义进行双向通信。

如果你是嵌入式开发者,想实现一个自定义 HID 外设(如触摸笔、遥控器),只需要掌握:

  • HID Report Descriptor 的编写方法
  • 正确组织数据并通过中断发送
  • 主机端可以用 hidapi、WinUSB、Linux hidraw 等读取

相关推荐
Uncertainty!!17 小时前
OpenEuler操作系统中检测插入的USB设备并自动挂载
linux·usb·openeuler·mount·u盘·自动挂载
叶余23 天前
USB Gadget设备软插拔异常的处理方法
usb·gadget
叶余24 天前
USB Gadget设备枚举失败的处理方法
usb·hid·gadget
叶余1 个月前
USBIP技术简介
usb·usbip
叶余1 个月前
USB工程应用基础概念简介
usb
gis分享者1 个月前
学习threejs,使用TSL计算粒子鼠标特效
threejs·鼠标·粒子·tsl·raycaster
zgyrelax_zgykill1 个月前
USB子系统和type-c接口快速理解
usb·typec
byte轻骑兵2 个月前
【Bluedroid】蓝牙Hid Host get_protocol全流程源码解析
c++·hid·bluedroid
byte轻骑兵2 个月前
【Bluedroid】蓝牙HID Device virtual_cable_unplug全流程源码解析
c++·hid·bluedroid