|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程
8 h: W2 T# X$ b6 E9 U6 s# L5 E0 T1 {7 r3 x$ _$ l( e
3 J# n, h2 r% \7 T% ]0 g5 ?8 h第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c
$ w" L+ x9 F9 v& y! W
$ i/ e, w1 M- H+ L( w4 |触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:' a, j+ m+ V' J" L2 }( X
1.input dev 的注册,参考 gsl_ts_init_ts()函数;
5 \9 J3 r5 G8 M1 b/ z2 W2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。
' r) k2 G5 b j: t' g+ S) D
% n) U$ R8 c" J
( j* {$ O- \# l) X" L8 R# i; P* |图1) k, b( o( M+ J' |
. N- d! \1 l% g$ k9 V
第二节 电路原理图介绍) P' c( `( _! m9 J* k
|& U8 N: D( v" P% {6 _
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。/ p+ P( b) H, I9 x
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。
# }: q- J1 u; q7 Y3 x' x' P: e) G1 X5 ?2 L
$ t" V$ A) S- w) G+ a; y图2+ s$ p" e* I0 o$ O5 G
$ ~& G6 C2 a2 x4 i8 f1 u: y$ n7 l
第三节 TP 驱动代码结构
; K1 Q! p8 C2 ]1 R. `' T
0 l9 p$ k2 m8 x$ G9 {2 q$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c) F0 Q4 m3 q X8 E9 c% v9 X
--- input device driver
+ \7 \( s& Q l( W* W2 ]$(dir)\rk3128-source\kernel\drivers\input\evdev.c( L% O9 z1 m/ d* d+ s! K+ f) X& X
--- input event handler
& A' z2 Z: Q7 b: L+ s$ |
/ |4 E$ h* [; k, h9 J第四节 .config 文件的配置选择
+ f" [+ {& a) O
. Q+ p& G6 j I4 C/ C1 h/ Qkernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择
1 Z5 E! g% u( s: tDevice Drivers --->
) p9 W, O, z d$ M/ u5 _) ~Input device support--->
6 ?- i" V3 Z3 p0 oTouchscreens --->. o' ~5 E, c5 s' r: J0 K
<*> gslX680 touchscreen driver
$ Y4 ~0 H4 v! V8 X+ `, _
- f- ~) o# Y/ `; x选择之后在.config 文件中会有如下项被设置:
5 y, y$ W/ k. ]* CCONFIG_TOUCHSCREEN_GSLX680=y: T1 {: x5 H1 D/ Z0 v u. L! g
# A( ?1 Z. z: a4 N% o
相应的配置文件目录位于:
% ^, W- n: ? Q. f& n x8 }3 |X:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig
6 i; t, q2 b& j! R, H7 _config TOUCHSCREEN_GSLX6808 _" [5 e, |% ^( C
! Z4 ?( S, l6 j1 v9 Rtristate "gslX680 touchscreen driver" 2 `! Z. `2 Z; M! ^$ }! H0 {5 o2 S+ f7 V
help5 J1 `: e K3 R3 u m' j
gslX680 touchscreen driver* T8 K* _' j" h* Y; @! ^9 P+ C
/ {, d; V5 b0 d1 b' e8 |
! L* K" p' K4 H6 L3 P' X4 X( j第五节 实验代码
7 c* f* D* ~5 N3 @( [; L+ J: W; Z9 C7 q$ \( O
1.dts part:
8 X9 x) _, [4 M! L0 y5 Y( C: R
& v( f3 e5 M) J4 \: e8 Q
; m7 y/ y( a/ l$ S% s. b代码1& X0 i3 \" X& k1 x$ o2 F: M
2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。
2 Z, c1 b& V) n
9 D7 l: C U3 u# L8 Q5 c
3 u* Z' Z7 K' o* h6 k; ^
6 z; n9 o2 T v- V: E6 V1 \+ B, }代码2
3 \4 b4 |) K: Z6 X( w6 P( V6 q4 t3.测试命令
7 B4 H4 T/ X7 F命令输入路径/sys/class/touchscreen_test $ a. Z: q2 ~ J, s( f$ B
关闭触摸功能:
8 [7 H4 r( U7 J+ \echo sleep > touchscreen % j% W( T1 y, ~* f7 g
echo wake > touchscreen
2 q; h# F3 f z, e! d, K镜像触摸屏坐标:
9 t1 D6 K9 b9 fecho mirror > touchscreen
, F) X- C$ P$ F, _5 V4 v4.代码调试中遇到问题
+ c, B( _9 C' s7 a1 n触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。
/ w5 X6 B o8 ?: n4 x7 E3 a, ]; a" k$ a H
第六节 实验步骤 --- 镜像后的坐标如何调节& `$ H9 M1 [+ M1 I3 h6 e
9 V/ u6 v# g# @4 |' q
cd /sys/class/touchscreen_test
& v- G- J7 A) Fecho mirror > touchscreen
# d8 n' O* l2 O9 m) G. Q" t
5 w" U) x/ G" H2 b7 z) ` x4 R第七节 实验现象
' L' ]4 g& V4 R9 ~5 C4 u, p点击位置倒向,需要修改代码4 U# n' E/ ?8 O$ e: S$ o! A
report_data()中的两个地方 --- 自己做实验了
& Z6 S8 V6 W, @2 }, u2 u* k" J9 I. v
! G9 S) l4 F' `$ b# t/ Q0 Q$ K& E6 r5 w1 o; a5 A
4 K% k! G9 C& T" C5 e
: u. h- ~/ i6 ^5 b4 j% a& {
文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
( Y" n" R3 M3 N# V9 Z
+ i, M; D. Y( `' g5 `
|
|