【问题标题】:IOHIDManager OsX : wrong match between HID descriptor and HID report?IOHIDManager OsX:HID 描述符和 HID 报告之间的匹配错误?
【发布时间】:2014-01-07 17:46:49
【问题描述】:

我正在尝试使用 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?

【问题讨论】:

    标签: linux macos usb hid usb-descriptor


    【解决方案1】:

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

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

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

    【讨论】:

    • 您在评论中的几件事是正确的。 1. 我的问题变得令人困惑,因为我意识到有两个不同的问题可以分开。我将删除第二个示例。
    • 2.IOHIDManagerRegisterInputValueCallback 适用于几乎 98% 的情况。这个 API 主要是为这种情况的 98% 设计的:只需要 hid_element 的新值(例如鼠标的 X)的人。但我正在研究鼠标和多点触控,在 HID 协议中,您可以使用仅声明 4 个(最多 6 个)手指的协议结构发送 10 个手指。所以你必须在后面添加一点智能,才能将好的 X 推荐给好手指。 IOHIDManagerRegisterInputValueCallback 丢失此信息。所以,我必须自己解析报告并正确解析描述符
    【解决方案2】:

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

    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 Key 不尊重描述符顺序:/

    【讨论】:

      【解决方案3】:

      很难确切地看出您要问的是什么,但您似乎很乐意使用原始输入报告描述符,但您却试图依赖 Linux 的描述符? (别忘了驱动可以重写描述符和报告)

      您可以在 OSX 上使用 IOHIDDeviceGetProperty(hid_device_ref, CFSTR(kIOHIDReportDescriptorKey)); 访问原始报告描述符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-10
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多