隐藏报告描述符:填充错误

时间:2017-11-28 16:15:30

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

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

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字段之前,而不是之后。

有谁理解为什么要切换这两个字段?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

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