Android支持蓝牙HID设备(鼠标键盘)

一个蓝牙键盘在Nexus 5(Android 6.0)上识别正常,在华为P8(Android 6.0)上识别正常。在一个开发板NanoPC-T2(Android 5.0_Linux3.4.39)上识别异常,使用getevent查看不到input设备节点。因为之前了解过,对于蓝牙的HID,Android设备上的处理是Bluetooth.apk连接蓝牙后,检测到是HID的Service会经uhid传递给内核,内核再生成input设备节点(进入内核后就和USB HID设备处理流程无异了)。所以对于设备无法识别应该从uhid入手,看问题出在了上层还是内核层,通过在uhid里打Log,连接该蓝牙键盘时,能正常识别到设备,调用hid_add_device添加HID设备是成功了,但是并没有匹配到HID驱动

对于了USB鼠标和该蓝牙设备处理的区别,区别在于hid_match_one_id这个函数中,前者能匹配成功,后者并不能匹配成功。借位在drivers/hid/usbhid/hid-core.chid_usb_table中添加了对蓝牙BUS的支持,{ HID_BLUETOOTH_DEVICE(HID_ANY_ID, HID_ANY_ID) },

static const struct hid_device_id hid_usb_table[] = {
    { HID_USB_DEVICE(HID_ANY_ID, HID_ANY_ID) },
+   { HID_BLUETOOTH_DEVICE(HID_ANY_ID, HID_ANY_ID) },
    { }
};

重新编译内核烧写后,该设备可以正常使用蓝牙HID设备了。

Selection_278.png

Nexus 5的识别信息是:

Selection_274.png

NanoPC-T2的修改内核后识别信息是:
Selection_279.png

唯一的差别是前者设备名是generic-bluetooth而后者是借位的generic-usb,这不是大问题了,使用起来正常了。想必Nexus 5的内核源码里新建了drivers/hid/bluetoothhid/hid-core.c,驱动名称为generic-bluetooth

引申思考:
蓝牙HID也有VID PID ?应该是有的,不然如何区分不同的蓝牙HID设备,在hid-multitouch.c中有这个:

    /* Gametel game controller */
    { .driver_data = MT_CLS_DEFAULT,
        HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL,
            USB_DEVICE_ID_GAMETEL_MT_MODE) },

应该在从机里添加VID和PID,并分别添加到驱动中,这样会比较好。而不是使用HID_ANY_ID。

你可能感兴趣的:(Android支持蓝牙HID设备(鼠标键盘))