一個(gè)藍(lán)牙鍵盤在Nexus 5(Android 6.0)上識(shí)別正常百匆,在華為P8(Android 6.0)上識(shí)別正常砌些。在一個(gè)開發(fā)板NanoPC-T2(Android 5.0_Linux3.4.39)上識(shí)別異常,使用getevent
查看不到input設(shè)備節(jié)點(diǎn)。因?yàn)橹傲私膺^存璃,對(duì)于藍(lán)牙的HID仑荐,Android設(shè)備上的處理是Bluetooth.apk
連接藍(lán)牙后,檢測(cè)到是HID的Service會(huì)經(jīng)uhid傳遞給內(nèi)核纵东,內(nèi)核再生成input設(shè)備節(jié)點(diǎn)(進(jìn)入內(nèi)核后就和USB HID設(shè)備處理流程無異了)粘招。所以對(duì)于設(shè)備無法識(shí)別應(yīng)該從uhid入手,看問題出在了上層還是內(nèi)核層偎球,通過在uhid里打Log洒扎,連接該藍(lán)牙鍵盤時(shí),能正常識(shí)別到設(shè)備衰絮,調(diào)用hid_add_device
添加HID設(shè)備
是成功了袍冷,但是并沒有匹配到HID驅(qū)動(dòng)
。
對(duì)于了USB鼠標(biāo)和該藍(lán)牙設(shè)備處理的區(qū)別岂傲,區(qū)別在于hid_match_one_id
這個(gè)函數(shù)中难裆,前者能匹配成功子檀,后者并不能匹配成功镊掖。借位在drivers/hid/usbhid/hid-core.c
的hid_usb_table
中添加了對(duì)藍(lán)牙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) },
{ }
};
重新編譯內(nèi)核燒寫后亩进,該設(shè)備可以正常使用藍(lán)牙HID設(shè)備了。
Nexus 5的識(shí)別信息是:
NanoPC-T2的修改內(nèi)核后識(shí)別信息是:
唯一的差別是前者設(shè)備名是
generic-bluetooth
而后者是借位的generic-usb
缩歪,這不是大問題了归薛,使用起來正常了。想必Nexus 5的內(nèi)核源碼里新建了drivers/hid/bluetoothhid/hid-core.c
匪蝙,驅(qū)動(dòng)名稱為generic-bluetooth
主籍。
引申思考:
藍(lán)牙HID也有VID PID ?應(yīng)該是有的,不然如何區(qū)分不同的藍(lán)牙HID設(shè)備逛球,在hid-multitouch.c
中有這個(gè):
/* Gametel game controller */
{ .driver_data = MT_CLS_DEFAULT,
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL,
USB_DEVICE_ID_GAMETEL_MT_MODE) },
應(yīng)該在從機(jī)里添加VID和PID千元,并分別添加到驅(qū)動(dòng)中,這樣會(huì)比較好颤绕。而不是使用HID_ANY_ID幸海。