HID照明与采光报告描述符
2026-06-17
本文链接为:http://www.usbzh.com/article/detail-1723.html ,欢迎转载,转载请附上本文链接。
文档详见:https://www.usb.org/sites/default/files/hutrr84_-_lighting_and_illumination_page.pdf
介绍详见:https://test.dasenic.com/solutions/consumer_electronics/e-sports-lighting-control-solution
tinyusb相关实现:https://github.com/microsoft/RP2040MacropadHidSample

报告描述符内容:
0x05, 0x59, // USAGE_PAGE (LightingAndIllumination)
0x09, 0x01, // USAGE (LampArray)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x02, // USAGE (LampArrayAttributesReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x03, // USAGE (LampCount)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0x09, 0x04, // USAGE (BoundingBoxWidthInMicrometers)
0x09, 0x05, // USAGE (BoundingBoxHeightInMicrometers)
0x09, 0x06, // USAGE (BoundingBoxDepthInMicrometers)
0x09, 0x07, // USAGE (LampArrayKind)
0x09, 0x08, // USAGE (MinUpdateIntervalInMicroseconds)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0xff, 0x7f, // LOGICAL_MAXIMUM (2147483647)
0x75, 0x20, // REPORT_SIZE (32)
0x95, 0x05, // REPORT_COUNT (5)
0xb1, 0x03, // FEATURE (Cnst,Var,Abs)
0xc0, // END_COLLECTION
0x85, 0x02, // REPORT_ID (2)
0x09, 0x20, // USAGE (LampAttributesRequestReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x21, // USAGE (LampId)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0x85, 0x03, // REPORT_ID (3)
0x09, 0x22, // USAGE (LampAttributesReponseReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x21, // USAGE (LampId)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x23, // USAGE (PositionXInMicrometers)
0x09, 0x24, // USAGE (PositionYInMicrometers)
0x09, 0x25, // USAGE (PositionZInMicrometers)
0x09, 0x27, // USAGE (UpdateLatencyInMicroseconds)
0x09, 0x26, // USAGE (LampPurposes)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0xff, 0x7f, // LOGICAL_MAXIMUM (2147483647)
0x75, 0x20, // REPORT_SIZE (32)
0x95, 0x05, // REPORT_COUNT (5)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x28, // USAGE (RedLevelCount)
0x09, 0x29, // USAGE (GreenLevelCount)
0x09, 0x2a, // USAGE (BlueLevelCount)
0x09, 0x2b, // USAGE (IntensityLevelCount)
0x09, 0x2c, // USAGE (IsProgrammable)
0x09, 0x2d, // USAGE (InputBinding)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0x85, 0x04, // REPORT_ID (4)
0x09, 0x50, // USAGE (LampMultiUpdateReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x03, // USAGE (LampCount)
0x09, 0x55, // USAGE (LampUpdateFlags)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x08, // LOGICAL_MAXIMUM (8)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x21, // USAGE (LampId)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x08, // REPORT_COUNT (8)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x20, // REPORT_COUNT (32)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0x85, 0x05, // REPORT_ID (5)
0x09, 0x60, // USAGE (LampRangeUpdateReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x55, // USAGE (LampUpdateFlags)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x08, // LOGICAL_MAXIMUM (8)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x61, // USAGE (LampIdStart)
0x09, 0x62, // USAGE (LampIdEnd)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x02, // REPORT_COUNT (2)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0x51, // USAGE (RedUpdateChannel)
0x09, 0x52, // USAGE (GreenUpdateChannel)
0x09, 0x53, // USAGE (BlueUpdateChannel)
0x09, 0x54, // USAGE (IntensityUpdateChannel)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x04, // REPORT_COUNT (4)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0x85, 0x06, // REPORT_ID (6)
0x09, 0x70, // USAGE (LampArrayControlReport)
0xa1, 0x02, // COLLECTION (Logical)
0x09, 0x71, // USAGE (AutonomousMode)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
整体结构概览
| Report ID | 用途 | 方向 | 功能 |
|---|---|---|---|
| 1 | LampArrayAttributesReport | Feature (主机→设备查询) | 查询设备整体属性 |
| 2 | LampAttributesRequestReport | Feature (主机→设备请求) | 请求指定 Lamp 的属性 |
| 3 | LampAttributesResponseReport | Feature (设备→主机回复) | 回复单个 Lamp 的详细属性 |
| 4 | LampMultiUpdateReport | Feature (主机→设备) | 批量更新多个灯(最多8个) |
| 5 | LampRangeUpdateReport | Feature (主机→设备) | 更新一个连续范围的灯 |
| 6 | LampArrayControlReport | Feature (主机→设备) | 控制设备工作模式 |
所有报告都是 Feature 类型,意味着它们通过 HID get/set feature report 传输,不是 Input/Output 报告。
Report ID 1:设备整体属性查询(只读)
REPORT_ID 1
LampCount | 16-bit | 灯的总数
BoundingBoxWidth | 32-bit | X方向物理尺寸(微米)
BoundingBoxHeight | 32-bit | Y方向物理尺寸(微米)
BoundingBoxDepth | 32-bit | Z方向物理尺寸(微米)
LampArrayKind | 32-bit | 设备类型(键盘/鼠标/内存条等)
MinUpdateInterval | 32-bit | 最小更新间隔(微秒)
- 共 2 + 5×4 = 22 字节
- 逻辑值范围:LampCount 最大 65535;其他字段最大 2147483647(有符号32位最大值)
- 特征:
Cnst, Var, Abs= 常量(只读)、可变、绝对值
Report ID 2:单个灯属性请求
REPORT_ID 2
LampId | 16-bit | 要查询的灯编号
- 共 2 字节
- 主机发送此报告,设备收到后应回复 Report ID 3
Report ID 3:单个灯属性回复
REPORT_ID 3
LampId | 16-bit | 灯编号
PositionX | 32-bit | X坐标(微米)
PositionY | 32-bit | Y坐标(微米)
PositionZ | 32-bit | Z坐标(微米)
UpdateLatency | 32-bit | 更新延迟(微秒)
LampPurposes | 32-bit | 用途位图
RedLevelCount | 8-bit | 红色通道级数
GreenLevelCount | 8-bit | 绿色通道级数
BlueLevelCount | 8-bit | 蓝色通道级数
IntensityLevelCount | 8-bit | 亮度通道级数
IsProgrammable | 8-bit | 是否可编程(布尔)
InputBinding | 8-bit | 输入绑定
- 共 2 + 5×4 + 6×1 = 28 字节
- 前5个字段用32位;后6个字段用8位(最大255)
Report ID 4:批量更新(最多8个灯)
REPORT_ID 4
LampCount | 8-bit | 本次更新灯的数量(1-8)
LampUpdateFlags | 8-bit | 更新标志位
LampId[0..7] | 16-bit×8 | 8个灯的ID
Red[0..7] | 8-bit×8 | 8个灯的红色值
Green[0..7] | 8-bit×8 | 8个灯的绿色值
Blue[0..7] | 8-bit×8 | 8个灯的蓝色值
Intensity[0..7] | 8-bit×8 | 8个灯的亮度值
- 共 2 + 16 + 32 = 50 字节
- 这里有个问题:重复声明了 8 组
Red/Green/Blue/Intensity,每组4个Usage,总共32个8-bit字段 - 结构清晰,但
LampCount出现在了不应该出现的位置——它同时也在 Report ID 1 中作为设备属性,这里再出现会混淆
Report ID 5:范围更新
REPORT_ID 5
LampUpdateFlags | 8-bit | 更新标志位
LampIdStart | 16-bit | 起始灯编号(含)
LampIdEnd | 16-bit | 结束灯编号(含)
Red | 8-bit | 红色值(应用到范围内所有灯)
Green | 8-bit | 绿色值
Blue | 8-bit | 蓝色值
Intensity | 8-bit | 亮度值
- 共 1 + 2 + 2 + 4 = 9 字节
- 将同一个颜色和亮度应用到
[LampIdStart, LampIdEnd]范围内的所有灯
Report ID 6:设备控制
REPORT_ID 6
AutonomousMode | 8-bit | 0=主机控制模式,1=自主播放模式
- 共 1 字节
- 设为1时,设备自己播放内置灯效,无需主机持续发送更新数据
—-
报告大小汇总
| Report ID | 大小(字节) | 用途 |
|---|---|---|
| 1 | 22 | 查询设备属性 |
| 2 | 2 | 请求灯属性 |
| 3 | 28 | 回复灯属性 |
| 4 | 50 | 批量更新(最多8灯) |
| 5 | 9 | 范围更新 |
| 6 | 1 | 控制模式 |
合计:112 字节(含报告ID)
实际使用流程
1. 主机 → 设备: Report ID 1 (Get Feature) → 获取 LampCount,知道设备有几个灯
2. 主机 → 设备: Report ID 2 (Set Feature, LampId=0) → 请求查询 0 号灯
3. 设备 → 主机: Report ID 3 (Get Feature 回复) → 获得该灯的属性(位置、用途、色深等)
4. 重复步骤2-3,获取所有灯的属性
5. 主机 → 设备: Report ID 4 或 5 (Set Feature) → 实际设置灯光颜色
6. (可选) 主机 → 设备: Report ID 6 (Set Feature, AutonomousMode=1) → 让设备自主播放
总结:这是一个设计完整的 HID 灯光控制描述符,定义了从”设备发现”到”灯具属性查询”再到”颜色更新”的完整流程。主要问题是 LampCount 的误用和固定 8 灯批量更新的带宽开销,但整体可用。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
HID报表描述符大全及实例分析





