触摸屏驱动
触屏需要的知识点
首先触摸屏的驱动,也是使用之前使用input的知识点。
通过注册函数注册到内核,
触控屏幕,电容屏幕是控制 IC ,所以要使用到IIC的驱动,因为触摸 IC 提供了中断信号引脚(INT),可以通过中断来获取触摸信息 ,上报屏幕坐标等信息需要使用input的系统上报。
单点触摸和多点触摸
触摸屏分为多点触摸屏幕和单点触摸屏幕,单点触摸设备只支持单点触摸,一个同步事件完成数据只包含一个触摸点信息,单点触摸设备以ABS_XXX事件承载、上报触摸点的信息,有的设备还支持其他事件例如压力,z轴坐标等数据。
多点电容触摸的(Multi-touch,简称 MT), MT 协议被分为两种类型, TypeA 和 TypeB,这两种类型的区别如下:
Type A:适用于触摸点不能被区分或者追踪,此类型的设备上报原始数据(此类型在实际使用中非常少! )。
Type B:适用于有硬件追踪并能区分触摸点的触摸设备,此类型设备通过 slot 更新某一个触摸点的信息, FT5426 就属于此类型,一般的多点电容触摸屏 IC 都有此能力。
触摸点的信息通过一系列的 ABS_MT 事件(有的资料也叫消息)上报给 linux 内核 ,ABS_MT 事件定义在文件 include/uapi/linux/input.h中。
1 | void input_mt_sync(struct input_dev *dev) //A型隔离触摸点的数据 |
1 | /*对于 Type A 类型的设备,发送触摸点信息的时序*/ |
以上是TypeA和B 类型的时序,使用多点触摸驱动的时候就需要以上的时序上报坐标信息。
多点触摸所使用到的 API 函数
input_mt_init_slots 函数用于初始化 MT 的输入 slots,编写 MT 驱动的时候必须先调用此函数初始化 slots。
1
2
3int input_mt_init_slots( struct input_dev *dev, //MT 设备对应的 input_dev,因为 MT 设备隶属于 input_dev。
unsigned int num_slots, //设备要使用的 SLOT 数量,也就是触摸点的数量。
unsigned int flags) //其他一些 flags 信息,input_mt_slot 函数 此函数用于 Type B 类型,此函数用于产生 ABS_MT_SLOT 事件,告诉内核当前上报的是哪个触摸点的坐标数据
1
void input_mt_slot(struct input_dev *dev,int slot)
input_mt_report_slot_state 函数此函数用于 Type B 类型,用于产生 ABS_MT_TRACKING_ID 和 ABS_MT_TOOL_TYPE事 件 , ABS_MT_TRACKING_ID 事 件 给 slot 关 联 一 个 ABS_MT_TRACKING_ID ,ABS_MT_TOOL_TYPE 事 件 指 定 触 摸 类 型 ( 是 笔 还 是 手 指 等 )。
1
2
3
4
5
6
7void input_mt_report_slot_state( struct input_dev *dev,unsigned int tool_type,bool active)
/*dev: MT 设备对应的 input_dev。
tool_type:触摸类型,可以选择 MT_TOOL_FINGER(手指)、 MT_TOOL_PEN(笔)或
MT_TOOL_PALM(手掌),对于多点电容触摸屏来说一般都是手指。
active: true,连续触摸, input 子系统内核会自动分配一个 ABS_MT_TRACKING_ID 给 slot。
false,触摸点抬起,表示某个触摸点无效了, input 子系统内核会分配一个-1 给 slot,表示触摸
点溢出。*/input_report_abs 函数Type A 和 Type B 类型都使用此函数上报触摸点坐标信息,通过 ABS_MT_POSITION_X 和ABS_MT_POSITION_Y 事 件 实 现 X 和 Y 轴 坐 标 信 息 上 报 。
1
2
3
4
5void input_report_abs( struct input_dev *dev,unsigned int code,int value)
/*dev: MT 设备对应的 input_dev。
code:要上报的是什么数据,可以设置为 ABS_MT_POSITION_X 或 ABS_MT_POSITION_Y,
也就是 X 轴或者 Y 轴坐标数据。
value: 具体的 X 轴或 Y 轴坐标数据值*/input_mt_report_pointer_emulation 如果追踪到的触摸点数量多于当前上报的数量,驱动程序使用 BTN_TOOL_TAP 事件来通知用户空间当前追踪到的触摸点总数量,然后调用 input_mt_report_pointer_emulation 函数将use_count 参数设置为 false。否则的话将use_count 参数设置为 true,表示当前的触摸点数量(函数会获取到具体的触摸点数量,不需要用户给出)
1
2
3void input_mt_report_pointer_emulation(struct input_dev *dev,bool use_count)
/*dev: MT 设备对应的 input_dev。
use_count: true,有效的触摸点数量; false,追踪到的触摸点数量多于当前上报的数量。*/
多点电容触摸驱动框架
①、多点电容触摸芯片的接口,一般都为 I2C 接口,因此驱动主框架肯定是 I2C。
②、 linux 里面一般都是通过中断来上报触摸点坐标信息,因此需要用到中断框架。
③、多点电容触摸属于 input 子系统,因此还要用到 input 子系统框架。
④、在中断处理程序中按照 linux 的 MT 协议上报坐标信息。
IIC驱动框架
1 | 1 /* 设备树匹配表 */ |
初始化触摸 IC、中断和 input 子系统
在probe函数中完成初始化中断,input等。
1 | 1 static int xxx_ts_probe(struct i2c_client *client, const struct |
上报坐标信息
typeB时序的设备多,按照typeB的时序来进行抒写。
1 | 1 static irqreturn_t xxx_handler(int irq, void *dev_id) |
移植tslib库
tslib 是一个开源的第三方库,用于触摸屏性能调试,使用电阻屏的时候一般使用 tslib 进行校准。虽然电容屏不需要校准,但是由于电容屏加工的原因,有的时候其不一定精准,因此有时候也需要进行校准。最主要的是 tslib 提供了一些其他软件,我们可以通过这些软件来测试触摸屏工作是否正常。最新版本的 tslib 已经支持了多点电容触摸屏,因此可以通过 tslib 来直观的测试多点电容触摸屏驱动,这个要比观看 eventX 原始数据方便的多。
tslib 的移植很简单,步骤如下:
1、获取 tslib 源码
首先肯定是获取 tslib 的源码, git 地址为 https://github.com/kergoth/tslib,目前最新的版本是1.21。
2、修改 tslib 源码所属用户
修改解压得到的 tslib-1.21 目录所属用户为当前用户,这一步一定要做!否则在稍后的编译
中会遇到各种问题。我当前 ubuntu 的登录用户名为“moss”,那么修改命令如下:
1 | sudo chown moss:moss tslib-1.21 -R |
3、 ubuntu 工具安装
编译 tslib 的时候需要先在 ubuntu 中安装一些文件,防止编译 tslib 过程中出错,命令如下所示:
1 | sudo apt-get install autoconf |
4、编译 tslib
首先在 ubuntu 中创建一个名为“tslib”的目录存放编译结果,比如我们创建的 tslib 目录路径为: /home/zuozhongkai/linux/IMX6ULL/tool/tslib。
接下来输入如下命令配置并编译 tslib:
1 | cd tslib-1.21/ //进入 tslib 源码目录 |
注意,在使用./configure 配置 tslib 的时候“–host”参数指定编译器,“–prefix”参数指定编译完成以后的 tslib 文件安装到哪里,这里肯定是安装到我们刚刚创建的“tslib”目录下。
bin 目录下是可执行文件,包括 tslib 的测试工具。 etc 目录下是 tslib 的配置文件, lib 目录下是相关的库文件。将lib的所有文件拷贝到开发板的根文件系统中,命令如下:
1 | sudo cp * -rf /home/zuozhongkai/linux/nfs/rootfs |
5、 配置 tslib
打开/etc/ts.conf 文件,找到下面这一行:module_raw input
如果上面这句前面有“#”的话就删除掉“#”。打开/etc/profile 文件,在里面加入如下内容:
1 | 1 export TSLIB_TSDEVICE=/dev/input/event2 |
第 1 行, TSLIB_TSDEVICE 表示触摸设备文件,这里设置为/dev/input/event2,这个要根据具体情况设置,如果你的触摸设备文件为 event2 那么就应该设置为/dev/input/event2,以此类推。
第 2 行, TSLIB_CALIBFILE 表示校准文件,如果进行屏幕校准的话校准结果就保存在这个文件中,这里设置校准文件为/etc/pointercal, 此文件可以不存在,校准的时候会自动生成。
第 3 行, TSLIB_CONFFILE 表示触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的时候会生成。
第 4 行, TSLIB_PLUGINDIR 表示 tslib 插件目录位置,目录为/lib/ts。
第 5 行, TSLIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none。
第 6 行, TSLIB_FBDEVICE 表示 FB 设备,也就是屏幕,根据实际情况配置,我的屏幕文件为/dev/fb0,因此这里设置为/dev/fb0。全部配置好以后重启开发板,然后就可以进行测试了。