IOHIDManager OsX:HID描述符和HID报告之间的错误匹配?

时间:2014-01-07 17:46:50

标签: linux macos usb hid usb-descriptor

我正在尝试使用IOHIDManager API从Mac OsX上的设备的HID报告中读取数据,例如鼠标的X,Y,button1,Button2(Magic Apple Mouse)

使用API​​,我可以动态地读取描述符但我有几个问题: - API没有从描述符中提供我需要的所有信息:例如,我没有找到有关填充位的信息! ...我必须自己计算填充以正确构建我的结构。 - API没有按照描述符或HID报告的相同顺序给我功能(X,Y,btn1 ......)! 我怎么想知道正确的顺序来阅读HID报告呢??

所以我没有与HID报告数据正确匹配。

这是OsX API从描述符给我的信息。

device 0x7f94f4804c70 is Apple Optical USB Mouse (vendor 5ac), max report size 6 
nb element descriptor : 11
        element (usage name) Generic Desktop item 0002 
        element (usage name) Generic Desktop item 0001 
        element (usage name) X 
        element (usage name) Y 
        element (usage name) Z 
        element (usage name) Wheel 
        element (usage name) Button 1 
        element (usage name) Button 2 
        element (usage name) Button 3 
        element (usage name) Button 4 
        element (usage name) Apple Reserved Mouse Data 

所以我构建了一个结构:X,Y,Z,Wheel,Btn1 | Btn2 | Btn3 | Btn4,ARMD

这里是从描述符给我的Linux上的RAW信息。

0x05, 0x01,                    // Usage Page (Generic Desktop)        0
0x09, 0x02,                    // Usage (Mouse)                       2
0xa1, 0x01,                    // Collection (Application)            4
0x05, 0x09,                    //   Usage Page (Button)               6
0x19, 0x01,                    //   Usage Minimum (1)                 8
0x29, 0x04,                    //   Usage Maximum (4)                 10
0x15, 0x00,                    //   Logical Minimum (0)               12
0x25, 0x01,                    //   Logical Maximum (1)               14
0x95, 0x04,                    //   Report Count (4)                  16
0x75, 0x01,                    //   Report Size (1)                   18
0x81, 0x02,                    //   Input (Data,Var,Abs)              20
0x95, 0x01,                    //   Report Count (1)                  22
0x75, 0x04,                    //   Report Size (4)                   24
0x81, 0x01,                    //   Input (Cnst,Arr,Abs)              26
0x05, 0x01,                    //   Usage Page (Generic Desktop)      28
0x09, 0x01,                    //   Usage (Pointer)                   30
0xa1, 0x00,                    //   Collection (Physical)             32
0x09, 0x30,                    //     Usage (X)                       34
0x09, 0x31,                    //     Usage (Y)                       36
0x09, 0x32,                    //     Usage (Z)                       38
0x09, 0x38,                    //     Usage (Wheel)                   40
0x15, 0x81,                    //     Logical Minimum (-127)          42
0x25, 0x7f,                    //     Logical Maximum (127)           44
0x75, 0x08,                    //     Report Size (8)                 46
0x95, 0x04,                    //     Report Count (4)                48
0x81, 0x06,                    //     Input (Data,Var,Rel)            50
0xc0,                          //   End Collection                    52
0x05, 0xff,                    //   Usage Page (Vendor Usage Page 0xff) 53
0x09, 0xc0,                    //   Usage (Vendor Usage 0xc0)         55
0x75, 0x08,                    //   Report Size (8)                   57
0x95, 0x01,                    //   Report Count (1)                  59
0x81, 0x02,                    //   Input (Data,Var,Abs)              61
0xc0,                          // End Collection                      63

所以我可以构建一个结构:Btn1 | Btn2 | Btn3 | Btn4 | 0 | 0 | 0 | 0,X,Y,Z,Wheel,ARMD

从那里开始,基于OsX API,我构建的结构几乎相同(包括填充位)以“匹配”HID报告。 所以我有:X,Y,Z,Wheel,Btn1 | Btn2 | Btn3 | Btn4 | 0 | 0 | 0 | 0,ARMD

我订阅了HID报告并解析它,因为它应该适合我的结构 ......但它没有

在这里,这是我在OsX上点击Btn1时所拥有的:

device : 0x7fe609007500, id: 0 ---  01  00  00  00  00  00  size - 48
X : 1  Y : 0  Z : 0  Wheel : 0  Button 1 : 0  Button 2 : 0  Button 3 : 0  Button 4 : 0  ARMData : 0

报告告诉我X = 1 !!!!

这里是我在Linux上的内容

2.384001  B1: 1 | B2: 0 | B3: 0 | B4: 0 | # | X:    0 | Y:    0 | Z:    0 | Wheel:    0 | 0xff00c0: -127

这个程序可以使用一些设备作为除了Magic Apple Mouse之外的鼠标,但是我和其他设备有类似的问题...... API给了我错误顺序和部分信息的功能!

有什么我不理解的东西吗? 有人有同样的问题或更好地理解如何在OSX上使用HID API吗?

3 个答案:

答案 0 :(得分:0)

我没有使用此API的经验,因此这个答案可能不合适。此外,我发现你的问题有点令人困惑。

听起来您正在使用IOHIDManager API,并且无法从USB设备中找出某些HID报告的确切位结构。

我怀疑确切的位结构正是那种应该通过像这样的高级API抽象出来的细节。为什么你需要知道确切的结构?您可以使用IOHIDManagerRegisterInputValueCallback从设备读取数据吗?

答案 1 :(得分:0)

我想我在这个问题上找到了答案。

API会返回您可以在设备上找到的元素列表。无论哪个报告ID,无论列表中的元素是什么顺序(那里有一个逻辑,但不是我期望的那个)

但是API在每个元素上添加一个名为“cookie”的键,这个键似乎遵循描述符中找到的元素的顺序。 我可以使用此cookie以正确的顺序构建我的结构并计算正确的偏移量以正确解析输入报告。

device 0x7ff1f42072a0 is Apple Optical USB Mouse (vendor 5ac), max report size 6 
nb element descriptor : 11
    cookie: 1 - element (usage name) Generic Desktop item 0002 
    cookie: 2 - element (usage name) Generic Desktop item 0001 
    cookie: 3 - element (usage name) Button 1 
    cookie: 4 - element (usage name) Button 2 
    cookie: 5 - element (usage name) Button 3 
    cookie: 6 - element (usage name) Button 4 
    cookie: 7 - element (usage name) X 
    cookie: 8 - element (usage name) Y 
    cookie: 9 - element (usage name) Z 
    cookie: 10 - element (usage name) Wheel 
    cookie: 11 - element (usage name) Apple Reserved Mouse Data 

编辑: 经过更多测试后,此解决方案不适用于所有设备。例如,在触摸屏的情况下,Cookie密钥不尊重描述符顺序:/

答案 2 :(得分:0)

很难确切地知道你在问什么,但似乎你很高兴使用原始输入报告描述符,但你却试图依赖Linux的描述符? (不要忘记驱动程序可以重写描述符和报告)

您可以使用IOHIDDeviceGetProperty(hid_device_ref, CFSTR(kIOHIDReportDescriptorKey));

访问OSX上的原始报告描述符