现在的位置: 首页 > 综合 > 正文

Android 单点&多点触控实现—–USB接口

2017年03月12日 ⁄ 综合 ⁄ 共 1700字 ⁄ 字号 评论关闭

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)上报的数据格式可能都不一样,可能1packet最大有3510个触点数据,如果TP上同时有10个触点,不同的TP可能会分1packet或几个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

...........

抱歉!评论已关闭.