Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
本章的思维导图如下:
五、tslib移植与使用
通过 tslib 来直观的测试多点电容触摸屏驱动。
1、tslib移植
1)、获取tslib源码
git 地址为 https://github.com/kergoth/tslib
2)、修改tslib源码所属用户
修改解压得到的 tslib-1.21 目录所属用户为当前用户:
sudo chown zuozhongkai:zuozhongkai tslib-1.21 -R
3)、ubuntu工具安装
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
4)、编译tslib
首先在 ubuntu 中创建一个名为“ tslib”的目录存放编译结果,比如我们创建的 tslib 目录全
路径为: /home/zuozhongkai/linux/IMX6ULL/tool/tslib。
配置并编译talib:
cd tslib-1.21/ //进入 tslib 源码目录
./autogen.sh
./configure --host=arm-linux-gnueabihf --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/tslib
make //编译
make install //安装
使用./configure 配置 tslib 的时候“ --host”参数指定编译器,“ --prefix”参数指定编
译完成以后的 tslib 文件安装到哪里。
bin 目录下是可执行文件,包括 tslib 的测试工具。 etc 目录下是 tslib 的配置文件, lib 目录
下是相关的库文件。将下图 中的所有文件拷贝到开发板的根文件系统中,
命令如下:
sudo cp * -rf /home/zuozhongkai/linux/nfs/rootfs
5)、配置tslib
打开/etc/ts.conf 文件,找到下面这一行:
module_raw input
1 export TSLIB_TSDEVICE=/dev/input/event1//TSLIB_TSDEVICE 表示触摸设备文件
2 export TSLIB_CALIBFILE=/etc/pointercal/*TSLIB_CALIBFILE 表示校准文件,如果进行屏幕校准的话校准结果就保存在这
个文件中,这里设置校准文件为/etc/pointercal,此文件可以不存在,校准的时候会自动生成。*/
3 export TSLIB_CONFFILE=/etc/ts.conf/*TSLIB_CONFFILE 表示触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的
时候会生成。*/
4 export TSLIB_PLUGINDIR=/lib/ts/*TSLIB_PLUGINDIR 表示 tslib 插件目录位置,目录为/lib/ts。*/
5 export TSLIB_CONSOLEDEVICE=none/*TSLIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none。*/
6 export TSLIB_FBDEVICE=/dev/fb0/*TSLIB_FBDEVICE 表示 FB 设备,也就是屏幕,根据实际情况配置,我的屏幕文
件为/dev/fb0,因此这里设置为/dev/fb0。*/
6)、tslib测试
电阻屏的话,输入命令:
ts_calibrate
校准完成以后如果不满意,或者不小心对电容屏做了校准,那么直接删除掉/etc/pointercal
文件即可。
使用 ts_test_mt 这个软件来测试触摸屏工作是否正常,以及多点触摸是否有效,执行如下所示命令:
ts_test_mt
打开测试界面进行测试。
Drag: 拖拽按钮
Draw: 绘制按钮
六、使用内核自带的驱动
1、修改edt-ft5x06.c
2、使能内核自带的FT5X06驱动
图形化配置make menuconfig
配置路径:
Location:
-> Device Drivers
-> Input device support
-> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
-> Touchscreens (INPUT_TOUCHSCREEN [=y])
-> <*> EDT FocalTech FT5x06 I2C Touchscreen support
3、修改设备树
ft5426 这个设备节点,需要在里面添加 compatible 属性:
static const struct of_device_id edt_ft5x06_of_match[] = {
{ .compatible = "edt,edt-ft5206", },
{ .compatible = "edt,edt-ft5306", },
{ .compatible = "edt,edt-ft5406", },
{ /* sentinel */ }
};
修改设备树中的ft5426这个节点:
1 ft5426: ft5426@38 {
2 compatible = "edt,edt-ft5426","edt,edt-ft5406";
3 reg = <0x38>;
4 pinctrl-names = "default";
5 pinctrl-0 = <&pinctrl_tsc>;
6 interrupt-parent = <&gpio1>;
7 interrupts = <9 0>;
8 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
9 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
10 };
修改完成以后重新编译设备树,然后使用新得到的.dtb 和 zImage 文件启动 linux 内核。
直接运行 ts_test_mt 来测试触摸屏是否可以使用。
七、4.3.寸屏触摸驱动实验
触摸驱动 IC GT9147
1、修改设备树pinctrl_tsc节点内容
pinctrl_tsc 节点用于保存触摸屏的中断和复位引脚配置信息:
1 pinctrl_tsc: tscgrp {
2 fsl,pins = <
3 /* 4.3 寸 RGB 屏幕,GT9147 */
4 MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x10B0 /* TSC_RST */
5 MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x10B0 /* TSC_INT */
6 >;
2、在设备树的i2c2节点下添加tgt9147子节点
1 gt9147:gt9147@14 {
2 compatible = "goodix,gt9147", "goodix,gt9xx";
3 reg = <0x14>;
4 pinctrl-names = "default";
5 pinctrl-0 = <&pinctrl_tsc>;
6 interrupt-parent = <&gpio1>;
7 interrupts = <9 0>;
8 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
9 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
10 status = "okay";
11 };
3、修改设备树的lcdif节点
4.3 寸800*480 和 480*272 这两款屏幕对应的 lcdif 节点分别如下所示:
1 /* 4.3 寸 480*272 */
2 &lcdif {
3 pinctrl-names = "default";
4 pinctrl-0 = <&pinctrl_lcdif_dat
5 &pinctrl_lcdif_ctrl>;
6
7 display = <&display0>;
8 status = "okay";
9
10 display0: display {
11 bits-per-pixel = <24>;
12 bus-width = <24>;
13
14 display-timings {
15 native-mode = <&timing0>;
16 timing0: timing0 {
17 clock-frequency = <9000000>;
18 hactive = <480>;
19 vactive = <272>;
20 hfront-porch = <5>;
21 hback-porch = <40>;
22 hsync-len = <1>;
23 vback-porch = <8>;
24 vfront-porch = <8>;
25 vsync-len = <1>;
26
27 hsync-active = <0>;
28 vsync-active = <0>;
29 de-active = <1>;
30 pixelclk-active = <0>;
31 };
32 };
33 };
34 };
35
36 /* 4.3 寸 800*480 */
37 &lcdif {
38 pinctrl-names = "default";
39 pinctrl-0 = <&pinctrl_lcdif_dat
40 &pinctrl_lcdif_ctrl>;
41
42 display = <&display0>;
43 status = "okay";
44
45 display0: display {
46 bits-per-pixel = <24>;
47 bus-width = <24>;
48
49 display-timings {
50 native-mode = <&timing0>;
51 timing0: timing0 {
52 clock-frequency = <31000000>;
53 hactive = <800>;
54 vactive = <480>;
55 hfront-porch = <40>;
56 hback-porch = <88>;
57 hsync-len = <48>;
58 vback-porch = <32>;
59 vfront-porch = <13>;
60 vsync-len = <3>;
61
62 hsync-active = <0>;
63 vsync-active = <0>;
64 de-active = <1>;
65 pixelclk-active = <0>;
66 };
67 };
68 };
69 };
设备树修改完成以后重新编译设备树并用新的设备树启动,检查一下 LCD 是否驱动成
功,如果不成功的话检查 lcdif 节点配置。
4、编译GT9147驱动文件
gt9147.c 里面的驱动是单点触摸的。
八、总结
本章的内容比较多,既包括基础知识,又包括驱动开发、tslib移植与使用,还包括Linux内核自带触摸屏驱动的使用,以及不同分辨率4.3寸触摸屏的驱动开发与测试。
本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。