|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程 * [( a7 n4 g* [( T3 E8 k. \7 j
0 z2 f. b3 F3 _$ `! I
/ ^$ F9 a1 S' @/ r1 Z* q
1 Z5 l8 t( r; B, |
' W+ m) D& `* Z& z第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c& y, L- {1 y- V" I5 S2 h5 k! p* G4 A) ?) J
/ H- Y7 B* |- h' L# y: j触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:+ f( c% H$ L6 a! {( [* \0 \$ }
1.input dev 的注册,参考 gsl_ts_init_ts()函数;! T V& r8 B+ U+ y% B/ d5 J
2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。
+ L$ @$ _& X5 J, U+ r) Z
" u1 Z: e' K! Y% i6 B7 Q7 i7 M! i
: B) J6 i" A' t1 o) n
图1
% [! ^4 B9 R5 n, S
0 C2 P3 `- m( a+ `! H3 k/ d第二节 电路原理图介绍
. k3 k0 A9 e6 D0 ^ G2 \6 d$ }4 H+ X9 e% r+ U$ U2 n8 A! H ]
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。0 W/ e1 ^( `6 I- k
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。$ ~ P. z% [+ p# C, t
2 Y% g2 n t9 _7 n) r- y' ~
3 O% v2 n% Z v% U$ h图2
4 \: S. J& `% o C+ m A' ~
0 Q j G; {* }8 G9 G9 v第三节 TP 驱动代码结构+ t+ m( l7 V2 Q) U' X& j
7 y. f! p" Z9 \6 ~, s7 Q* N
$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c
* Z7 m: W9 D9 a( F9 h! V--- input device driver
6 s1 b3 P, j0 m) P$(dir)\rk3128-source\kernel\drivers\input\evdev.c# z0 u, y3 j. H' @
--- input event handler+ t5 `5 k$ a. }
$ R, a' |) N' R% D
第四节 .config 文件的配置选择
7 ^5 m p6 b3 f
( O" _& M3 o. J- B1 z8 B' ]kernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择
# r5 N; O* Y, x q9 f! s C, N" kDevice Drivers --->! q v/ K/ s+ p& V0 }
Input device support--->
; a6 _8 X' V2 ^+ }/ g0 m& x5 |Touchscreens --->
H. q8 y& o7 {8 x0 U+ O/ U<*> gslX680 touchscreen driver/ t7 ]; V5 u' \5 a" ~; V
% k* W* i" \' M9 [& ^& b/ a
选择之后在.config 文件中会有如下项被设置:
, Z. Q% J' Q( g- l) D- v- _CONFIG_TOUCHSCREEN_GSLX680=y4 [+ z/ W" o6 \9 ^; t8 ]- r i* r
- q9 W/ A3 m1 K/ ~3 k相应的配置文件目录位于:
! @1 I9 A( @; @2 q% g' h) X- mX:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig8 Q! n( x9 _4 Z! [, d9 p# e+ J
config TOUCHSCREEN_GSLX680 T/ k% w; O. U0 Y
5 M2 j/ v/ A5 [0 e& i. _8 gtristate "gslX680 touchscreen driver"
- C' N- G8 ]+ z# o# Q# V# `: E* [5 ~% Bhelp
; m$ W( o/ S# S* N( E" PgslX680 touchscreen driver
]+ h& F p2 O- H Q, y" w$ ^9 c4 _6 }! e- E2 v3 P
1 f0 {) i: `' I1 e% ^* f+ l) L" ?第五节 实验代码
( I) s5 T% m8 Z" H) a$ I* |& X0 T% T$ X, @
1.dts part:
3 j3 C+ g \) e$ a1 l! a: d3 b1 ?" r* A4 Y2 ~" H4 ]- d( s+ V J
" M" c( [; J6 _4 X代码18 B) ^( g9 u3 |
2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。
/ O8 c1 [; ^9 `; W" @) U) |2 a2 H, o& {! n7 k- Y
, R' P! }4 r% J
6 Z% c: M- E& W/ G. n0 U7 I
代码2
5 H/ H' K+ `1 U, a0 U3.测试命令
$ A8 m4 f- H" S4 \' ]+ s+ [6 }命令输入路径/sys/class/touchscreen_test 4 Q( x8 ?3 o% Z7 R1 Q c. a) G
关闭触摸功能:
- z9 }5 D0 j9 ]7 [9 F: Z/ vecho sleep > touchscreen d; f3 s) A( ^) r* J; x( L; v1 |
echo wake > touchscreen5 b" F. p$ g0 h) e
镜像触摸屏坐标:
: e5 [7 p2 M( P, j* I2 \8 T; P. Xecho mirror > touchscreen
3 \/ M4 |& P5 x/ Z4.代码调试中遇到问题. _9 s' [! \/ P8 Z8 j& e# q; k
触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。
- ?' l; _' G% U2 S, n4 g) A$ c
. R2 @; o- i3 U$ ~, k第六节 实验步骤 --- 镜像后的坐标如何调节
* e7 B* I k3 P' [7 h2 [/ e
8 K" O$ ?* m# i& Q- `cd /sys/class/touchscreen_test
1 N5 c( J' _7 Z# x Wecho mirror > touchscreen: }0 Q# ^/ B/ L& D$ K% Q# \
; ]+ }8 n! o$ k, L* }1 m
第七节 实验现象
( S6 r/ T) o* Z5 h0 H点击位置倒向,需要修改代码4 N( I) q" v- K; t- x/ I
report_data()中的两个地方 --- 自己做实验了
% g! ?% a/ q+ A: q" c) `, j% i2 W! G# Z E$ |( Y+ ?* d
5 R! v0 z% j0 C* o9 {1 s" i' i* H3 A% N& F& ]' F
; |1 H. x# U8 z0 o
7 ^8 M5 k" H6 L0 p9 Q- r文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
4 m# ^, B9 i3 X3 [ n5 H6 ?; Y
, s, Q: U7 l+ y. O0 m& ]% G
|
|