【问题标题】:hid report descriptor: wrong padding隐藏报告描述符:错误的填充
【发布时间】:2017-11-28 16:15:29
【问题描述】:

我有一个具有以下隐藏报告描述符的设备:

Collection (Logical) A1 02 

Usage Page (Physical Input Device) 05

Usage (DC Enable Actuators) 09 97  
Logical Minimum (0) 15 00  
Logical Maximum (1) 25 01  
Report Size (4) 75 04  
Report Count (1) 95 01  
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

Logical Minimum (0) 15 00  
Logical Maximum (0) 25 00  
Output (Cnst,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 03  

Usage (Magnitude) 09 70  
Logical Minimum (0) 15 00  
Logical Maximum (100) 25 64  
Report Size (8) 75 08  
Report Count (4) 95 04  
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02  

...

End Collection C0

因此,我认为设备需要以下方式的数据:

8 位:报告 ID,4 位:DC 启用执行器,4 位:填充,32 位:幅度

因此,我在 linux 中的驱动程序代码如下所示:

...
static const u8 buf[] =  {0x03, 0b00010000, 0x00, 0x00, 0x60, 0x60, 10, 0x00, 10};
hid_hw_output_report(hid, buf, 9);
...

不幸的是,这不是设备所期望的! 事实上,它只有在数据结构如下时才会做出反应:

8 位:报告 ID,4 位:填充,4 位:DC 启用执行器,32 位:幅度

这是:

...
static const u8 buf[] =  {0x03, 0b00000001, 0x00, 0x00, 0x60, 0x60, 10, 0x00, 10};
hid_hw_output_report(hid, buf, 9);
...

这意味着填充出现在 DC Enable Actuators 字段之前,而不是之后。

有谁明白这两个字段为什么会切换?

提前谢谢你!

【问题讨论】:

    标签: c linux-kernel usb linux-device-driver hid


    【解决方案1】:

    我认为您对二进制文字的工作方式感到困惑。在您的第一个示例中,0b00010000 表示 0x10,或十进制的 16。在您的第二个示例中,0b00000001 表示 0x01,或十进制的 1。这些位的重要性从 rightleft 增加,就像十六进制或十进制的数字一样。因此,0b00010000 表示四位填充 (0b0000),后跟 DC 启用执行器字段 (0b0001),这不是此 HID 报告的正确格式。您的第二个示例显示了正确的顺序 (0b00000001),其中 DC 启用执行器字段(右侧的最低 4 位)后跟 4 位填充(左侧的最高 4 位)。

    【讨论】:

    • 非常感谢!让我感到困惑的是,例如0x0F 不作为从左到右的“比特流”处理^^
    • 这可能只是一个错字,但是“使用页面(物理输入设备)05”应该是“使用页面(物理输入设备)05 0F”。 Const 报告也忽略 LOGICAL_MINIMUM 和 LOGICAL_MAXIMUM,除非其值发生变化,否则无需重新指定 LOGICAL_MINIMUM(或任何全局值)——以防万一其他人看到这个问题:)
    • 谢谢你,aja!此报告由 Windows 上的 USBlyzer 捕获;)
    • 以下内容:查看 HID 文档 v.1.11 中的“5.8 多字节数值格式”一章
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2021-10-10
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多