Android单点&多点触控实现-----USB接口
一 单点
1.源码目录\drivers\input\touchscreen\usbtouchscreen.c
按照既有的模板增加即可,上报协议可以参考该文件中usbtouch_process_pkt(struct usbtouch_usb *,unsigned char *,int)函数。
2.也可以通过下面介绍的方法去实现。
二 多点
多点触控的两种上报协议:
---Protocol A
Down Event:
ABS_MT_TRACKING_ID //can select if support
ABS_MT_TOUCH_MAJOR//can select if support
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
SYN_MT_REPORT
……
SYN_REPORT //event end, should call after all events reported
Up Event:
SYN_MT_REPORT
SYN_REPORT //event end
---Protocol B
Down Event:
ABS_MT_SLOT // init (max point tp support), value is point id
ABS_MT_TRACKING_ID //
ABS_MT_TOUCH_MAJOR//can select if needed
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
……
SYN_REPORT //event end, should call after all events reported
Up Event:
ABS_MT_SLOT
ABS_TRACKING_ID //In up event, value should be-1
SYN_REPORT //event end
三读取与上报
1. 读取
对于USB接口的TP,没有在内核中内置驱动之前,插入到开发板上,内核会将其识别为usbhid设备(前提是将HID编进内核),并同时生成/dev/hidrawx节点,TP返回的触点信息可以通过/dev/hidrawx节点读取(参考source code).
2. 上报
不同厂商的TP(support multitouch)上报的数据格式可能都不一样,可能1个packet最大有3、5、10个触点数据,如果TP上同时有10个触点,不同的TP可能会分1个packet或几个packet上报。
触点信息的上报,驱动调用input_event函数按照协议上报,Input子系统将数据再提交给对应的handler,如下图
Linux内核提供了Uinput(user level dirver support for input subsystem)接口,使得用户可以通过/dev/uinput节点上报触点信息(详见--源码目录\drivers\input\misc\uinput.c),input_event函数会将触点信息提交给handler(源码目录\drivers\input\evdev.c,并生成对应节点/dev/eventx)。
在通过/dev/uinput节点上报触点信息之前,需要初始化,包括设置设备信息,相关的bit,相关参数的范围……
以上均是个人观点,学习了一段时间,走了不少弯路,最终还是实现了,有误的地方还请指出。有兴趣的同学可以看看。
参考:
源码目录\Documentation\input\Multi-touch-protocol.txt
源码目录\drivers\hid\hidraw.c
源码目录\drivers\input\misc\Uinput.c
源码目录\drivers\input\evdev.c
...........