3.1. HID

3.1.1. hid概述

  • 引用度娘:HID(Human Interface Device)是指人机接口设备,是一种输入输出设备,例如:鼠标、键盘、游戏手柄、摇杆、触摸板、扫描仪、数字化板等等。HID设备可以通过USB、蓝牙等接口连接到计算机或其他设备上,并且可以通过操作系统提供的驱动程序进行控制和使用。

3.1.2. hid协议概述

  • HID(Human Interface Device)协议是一种用于描述计算机与人机交互设备之间通信协议的标准。它定义了计算机与键盘、鼠标、游戏手柄等设备之间的通信规则,使得这些设备可以被计算机正确地识别和使用。

  • HID协议的实现基于USB(Universal Serial Bus)接口,因此HID设备通常都是通过USB接口与计算机相连的。在HID协议中,设备会向计算机发送一系列的报告,描述设备的状态和用户的操作。计算机则可以根据这些报告来识别设备,并对用户的操作做出相应的响应。

  • HID协议支持的设备种类非常广泛,包括但不限于键盘、鼠标、游戏手柄、摄像头、扫描仪等等。这些设备都可以通过HID协议与计算机进行通信,从而实现与用户的交互。

3.1.3. hid协议的描述符

  • HID协议具体表现即一串描述符,用来解析双方设备交互的数据;有了这个描述符才能进行通信。

  • 下列是一个简易的hid的描述符(开发者可使用 USB描述符解析 去解析):

    static const u8 hidkey_report_map[] = {
        0x05, 0x0C,        // Usage Page (Consumer)    --------头码
        0x09, 0x01,        // Usage (Consumer Control) --------控制型hid
        0xA1, 0x01,        // Collection (Application) --------为Application使用的集合,下列End Collection为集合结束
        0x85, 0x01,        //   Report ID (1)          --------Reprot ID,usb唯一识别的ID号,用于标记下列协议属于ID 1
        0x09, 0xE9,        //   Usage (Volume Increment)-------音量加
        0x09, 0xEA,        //   Usage (Volume Decrement)-------音量减
        0x09, 0xCD,        //   Usage (Play/Pause)     --------播放/暂停
        0x09, 0xE2,        //   Usage (Mute)           --------mute按键
        0x09, 0xB6,        //   Usage (Scan Previous Track)----上一曲
        0x09, 0xB5,        //   Usage (Scan Next Track) -------下一曲
        0x09, 0xB3,        //   Usage (Fast Forward)   --------快进
        0x09, 0xB4,        //   Usage (Rewind)         --------倒退
        0x15, 0x00,        //   Logical Minimum (0)    --------上面的Usage类型取值最小值
        0x25, 0x01,        //   Logical Maximum (1)    --------上面的usage类型取值最大值
        0x75, 0x01,        //   Report Size (1)        --------每个usage占用的size
        0x95, 0x10,        //   Report Count (16)      --------有多少个usage
        0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0xC0,              // End Collection
        // 35 bytes
    };
    
  • Reprot ID,在一个描述符中是不能重复的。

  • Usage (Volume Increment)这种是标准的hid协议,即它就是音量加的功能

  • 比如发送一个 {0x00, 0x01}的数据给usb,具体表现出来就是 音量加的功能。为什么?首先发送数据之前得知道需要发多少Bytes(发送多少Bytes = (Report Size  * Report Count)/ 8);其次每一个Usage的值只能取0(Logical Minimum)或者1(Logical Maximum);那就可以知道如果要发送音量加就需要设置为{0x00, 0x01}。

  • 如果需要添加或者修改report map,需要开发者熟悉hid描述符再去修改。