Android遇上手写板

版本说明

Linux内核:3.0.8

Android  4.2.2

 

Linux下鼠标驱动的研究分析

        有些东西不能靠直觉,就得实实在在地研究一番才能知道所以然来。比如这次 的鼠标驱动,现象是 该鼠标为特殊鼠标,在2.6.32版本内核中可以驱动,在3.0.8版本中不能驱动;问题是 鼠标驱动会过滤USB设备的VIDPID吗?

        随后查看了drivers/hid/usbhid/usbmouse.c,发现其是根据USB设备类别来适配的,并非通过VID/PID来区分的。但就在我准备在其probe函数中添加一些打印信息确定问题出现的位置时,发现该驱动文件根本就没有被编译,那么说来鼠标驱动很有可能就不是它,经过一番实验论证,得出如下结论:

 

注:两个是不能共存的,取消其中一个另一个才可以被选中。内核推荐使用第一种,第一种也是被默认选中的。而第一种同时还是键盘/扫描枪等等HID设备的驱动程序。

        分析一下hid-quirks.c匹配设备的过程,从usbhid_probe开始:

usbhid_probe

(drivers/hid/usbhid/hid-core.c)

      ↓

hid_add_device

(drivers/hid/hid_core.c)

      ↓ 

hid_ignore

(drivers/hid/hid_core.c)

      ↓

     End

hid_ignore恰恰进行了VID/PID过滤。我测试的特殊鼠标正是在这里躺枪的。这里将其解救出来,问题得以解决。

        顺便说下我的理解,为什么会有黑名单过滤呢?我认为是有些虽然是HID设备,但是是一个多功能的设备,所以需要更单独的驱动程序,比如WACOM公司的高级数位板。这个项目让我了解了HID设备的驱动,也打破了我以前的认识。
Android输入设备分析

        一个设备在Linux中工作正常了,不能说明它就能直接应用在Android设备中。这次证实确实如此。

        使用getevent命令可以直接检测输入事件后,那么就说明该设备已经可以正常地工作于普通的Linux系统下了,但是Android对输入设备又进行了一次过滤。一个新添加的输入设备会在以EventHubTAGLOG信息中显示。如下一个不能被正确识别的输入设备:

 Android遇上手写板_第1张图片

那么如何才算能够识别,如何算没有识别呢?Android对输入设备进行了重新分类,其中类别有:

Android遇上手写板_第2张图片 

 注:”...”代表没有深入研究,暂不总结。

        而我测试的设备有 左右点击/XY绝对坐标 是TOUCHCURSOR两种设备类型的结合体,这样会导致无法正确识别,就算强行将其归类到TOUCH类别中,还有InputReader关要过。最终的实现方法通过修改EventHub.cpp/InputReader.cpp将 左右点击/XY绝对坐标 功能的设备也归类到TOUCH类型中,这样就可以正常使用了。主要参考补丁:

Support VirtualBox virtual USB tablet (absolute mouse)

        小结:比较高级的手写板甚至不需要做任何的配置都可以正常的在Android系统上使用,本手写板仅仅算是模拟手写板。

 

参考:

1.Full (emulated USB tablet) mouse support

2.完整补丁:https://android-review.googlesource.com/#/c/31460/

你可能感兴趣的:(Android)