|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
54.5 Tslib 移植和使用
( J6 I/ }5 q; s: Nft5426 触摸驱动添加成功后,发现触摸可能不太准确,这时可以使用一个第三方开源库 tslib 来调试触摸屏。下面来看一下 tslib 源码如何移植。8 M- N i. _* k1 Q" a
54.5.1 获取 tslib 源码% Z# r# y* R$ i- F3 q% `+ X
tslib 源码可以从官方地址获取:https://github.com/libts/tslib,打开网址可以看到最新的版本是 1.21,可以从官网获取,也可以从网盘资料中获取,资料路径:i.MX6UL 终结者光盘资料/06_Linux 驱动例程/第三方库源码/tslib-1.21.tar.bz2。获取到 tslib 源码后,拷贝到 Ubuntu 系统下并解压,得到 tslib-1.21 文件夹。
`, h/ @* f& o5 K9 X% y54.5.2 编译 tslib) {& E" p0 Z$ `" ]
获取到 tslib 源码后,可以编译 tslib 源码,具体有下面几个步骤。7 ~9 G8 {' D# [0 N$ Y9 [7 m2 @
1、修改 tslib 源码所属用户: t) B: d7 }* k a
修改解压得到的 tslib-1.21 目录所属用户为当前用户,如果不修改可能会在稍后的编译中会遇到各种问题。我当前 ubuntu 的登录用户名为“topeet”,那么修改命令如下:
1 y/ ^+ z' q( u3 ]sudo chown topeet:topeet tslib-1.21 -R修改后如图 54.5.2.1 所示:
3 u5 V& o! l) z9 p5 \, t) {3 c 5 y+ g! P# F3 I; s8 O
2、Ubuntu 工具安装0 Y3 C: X% V3 O' D
编译 tslib 的时候需要先在 ubuntu 中安装一些文件,防止编译 tslib 过程中出错,命令如下所示:3 F* b; m8 O# ^. l7 O
sudo apt-get install autoconf9 ]/ ]% Q% N( i4 E% ~
sudo apt-get install automake1 M! w+ Y) p7 ]+ L$ k2 N0 S. R
sudo apt-get install libtool
9 A/ G, p& u, v% n+ ^+ S. N6 n3、编译 tslib
% G' S1 C) i0 T! `/ G3 O1 J首先创建一个 tslib 文件夹,用于存放编译结果。比如文件路径为:/home/topeet/tslib
^2 Z- d- n T+ X& R" J然后使用下列命令配置并编译 tslib:
5 m: L3 ?; C; {3 Jcd tslib-1.21/ //进入 tslib 源码目录: W8 r4 K/ V8 P7 _$ |7 w# a
./configure --host=ARM-none-linux-gnueabi --prefix=/home/topeet/tslib
9 h( A5 ?. }2 h! r+ j. }make //编译
5 R$ l( v, f, M* L2 Zmake install //安装9 T! }3 R- o7 X/ L5 a. X, g
注意,在使用./configure 配置 tslib 的时候“--host”参数指定编译器,指定的编译器要和编译文件系统使用同一个编译器,否则在开发板下不能正常使用。“--prefix”参数指定编译完成以后的 tslib 文件安装到哪里,这里肯定是安装到我们刚刚创建的“tslib”目录下。
1 J- t# W$ ]# f+ {- F4 \) j8 V# i编译完成后 tslib 目录如图 54.5.2.2 所示:# x5 |9 M+ e4 x7 g
![]()
8 \3 Q$ q# ?1 z7 }# {" R然后将 tslib 目录下的所有文件拷贝到开发板的根文件系统下。如果直接拷贝的话会出现符号链接文件不能拷贝的现象,可以先使用 tar 命令进行打包,然后解压到根文件系统下。命令如下:2 @& [" Z7 {) ?5 S* s1 P. @
tar -czvf lib.tar.gz * //打包生成 lib.tar.gz 压缩包 ]% x; l1 J; P/ _1 ~* b# a+ }
tar -xvf lib.tar.gz / //解压到开发板根文件目录下2 F2 V' }* j8 ^/ Q' w
54.5.3 测试 tslib5 p" F# g! g7 e, B" N8 u
当把编译好的 tslib 拷贝到开发板后,进行命令测试。: W- \& I0 k @7 U9 w" m
1、配置 tslib' Z: x; z& t8 |. h# I
打开/etc/ts.conf 文件,找到下面这一行:: s& Z3 i' R( O7 C0 m: b
module_raw input" h3 J& b! ~2 t
如果上面这句前面有“#”的话就删除掉“#”。
# W$ B/ P4 w" [打开/etc/profile 文件,在里面加入如下内容:
$ s7 h5 \0 i, W9 w3 P* N1 export TSLIB_TSDEVICE=/dev/input/event1
8 g. k8 l3 m1 h7 c: [5 j2 export TSLIB_CALIBFILE=/etc/pointercal
% |5 J4 L- E/ j5 j- v; \% R( i3 export TSLIB_CONFFILE=/etc/ts.conf
' o( ]! t" w# K; b q+ J9 I- x4 export TSLIB_PLUGINDIR=/lib/ts
0 a* a: s3 {& A; @7 R9 d1 }5 Y5 export TSLIB_CONSOLEDEVICE=none2 L5 I4 `! T5 {/ F5 o
6 export TSLIB_FBDEVICE=/dev/fb07 U0 A v8 B, \. \3 o# d: E- P: a. e7 P
第 1 行,TSLIB_TSDEVICE 表示触摸设备文件,这里设置为/dev/input/event1,这个要根据具体情况设置,如果你的触摸设备文件为 event2 那么就应该设置为/dev/input/event2,以此类推。
( Y: P6 i' W1 R第 2 行,TSLIB_CALIBFILE 表示校准文件,如果进行屏幕校准的话校准结果就保存在这个文件中,这里设置校准文件为/etc/pointercal,此文件可以不存在,校准的时候会自动生成。
( ^; }9 S( Y: [! M! }第 3 行,TSLIB_CONFFILE 表示触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的时候会生成。
]& c5 K: |0 Q" o4 f; b3 E& x第 4 行,TSLIB_PLUGINDIR 表示 tslib 插件目录位置,目录为/lib/ts。
b# ]1 C; Z( ^7 l5 W. i- x. w- @+ o第 5 行,TSLIB_CONSOLEDEVICE 表示控制台设置,这里不设置,因此为 none。4 o0 G3 l, k/ }, M
第 6 行,TSLIB_FBDEVICE 表示 FB 设备,也就是屏幕,根据实际情况配置,我的屏幕文件为/dev/fb0,因此这里设置为/dev/fb0。
8 o% O7 [, F, g4 V7 T全部配置好以后重启开发板,然后就可以进行测试了。
. L. R* p/ R+ {0 m2、 测试 tslib
; }% z* k) j/ ^6 R! Z, E( t7 e开发板重新启动后,可以先进行校准,使用下面的命令:, r! l8 ^7 u% M! O
ts_calibrate2 W, Z1 x1 M1 q3 u5 d9 o
校准完成后,会生成/etc/pointercal 文件,如果想重新校准,可以直接删除/etc/pointercal 文件,重新执行校准命令。7 _* }# h+ X3 s5 y: r. h: e
然后可以使用 ts_test_mt 这个命令来测试触摸屏工作是否正常,以及多点触摸是否有效,执行如下所示命令:- w4 P( Y/ [- \# T A! ~
ts_test_mt
& a- `. ]+ q% k. F3 h命令执行后会打开一个测试界面,如图 54.5.3.1 所示:: o! Q# @5 F% g
: E4 `5 Y4 M( o' Q
上图中有三个按钮“Drag”、“Draw”和“Quit”,这三个按钮的功能如下:
. h7 u& D1 @, }8 EDrag:拖拽按钮,默认就是此功能,大家可以看到屏幕中间有一个十字光标,我们可以通过触摸屏幕来拖拽此光标。一个触摸点一个十字光标,对于 5 点电容触摸屏,如果 5 个手指都放到屏幕上,那么就有 5个光标,一个手指一个。- f; c. i6 Q2 l% ~
Draw:绘制按钮,按下此按钮我们就可以在屏幕上进行简单的绘制,可以通过此功能检测多点触摸工作是否正常。* h' M: D' [ w- ]
Quit:退出按钮,退出 ts_test_mt 测试软件。: U1 |. q, m4 D
54.6 使用 Linux 内核自带的 ft5426 驱动
& w! a# V% C9 B/ {在 Linux 内核中集成了许多电容触摸芯片的驱动,其中就包括我们使用的 ft5426 的驱动。所以我们来使用一下 Linux 内核自带的 ft5426 驱动文件。在使用之前需要先将前面我们添加的 ft5426.c 驱动文件去除掉,只 需 要 修 改 drivers/input/touchscreen/Makefile 这个文件即可,将下面这一行删除掉:; J! |) _) @4 Y, C8 s
obj-y += ft54266.o
; \. @0 l% P7 C, u8 r0 e! |内核自带的 ft5426 的驱动文件为 drivers/input/touchscreen/edt-ft5x06.c。
6 V; i$ c8 z0 s9 o: t5 h& O1、使能内核 ft5426 驱动配置
5 P( L8 y, p, Y8 K7 ?5 i要使用 Linux 内核自带的驱动,需要添加 Linux 内核配置。首先打开图形化配置界面,命令如下:
' n+ h( U( Z: a+ B Lmake ARCH=arm menuconfig
4 j! B8 n @! e% ~. U0 a配置路径如下:
3 Q( |* Z2 j- d4 X8 S3 a* }! JDevice Drivers --->
0 W# e5 z4 t5 w) f" X( X7 h. J1 ZInput device support --->
! {* ^9 k6 p0 L: c; u: TTouchscreens --->- Y/ A$ a1 \' G# u/ S/ ?
<*> EDT FocalTech FT5x06 I2C Touchscreen support, S4 h6 B* q$ D
配置如图 所示:
3 t) E* C- `+ C% R h2 D3 g+ x, W![]()
+ q8 w% ?- E5 k9 O7 d6 D2 J配置完成后重新编译 Linux 内核,生成 zImage 镜像。+ y+ d; k9 j, W8 O
2、 修改设备树文件& V. D8 B9 J4 |# \
我们要根据 edt-ft5x06.c 文件中的 compatible 属性修改设备树下 ft5426 设备节点的 compatible 属性值edt-ft5x06.c 所支持的 compatible 属性列表如下所示:% k5 [% j g6 C
static const struct of_device_id edt_ft5x06_of_match[] = {
1 {4 W, m* A z7 B( D{ .compatible = "edt,edt-ft5206", },' W6 D4 v7 N: o) F* z& t
{ .compatible = "edt,edt-ft5306", },
- e' m; O# ~( e( n{ .compatible = "edt,edt-ft5406", },, b. h2 u, s$ j
{ /* sentinel */ }
# m4 J$ Z3 r f* q Z% b# T# j};7 W2 H. p# i. p3 v
可以看出,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 表,在里面添加一条:
- y Q I$ ]5 p, b{ .compatible = "edt,edt-ft5426", }; d0 ]9 y' C4 l; u) d0 `
总之一句话,让 ft5426 这个设备和 edt-ft5x06.c 这个驱动匹配起来。这里我们修改设备树下的 ft5426设备节点,修改后如下所示;
& }) f. B" u$ ]$ G1 j. N1 ft5426: ft5426@38 {+ D3 l5 h; ]4 T- l" N
2 compatible = "edt,edt-ft5426","edt,edt-ft5406";
' m: |; g. ^2 b t' ]3 reg = <0x38>;
& d( \' X: L: ^4 X$ S& `1 ]2 w0 d4 pinctrl-names = "default";
- T. J& R A7 R4 x: A8 I5 pinctrl-0 = <&pinctrl_tsc>;
; P' s1 f4 C* t$ r2 Q4 o% y6 interrupt-parent = <&gpio1>;0 f7 E6 }: ]' W0 D/ ~$ ]
7 interrupts = <9 0>;
' L2 u' V1 k' c8 i$ a8 reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;# C J& f! n+ R
9 interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
: x# q3 a: L: _+ y10 };) F1 {! B+ i5 K9 C
在 compatible 属性中添加"edt,edt-ft5406"兼容值。
- W/ e: M6 n. L$ u设备树修改完成后,重新编译。然后使用新的 zImage 和 dtb 设备树文件启动开发板。驱动正常的情况,有如下启动信息:3 ]& {. ]8 b( `3 Q* L! W5 I+ V
) v8 i* \3 N2 C! p
然后可以使用下面的命令查看 input 设备的具体情况:7 T6 q9 Z; E; x
cat /proc/bus/input/devices
& J1 ?& B: t7 @结果如图:2 A$ D; ^% d" g, G+ X! h- L
8 ]" l- u7 w* r! q4 X
然后可以使用 hexdump 或者 ts_test_mt 命令进行测试。5 Z+ H @( p$ M6 M. X% ~
6 d$ ]+ h2 G: O7 d
# N1 y6 N8 u* f! b7 h P
3 p* ^, Q3 W% j
|
|