|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
54.5 Tslib 移植和使用
! y, Q/ b6 Y" o Dft5426 触摸驱动添加成功后,发现触摸可能不太准确,这时可以使用一个第三方开源库 tslib 来调试触摸屏。下面来看一下 tslib 源码如何移植。
0 T4 w2 ~ G1 {- A54.5.1 获取 tslib 源码. K# l2 |. |1 l: m
tslib 源码可以从官方地址获取:https://github.com/libts/tslib,打开网址可以看到最新的版本是 1.21,可以从官网获取,也可以从网盘资料中获取,资料路径:i.MX6UL 终结者光盘资料/06_Linux 驱动例程/第三方库源码/tslib-1.21.tar.bz2。获取到 tslib 源码后,拷贝到 Ubuntu 系统下并解压,得到 tslib-1.21 文件夹。5 g1 z7 V% N! X- W: u& @
54.5.2 编译 tslib$ P) q* W) q1 [8 z; R
获取到 tslib 源码后,可以编译 tslib 源码,具体有下面几个步骤。3 }7 h) E7 V4 G/ }8 M' f
1、修改 tslib 源码所属用户
4 P) a2 _' p- J9 Q修改解压得到的 tslib-1.21 目录所属用户为当前用户,如果不修改可能会在稍后的编译中会遇到各种问题。我当前 ubuntu 的登录用户名为“topeet”,那么修改命令如下:2 i5 j4 p8 @- S2 n# }
sudo chown topeet:topeet tslib-1.21 -R修改后如图 54.5.2.1 所示:5 J; l! K" \/ ^2 y9 `0 B) {
% Q/ }8 i1 `4 [* k0 C
2、Ubuntu 工具安装
( Y' E, u+ n3 {1 u9 D编译 tslib 的时候需要先在 ubuntu 中安装一些文件,防止编译 tslib 过程中出错,命令如下所示:
1 m7 x3 g z: d% {/ J) j+ s, \sudo apt-get install autoconf
* r. G! s7 |$ i' g/ R" }sudo apt-get install automake, B+ N' N/ ~5 f& b% z
sudo apt-get install libtool" Z" B7 k" W: C& ~/ j2 M/ E5 N
3、编译 tslib
& Z) k6 B6 E7 V( @9 R首先创建一个 tslib 文件夹,用于存放编译结果。比如文件路径为:/home/topeet/tslib1 o; z5 j& u, z$ p8 I
然后使用下列命令配置并编译 tslib: U: I7 a) e8 C7 @' U
cd tslib-1.21/ //进入 tslib 源码目录
5 }/ Z" w% Y' h. e( A7 T6 }. t8 H7 T./configure --host=ARM-none-linux-gnueabi --prefix=/home/topeet/tslib
& N. p' m4 }! q+ W6 A, j* Lmake //编译% D3 k: E, {; z9 Y* [
make install //安装
% T3 i: b& @2 M' l注意,在使用./configure 配置 tslib 的时候“--host”参数指定编译器,指定的编译器要和编译文件系统使用同一个编译器,否则在开发板下不能正常使用。“--prefix”参数指定编译完成以后的 tslib 文件安装到哪里,这里肯定是安装到我们刚刚创建的“tslib”目录下。& e" c0 D% g! f l- b4 J6 M
编译完成后 tslib 目录如图 54.5.2.2 所示:
# ^ _1 I: p5 [, V, [$ e K/ @$ t. B% d5 v# ]
然后将 tslib 目录下的所有文件拷贝到开发板的根文件系统下。如果直接拷贝的话会出现符号链接文件不能拷贝的现象,可以先使用 tar 命令进行打包,然后解压到根文件系统下。命令如下:% g! U! c) g8 e. @4 Z
tar -czvf lib.tar.gz * //打包生成 lib.tar.gz 压缩包
; t: l4 J t( f& ?* u$ htar -xvf lib.tar.gz / //解压到开发板根文件目录下
* ^5 |" [/ ~3 u* p! W" J% M1 C54.5.3 测试 tslib
d& F9 k/ t5 R9 a当把编译好的 tslib 拷贝到开发板后,进行命令测试。
! q# f& o7 e% T6 Q( A8 f1、配置 tslib8 ]) J8 I% x0 E7 d& m- M; `( G
打开/etc/ts.conf 文件,找到下面这一行:
/ L; c- ^3 c) x5 v5 ~0 E$ Zmodule_raw input: U, Z( A1 D% A7 j' B/ Y/ m9 G7 u
如果上面这句前面有“#”的话就删除掉“#”。& q- r+ H E& P0 D. `4 M% b
打开/etc/profile 文件,在里面加入如下内容:7 A; x; B4 i4 ?1 Y9 H# \' U3 ^# _) h
1 export TSLIB_TSDEVICE=/dev/input/event10 J8 r) O# q8 M) o7 b+ K
2 export TSLIB_CALIBFILE=/etc/pointercal; N. G6 u6 f% p6 o6 c
3 export TSLIB_CONFFILE=/etc/ts.conf
9 q% @* L+ z$ y! L4 export TSLIB_PLUGINDIR=/lib/ts
; \& p, K, c: k8 Q5 export TSLIB_CONSOLEDEVICE=none
$ [" q4 \3 Z2 ?5 d7 T" g9 f6 export TSLIB_FBDEVICE=/dev/fb0
4 h: o* F4 Y, q1 X第 1 行,TSLIB_TSDEVICE 表示触摸设备文件,这里设置为/dev/input/event1,这个要根据具体情况设置,如果你的触摸设备文件为 event2 那么就应该设置为/dev/input/event2,以此类推。
5 a7 ~& P d1 K- ^/ E6 e6 ^( R第 2 行,TSLIB_CALIBFILE 表示校准文件,如果进行屏幕校准的话校准结果就保存在这个文件中,这里设置校准文件为/etc/pointercal,此文件可以不存在,校准的时候会自动生成。
8 N% U$ ^& D0 L& z第 3 行,TSLIB_CONFFILE 表示触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的时候会生成。
1 W- q8 B7 D( p5 p0 I2 N第 4 行,TSLIB_PLUGINDIR 表示 tslib 插件目录位置,目录为/lib/ts。
. V5 m- y) s1 ~8 \第 5 行,TSLIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none。
3 Y o0 g/ u, d) K第 6 行,TSLIB_FBDEVICE 表示 FB 设备,也就是屏幕,根据实际情况配置,我的屏幕文件为/dev/fb0,因此这里设置为/dev/fb0。4 ]4 z% R3 U$ T
全部配置好以后重启开发板,然后就可以进行测试了。2 `- I: l+ a% Y) s. p, w- o1 U
2、 测试 tslib
4 h: g3 N( I7 }; [8 n5 R; `开发板重新启动后,可以先进行校准,使用下面的命令:
! E* @8 C3 m8 m8 \9 ]; \% ets_calibrate o0 t h* d) @: ~+ t
校准完成后,会生成/etc/pointercal 文件,如果想重新校准,可以直接删除/etc/pointercal 文件,重新执行校准命令。( S5 V! I: j2 t8 A0 P. S4 s3 v. |
然后可以使用 ts_test_mt 这个命令来测试触摸屏工作是否正常,以及多点触摸是否有效,执行如下所示命令:
. L$ t9 G4 n0 B* L, ets_test_mt, T# g3 s# y$ P6 r5 ~
命令执行后会打开一个测试界面,如图 54.5.3.1 所示:4 W E" r7 ?: h% J$ |' P
![]()
4 p8 B& g8 J" ?6 V上图中有三个按钮“Drag”、“Draw”和“Quit”,这三个按钮的功能如下:
8 {% T6 T4 s& z$ P9 RDrag:拖拽按钮,默认就是此功能,大家可以看到屏幕中间有一个十字光标,我们可以通过触摸屏幕来拖拽此光标。一个触摸点一个十字光标,对于 5 点电容触摸屏,如果 5 个手指都放到屏幕上,那么就有 5个光标,一个手指一个。( p9 J: ?( D& a+ S
Draw:绘制按钮,按下此按钮我们就可以在屏幕上进行简单的绘制,可以通过此功能检测多点触摸工作是否正常。
, ?6 L; G3 B3 b' @. cQuit:退出按钮,退出 ts_test_mt 测试软件。
9 A; M+ i$ P7 O4 Z1 |) D# ]. o54.6 使用 Linux 内核自带的 ft5426 驱动& M, r7 S! e0 \: k, F6 Y8 Q% @
在 Linux 内核中集成了许多电容触摸芯片的驱动,其中就包括我们使用的 ft5426 的驱动。所以我们来使用一下 Linux 内核自带的 ft5426 驱动文件。在使用之前需要先将前面我们添加的 ft5426.c 驱动文件去除掉,只 需 要 修 改 drivers/input/touchscreen/Makefile 这个文件即可,将下面这一行删除掉:9 v i0 N3 N* X
obj-y += ft54266.o
# ?2 d3 @7 j) ]/ [$ [内核自带的 ft5426 的驱动文件为 drivers/input/touchscreen/edt-ft5x06.c。
' l, C- \4 ^$ c4 s& d4 w9 Y1、使能内核 ft5426 驱动配置2 t9 h7 O5 b+ V8 R! C/ L
要使用 Linux 内核自带的驱动,需要添加 Linux 内核配置。首先打开图形化配置界面,命令如下:
' D/ r% u9 b7 C7 X3 X8 B+ Cmake ARCH=arm menuconfig
' T/ c) F7 i2 Q0 z3 z8 s( t( [/ @. L配置路径如下:$ X9 y9 v- l- O4 _" h4 c
Device Drivers --->& P- K5 Y) Z* G$ g+ {
Input device support ---> H! j. f9 G7 K( ?9 T1 E, |; P
Touchscreens --->
% [1 O! z, u/ `<*> EDT FocalTech FT5x06 I2C Touchscreen support7 L. r3 m8 ^9 Y3 ], F ?' }
配置如图 所示:
1 |, x8 R4 q6 F j2 }: [2 t6 Z& p4 s( `2 A
配置完成后重新编译 Linux 内核,生成 zImage 镜像。! F% q0 O' v' `" @
2、 修改设备树文件3 [. w- F5 J: H* P1 @3 y" p
我们要根据 edt-ft5x06.c 文件中的 compatible 属性修改设备树下 ft5426 设备节点的 compatible 属性值edt-ft5x06.c 所支持的 compatible 属性列表如下所示:+ H& v7 I9 r2 ^! V2 ]
static const struct of_device_id edt_ft5x06_of_match[] = {# a; t' ~- {9 K# n" s, a/ s
{ .compatible = "edt,edt-ft5206", },
% j. D" H4 F4 \% R$ b& B{ .compatible = "edt,edt-ft5306", },- S9 o) U+ @. X
{ .compatible = "edt,edt-ft5406", },
* o5 }" J# ?# i{ /* sentinel */ }
9 W9 ~4 w8 }, p' D% H4 i};
$ @2 X3 {2 \4 L/ o2 p" U2 A可以看出,edt-ft5x06.c 文件默认支持的 compatible 属性只要三个“edt,edt-ft5206”、“edt,edt-ft5306”和“edt,edt-ft5406”。我们可以修改设备树中的 ft5426 节点,在 compatible 属性值添加一条“edt,edt-ft5406”,或者在 edt-ft5x06.c 文件中的 edt_ft5x06_of_match 表,在里面添加一条:- @+ d0 }' N1 J& S3 e9 ~
{ .compatible = "edt,edt-ft5426", }- g( G+ A2 l7 |9 a7 `5 K( m
总之一句话,让 ft5426 这个设备和 edt-ft5x06.c 这个驱动匹配起来。这里我们修改设备树下的 ft5426设备节点,修改后如下所示;
/ x& f4 S) J( w- q1 ft5426: ft5426@38 {0 m! l3 ]1 e( B% U
2 compatible = "edt,edt-ft5426","edt,edt-ft5406";
; {/ p8 R @! W2 d' G: F7 h z3 reg = <0x38>;- C/ C; u% }9 Z
4 pinctrl-names = "default";% q, B$ w0 P' I1 j, S' E& y
5 pinctrl-0 = <&pinctrl_tsc>;
2 t, b3 U* Z" z6 interrupt-parent = <&gpio1>;
# k2 x3 I3 Z% Q$ u7 interrupts = <9 0>;
3 K7 K, {' ^2 A c; {( E8 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
- J; o6 U( s) s/ k' ], G( O' j9 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;9 ~0 q/ D+ @; t; t" } _
10 };
, P5 Y# @4 V- \* U8 H& m2 e在 compatible 属性中添加"edt,edt-ft5406"兼容值。6 a* l: h; a0 C
设备树修改完成后,重新编译。然后使用新的 zImage 和 dtb 设备树文件启动开发板。驱动正常的情况,有如下启动信息:/ @; ^! o* N* G. E
![]()
5 U5 X" Q9 t' y2 [* }3 H0 g: x7 m" m4 X( \2 ]然后可以使用下面的命令查看 input 设备的具体情况:
; g, f8 J/ L @* }( N8 O5 k& x2 Dcat /proc/bus/input/devices/ J1 N" q! Z9 x" |0 z8 `$ @# ~
结果如图:
% t1 o' C; f% k9 Q, h ! u/ `1 @- z. m0 t. m
然后可以使用 hexdump 或者 ts_test_mt 命令进行测试。( e$ L3 y$ p8 c3 U' F! C
![]()
3 ^2 N. ~. R: m8 u) a : p9 i1 D& M: G& V1 E
0 D" f* N# z% _' W; {: M! `5 X* j |
|