手把手教你解读HID设备描述符:从十六进制到实际功能的完整指南

手把手教你解读HID设备描述符:从十六进制到实际功能的完整指南

当你第一次看到HID设备描述符时,可能会被那一串十六进制数字搞得一头雾水。这就像是在看天书——0x05、0x01、0x09这些数字组合到底代表什么?别担心,今天我们就来彻底解密这个看似神秘的语言,让你不仅能读懂它,还能自己动手编写和修改。

HID(Human Interface Device)协议是USB和蓝牙设备中广泛使用的一种标准,从键盘鼠标到游戏手柄,甚至一些专业医疗设备都在使用它。理解HID描述符对于嵌入式开发者来说至关重要,特别是当你需要定制特殊输入设备或调试现有设备时。我们将从最基础的字节解析开始,逐步深入到实际应用案例,最后还会分享一些调试技巧和常见问题解决方案。

1. HID描述符基础:理解字节背后的语言

HID描述符本质上是一种紧凑的二进制语言,用于定义设备的功能和数据结构。每个描述符都由一系列条目(item)组成,而每个条目又由一个前缀字节和可选的数据字节构成。

1.1 条目结构解析

让我们先来看一个最简单的条目示例:{0x05, 0x01}。这个两字节组合实际上包含了两部分信息:

  • 第一个字节0x05是前缀,它又可以分为三个部分:

    • bType(位4-5):条目类型
    • bTag(位6-7):功能标识
    • bSize(位0-3):数据字节数
  • 第二个字节0x01是实际数据

用二进制表示,0x0500000101,我们可以这样分解:

7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 1
│ │ │ └─ bSize (01 = 1字节数据)
│ └─ bType (01 = 全局条目)
└─ bTag (00 = Usage Page)

1.2 条目类型详解

HID协议定义了三种基本条目类型:

类型值 类型名称 作用描述
0 主条目 定义数据结构(输入/输出/集合等)
1 全局条目 定义数据属性和范围(大小/数量/极值等)
2 局部条目 定义具体用途和标识符

每种类型下又有多个功能标签(bTag),下面是一些常见标签的速查表:

主条目标签示例:

#define TAG_MAIN_INPUT        0x80
#define TAG_MAIN_OUTPUT       0x90
#define TAG_MAIN_FEATURE      0xB0
#define TAG_MAIN_COLLECTION   0xA0
#define TAG_MAIN_COL_END      0xC0

全局条目标签示例:

#define TAG_GLOBAL_USAGE_PAGE 0x00
#define TAG_GLOBAL_LOG_MIN    0x10
#define TAG_GLOBAL_LOG_MAX    0x20
#define TAG_GLOBAL_RPT_SIZE   0x70
#define TAG_G
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值