linux hid 键盘鼠标,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.c的hid_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设备了。

10cef432b278

Selection_278.png

Nexus 5的识别信息是:

10cef432b278

Selection_274.png

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

10cef432b278

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值