10.14 android输入系统_多点触摸驱动测试及Reader线程InputStage分析

Posted 拉风摊主

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.14 android输入系统_多点触摸驱动测试及Reader线程InputStage分析相关的知识,希望对你有一定的参考价值。

21. 多点触摸_电容屏驱动程序_实践_tiny4412

tiny4412触摸屏: 分辨率为800 x 480
http://wiki.friendlyarm.com/wiki/index.php/LCD-S702/zh

测试:
a. 先把原有的ft5x06_ts.c 驱动程序去掉
I2C驱动有i2c_driver, i2c_device,ft5x06_ts.c只是i2c_driver,
修改同目录下的Makefile:
obj-$(CONFIG_TOUCHSCREEN_FT5X0X) += ft5x06_ts.o
改为:
obj-$(CONFIG_TOUCHSCREEN_FT5X0X) += mtp_input.o

b. 修改 arch/arm/mach-exynos/mach-tiny4412.c
去掉:
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
不去掉也可以,需要修改mtp_input.c:
static const struct i2c_device_id mtp_id_table[] = {
{ "100ask_mtp", 0 },
{ "ft5x0x_ts", 0}, // 添加这句
{}
};


c. make zImage

 

注册i2c driver时,
a. 它会首先判断能否支持系统中现有的I2C DEVICE,
假设该I2C DEVICE位于第n条I2C总线,地址为A

b. 再去各个I2C BUS(总线)上,使用address_list中的addr去探测是否存在能支持的设备
但是, 会忽略第n条I2C总线,地址为A的设备,因为在i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1))中注册的设备名字是使用的ft5x0x_ts,与我们的驱动不符合,所以注册i2c driver的时候,在判断能否支持系统中现有的I2C DEVICE时,不会匹配设备,后续对驱动中的i2c_driver结构体中的address_list里的地址A忽略,这样触摸屏设备在这个过程也不会通过add_new_device新增IIC设备,进而调用probe函数,因此如果不去掉i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)),必须在驱动中的i2c_device_id中添加{ "ft5x0x_ts", 0},这样注册i2c driver时就能匹配现有的设备,当然也可以修改内核中i2c_register_board_info

第一次:
git clone https://github.com/weidongshan/DRV_0005_MultiTouchPanel.git

git clone https://git.coding.net/weidongshan/DRV_0005_MultiTouchPanel.git

更新:
git pull origin

取出指定版本:
git checkout v3 // FT5x06 driver for tiny4412


22. Andriod系统使用多点触摸屏流程_idc配置文件

驱动中input_device的name必须设置,android系统会根据名字找到idc的配置文件,android应用程序通过ioctl读到,流程见uml图的input_reader,配置文件的作用是为了给android提供更多的信息,因为我们的驱动程序仅提供触点信息,如果我们的驱动能提供更多的信息,idc文件是可以省去的

在InputReader.cpp中的2837行会获得touch.deviceType的值,根据这个值来进行不同的事情,设置不同值;在InputReader.cpp搜索这个赋值过程,发现如果驱动提供了Input的属性等于INPUT_PROT_DIRECT,也会进行同样的赋值操作:

在驱动中添加:set_bit(INPUT_PROP_DIRECT,input_dev->propbit),这样就可以不提供idc文件了

/system/usr/idc/ft5x0x_ts.idc
/data/system/devices/idc/ft5x0x_ts.idc

https://source.android.com/devices/input/touch-devices

最重要一项:
touch.deviceType = touchScreen | touchPad | pointer | default        //idc文件只要这一项就可以了
触摸设备的类型:
touchScreen : 触摸屏, 覆盖在显示器上, 可以直接操作各种图标
touchPad : 触摸板, 不是覆盖在显示器上, 需要在LCD上显示一个光标以便定位
pointer : 跟touchPad类似, 多一些手势功能("Indirect Multi-touch Pointer Gestures")
default : 由系统自己确定


Indirect Multi-touch Pointer Gestures
A. Single finger tap: click. (单手指点击: 点击)
B. Single finger motion: move the pointer. (单手指移动: 移动)
c. Single finger motion plus button presses: drag the pointer. (按键+单指移动: 拖拽pointer)
D. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
(两手指同方向移动: 拖拽pointer所在区域,但是pointer不动)
E. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
(两手指往对方移动, 或往不同方向移动: pan/scale/rotate, 移动、放大缩小、旋转, pointer不动)
F. Multiple finger motion: freeform gesture.

第一次:
git clone https://github.com/weidongshan/DRV_0005_MultiTouchPanel.git

git clone https://git.coding.net/weidongshan/DRV_0005_MultiTouchPanel.git

更新:
git pull origin

取出指定版本:
git checkout v4 // don\'t need .idc file again

23. Andriod系统使用多点触摸屏流程_Reader线程

 

 

24. Andriod系统使用多点触摸屏流程_InputStage

在APP_0009_InputStage v1基础上修改, 如下获取v1代码:
git clone https://github.com/weidongshan/APP_0009_InputStage.git

git clone https://git.coding.net/weidongshan/APP_0009_InputStage.git

更新:
git pull origin

取出指定版本:
git checkout v1 // override onKeyPreIme/onKeyDown/onKeyUp, and setOnKeyListener

本节源码:
git checkout v2 // print StackTraceString for touch event

本节测例在按键监听执行函数中把栈空间打印出来分析方法间的调用关系

android中通过Log.d(TAG,Log.getStackTraceString(new  Throwable()))就可以打印堆栈,找到函数调用的地方,从此处往上就是该函数被调用的关系,打印出来的信息最下面是顶层函数,即下面调用上面

触摸事件处理过程:

Activity.dispatchTouchEvent--->Windows--->Decor--->...--->某个控件.dispatchTouchEvent

 

 

Android对触摸事件的处理过程总入口是Activity.dispatchTouchEcent,最终会通过window发给decorview,在有decorview分发给某个控件

控件对触摸操作的处理过程如下(入口是View.dispatchTouchEvent):
a. 如果事先使用 setOnTouchListener设置了监听器,
调用监听器的 onTouch 函数: li.mOnTouchListener.onTouch(this, event)
b. 接着调用View.onTouchEvent(event)
c. 最后, 对于松开的事件, 如果事件使用setOnClickListener设置了监听器,
调用监听器的 onClick 函数: li.mOnClickListener.onClick(this)

注意到用户可以设置2个监听器: setOnTouchListener, setOnClickListener
前者可以处理所有触摸事件(按下/松开/滑动等), 后者只能处理松开事件

怎么编程?
a. 如果想在所有控件之前处理触摸事件, 可以重写Activity的dispatchTouchEvent函数,
它最先被调用
b. 对于某个控件, 使用setOnTouchListener设置监听器处理所有类型的触摸事件
使用setOnClickListener设置监听器处理松开的触摸事件
c. 也可以重写控件的onTouchEvent函数(不推荐)

以上是关于10.14 android输入系统_多点触摸驱动测试及Reader线程InputStage分析的主要内容,如果未能解决你的问题,请参考以下文章

Android输入系统——多点触摸处理

驱动TP电容屏驱动_3.TP报点协议A/B 之 3.内核中的多点触摸协议文档 Multi-touch (MT) Protocol

Android 平台电容式触摸屏的驱动基本原理

单点触摸屏与多点触摸屏的异同

多点触摸屏——电容屏驱动程序

Linux——Linux驱动之iMX6ULL平台下多点触摸屏驱动开发实战(MT协议多点触摸API基于框架的触摸驱动编写触摸芯片驱动)