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函数(不推荐)