HID 相关概念

报表描述符由描述 HID 设备的数据项目(Item)组成,Item 的第一个字节(项目前缀)由三部分构成,即项目类型(item type)、项目标签(item tag)和项目长度(item size)。

HID 的项目有短项目和长项目两种,其中短项目的格式如下图:

  • bSize 定义 short Item 的数据字节数,为 0、1、2、3 时 Data 部分的字节数分别为 0、1、2、4 个字节
  • bType 是 short Item 的类型,为 0、1、2 时分别为 Main、Global 和 Local 类型
  • bTag 是 Item 标志,有 Input、Output、Collection、Usage Page、Usage 等

长项目可以携带较多的数据,其格式如下图(用的少):

  • item 中的第一个字节为上图中的特定值时表明该项目是一个长项目
  • bDataSize 说明 Data 部分的字节数
  • bLongItemTag 在 HID 规范中没有定义

下面以 0x05, 0x0c 为例来说明一下:

0x05(0b00000101)其中 bit2-3 代表 short item 的 type,1 代表的是 global 项目,最后两位代表数据长度是 1Byte,通过查表可以知道这是一个** USAGE_PAGE** item,而后面的 0x0c 也是可以通过查表了解到是 Consumer

其他配置依次类推就可以了。

配置 configfs

1
2
3
4
5
6
7
8
# HID
echo "hid" > strings/0x409/configuration
mkdir functions/hid.0
echo 1 > functions/hid.0/protocol
echo 1 > functions/hid.0/subclass
echo 8 > functions/hid.0/report_length
echo -ne "\x05\x0c\x09\x01\xa1\x01\x09\xe9\x09\xea\x09\xe2\x09\xcd\x15\x00\x25\x01\x95\x04\x75\x01\x81\x02\x75\x04\x95\x01\x81\x03\xc0" > functions/hid.0/report_desc
ln -s functions/hid.0 configs/amlogic.1/hid.0

报告描述符结构

关于报告描述符做如下解析:

  • 0x05, 0x0c // USAGE_PAGE (Consumer Page)
  • 0x09, 0x01 // USAGE (Consumer Control)
  • 0xa1, 0x01 //COLLECTION (Application)
  • 0x09, 0xe9 //USAGE (Volume Increment)
  • 0x09, 0xea //USAGE (Volume Decrement)
  • 0x09, 0xe2 //USAGE (Mute)
  • 0x09, 0xcd //USAGE (Play/Pause)
  • 0x15, 0x00 //LOGICAL_MINIMUM (0)
  • 0x25, 0x01 //LOGICAL_MAXIMUM (1)
  • 0x95, 0x04 //REPORT_COUNT (4)
  • 0x75, 0x01 //REPORT_SIZE (1)
  • 0x81, 0x02 //INPUT (Data,Var,Abs)
  • 0x75, 0x04 //REPORT_SIZE (4)
  • 0x95, 0x01 //REPORT_COUNT (1)
  • 0x81, 0x03 //INPUT (Cnst,Var,Abs)
  • 0xc0 //END_COLLECTION

Consumer Page (0x0C)

Volume Decrement、Volume Increment、Mute、Play

验证

在设备端执行 uac_hid command 可以看到 windows 的音量有发生变化就说明 uac hid 功能正常

HID 报表描述符/报告描述符 - USB 中文网

参考文献

《USB2.0 协议规范》
《UAC2 协议规范》