键盘的hid描述符例子

譬如有如下的Report Descriptor:


譬如有如下的Report Descriptor:

C/C++ code


?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

const u8 g_KeyboardReportDescriptor[] = 

{

    // Keyboard

    0x05, 0x01, /* Usage Page(Generic Desktop) */

    0x09, 0x06, /* Usage(Keyboard) */

    0xA1, 0x01, /* Collection(Application) */

        0x05, 0x07, /* Usage Page(Key Codes) */

        0x19, 0xE0, /* Usage Minimum(224) */

        0x29, 0xE7, /* Usage Maximum(231) */

        0x15, 0x00, /* Logical Minimum(0) */

        0x25, 0x01, /* Logical Maximum(1) */

        0x75, 0x01, /* Report Size(1) */

        0x95, 0x08, /* Report Count(8) */

        0x81, 0x02, /* Input(Data, Variable, Absolute), Modifier byte */       

        0x95, 0x01, /* Report Count(1) */

        0x75, 0x08, /* Report Size(8) */

        0x81, 0x01, /* Input(Constant), Reserved byte */

        0x95, 0x05, /* Report Count(5) */

        0x75, 0x01, /* Report Size(1) */

        0x05, 0x08, /* Usage Page(LED) */

        0x19, 0x01, /* Usage Minimum(1) */

        0x29, 0x05, /* Usage Minimum(5) */

        0x91, 0x02, /* Output(Data, Variable, Absolute), LED report */

        0x95, 0x01, /* Report Count(1) */

        0x75, 0x03, /* Report Size(3) */

        0x91, 0x01, /* Output(Constant), LED report padding */

        0x95, 0x06, /* Report Count(6) */

        0x75, 0x08, /* Report Size(8) */

           0x15, 0x00, /* Logical Minimum(0) */

        0x25, 0x65, /* Logical Maximum(101) */

        0x05, 0x07, /* Usage Page(Key Codes) */

        0x19, 0x00, /* Usage Minimum(0) */

        0x29, 0x65, /* Usage Minimum(101) */

        0x81, 0x00,    /* Input(Data, Array), Key arrays(6 bytes) */

    0xC0        /* End Collection */

};



就应该发送8个字节(发送到host的时候大于8字节,不过这些细节由usb硬件处理,我们只关心按键的内容就可以了)到host:

C/C++ code


?

1

2

3

4

5

6

7

8

9

u8 sendbuf[8];

// 如果有按键w按下,在sendbuf[2...7]中任一填入按键w的usage值

// sendbuf[0]用于shift,ctrl等这些modifier键的状态,更多细节可参考HID Usage Tables

// sendbuf[1]保留

// 更多按键的usage可参考 HID Usage Tables 的 第53页

memset(sendbuf, 0, sizeof(sendbuf));

//sendbuf[0] = 0x...; // 根据shift,ctrl等键的状态设置相应bit,bit位含义参考HID Usage Tables

sendbuf[2] = 0x1A; // 写入w 键 usage id 0x1A

// 更多其他按键


from:http://bbs.youkuaiyun.com/topics/390706443






<think>好的,我现在需要帮助用户查找关于32字节HID报告描述符的详细信息或示例。首先,用户的问题涉及HID报告描述符,这属于USB HID设备配置的一部分。我需要回忆HID规范中的相关知识,特别是报告描述符的结构和常见用法。 HID报告描述符用于定义设备与主机之间的数据格式。它使用项(item)的集合来描述数据包的结构,包括用途、逻辑范围、单位等信息。每个项由一个前缀字节(指定项类型和标签)和后续数据字节组成。常见的项类型有Main、Global和Local。 用户提到需要一个32字节的示例,这可能与特定设备有关,比如鼠标、键盘或其他HID设备。我需要考虑如何构造一个符合32字节限制的描述符。例如,一个简单的鼠标可能需要定义按钮和位移,而键盘需要定义按键码和修饰符。 接下来,我需要参考提供的引用内容。引用[2]提到一个实现三个HID接口的例子,每个接口有中断端点,用于回环数据。这可能涉及到报告描述符的结构,但具体细节没有展开。引用[3]中的自定义UART服务可能与HID无关,但其中提到的描述符结构可能有一定的参考价值,比如UUID的使用和数据长度。 为了构造一个示例,我可以设想一个简单的设备,比如带有按钮和轴的操纵杆。需要确保每个Main项(如Collection和End Collection)正确嵌套,Global项设置正确的用法页和逻辑范围,Local项定义具体的使用情况。同时,需要计算总字节数是否接近32字节的限制。 还需要注意报告描述符的语法,比如Usage Page、Usage、Logical Minimum/Maximum、Report Size和Report Count等。例如,鼠标通常使用Usage Page 0x09(按钮)和0x01(普通桌面),然后定义X/Y轴的位移。每个按钮可能占用1位,而轴可能占用8位(范围-127到127)。 最后,需要验证示例是否符合USB规范,是否能够通过工具如USB CV测试。同时,可能需要参考HID使用表,确保Usage值的正确性。此外,用户可能需要了解如何将描述符与实际的数据传输结合,比如输入报告和输出报告的结构。</think>以下是一个32字节的HID报告描述符示例及其详细解释,该描述符实现了包含8个数字输入(如按钮)和2个模拟轴(如游戏手柄摇杆)的典型控制设备配置: ```c 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x05, // Usage (Game Pad) 0xA1, 0x01, // Collection (Application) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (Button 1) 0x29, 0x08, // Usage Maximum (Button 8) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x08, // Report Count (8) 0x81, 0x02, // Input (Data,Var,Abs) 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x15, 0x81, // Logical Minimum (-127) 0x25, 0x7F, // Logical Maximum (127) 0x75, 0x08, // Report Size (8) 0x95, 0x02, // Report Count (2) 0x81, 0x06, // Input (Data,Var,Rel) 0xC0 // End Collection ``` ### 关键组成部分解析 1. **设备类型定义** - `0x05, 0x01`: 指定主用途页为通用桌面设备[^2] - `0x09, 0x05`: 具体定义为游戏手柄类型 2. **按钮配置** - `0x05, 0x09`: 切换到按钮用途页 - `0x19, 0x01` 到 `0x29, 0x08`: 定义8个按钮(1-8) - `0x75, 0x01`: 每个按钮占1bit - `0x95, 0x08`: 共8个数据位,占用1字节 3. **模拟轴配置** - `0x09, 0x30` 和 `0x09, 0x31`: 定义X/Y轴 - `0x15, 0x81` 和 `0x25, 0x7F`: 取值范围-127到+127 - `0x75, 0x08`: 每个轴占8bit - `0x95, 0x02`: 共2个轴,占用2字节 总报告描述符长度:24字节(剩余8字节可通过添加功能扩展)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值