删除绑定到HID接口的输入驱动程序

时间:2015-05-29 01:18:56

标签: linux hid libusb

我正在玩一些特殊键盘的驱动程序代码。而且这个键盘确实有特殊模式。根据规范,这些模式只能通过发送和获取功能报告来启用。

我正在使用'hid.c'文件和用户模式发送HID报告。但是'hid_read'和'hid_get_feature_report'都失败了,错误编号为-1。

我已经尝试使用libusb从内核驱动程序中分离键盘,但是当我这样做时,'hid_open'失败了。我想这是因为HID接口已经被“输入”或内核使用了一些驱动程序。所以我可能不需要取消绑定内核hidraw驱动程序,而应该尝试取消绑定'hidraw'驱动程序的键盘('input')驱动程序顶部。我是对的吗?

任何想法我怎么能这样做?以及如何找到哪些驱动程序使用哪些驱动程序以及哪些低级驱动程序绑定到哪个驱动程序?

1 个答案:

答案 0 :(得分:1)

我自己找到了答案。 答案是挖掘这个项目并找到它在libusb上的隐藏实现。 或者您可以直接收到报告。

int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
{
    int res = -1;
    int skipped_report_id = 0;
    int report_number = data[0];

    if (report_number == 0x0) {
        /* Offset the return buffer by 1, so that the report ID
           will remain in byte 0. */
        data++;
        length--;
        skipped_report_id = 1;
    }
    res = libusb_control_transfer(dev->device_handle,
        LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
        0x01/*HID get_report*/,
        (3/*HID feature*/ << 8) | report_number,
        dev->interface,
        (unsigned char *)data, length,
        1000/*timeout millis*/);

    if (res < 0)
        return -1;

    if (skipped_report_id)
        res++;

    return res;
}

对不起,由于某些法律原因,我无法发布我的实际代码。但是上面的代码来自hidapi实现。

所以即使您使用旧内核,您仍然有机会让您的驱动程序正常工作。 这也回答了这个问题:https://stackoverflow.com/questions/30565999/kernel-version-2-6-32-does-not-support-hidiocgfeature