|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程
0 x" E8 p0 {, |9 t+ E+ B0 _: e$ p/ @( g! l
9 Q* N. I' A$ s" S' m! D/ b/ [
第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c; |4 ^* f2 ~) l; Y& e. _
& G3 ^3 i; ~& z* p% h" |触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:
; N% l& s M3 A# n2 V" W1 b1.input dev 的注册,参考 gsl_ts_init_ts()函数;
' H. C: d: p! \) {% S2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。2 n7 A2 A4 n4 w, Q& ~5 p. d
! B' ]; |7 c& I, `9 x- h; P l1 E
[+ t% {2 r3 e$ P
图1. y V" P5 e9 \
+ U- b; M2 Q) |9 e8 a- k第二节 电路原理图介绍2 }+ ~+ A8 F. I. @% r. x! ^
/ Q! e3 Y) N1 E {& c6 v) q% i下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。% L {3 W2 r, I' X
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。* ^8 Z3 N( T. x% N3 j0 g4 z- J+ Y
1 b3 F6 k! C+ \/ }. c
4 M. U- T' A- P) Z
图2
! X* X; G" h0 N% ^' f8 e }2 U* f0 H* n% Z5 _
第三节 TP 驱动代码结构) I% ]2 r% u7 Q& V( e
% j& y E1 M% U: Z3 I; P9 \# W/ U
$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c3 w9 F# b5 n- m& S- s
--- input device driver& E+ ~7 A9 I* t' Z. v' V! S
$(dir)\rk3128-source\kernel\drivers\input\evdev.c
7 m: Q+ V& b0 B' {% a3 v, K3 q--- input event handler5 H7 w- u+ S7 y+ W* g0 E0 T1 T
5 t7 S: v9 b; o9 f4 ]5 i
第四节 .config 文件的配置选择
$ D5 }8 C9 Z* x6 B3 Z5 Q5 p# }. A+ B3 j3 _' a I6 b1 X2 Z3 z5 S
kernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择
q# c+ q# W3 f- K! j/ NDevice Drivers --->" a, g: _; u0 R( c* O* k7 V) b7 w
Input device support--->
0 v7 q$ Q- I1 V1 }# BTouchscreens --->
. F0 E7 Y) x: U% b: e6 ~<*> gslX680 touchscreen driver* k+ f) c( k8 m3 j) b/ ?- c7 e
6 h; v2 S: e) z; r( E! b3 ~选择之后在.config 文件中会有如下项被设置:
& w! p5 m4 }# e1 F* d" u! h1 f* ]CONFIG_TOUCHSCREEN_GSLX680=y
. @" X8 Z; [+ x( Q; r1 t
$ e+ ], h5 G0 T7 K# k6 M7 t相应的配置文件目录位于:
8 r& l% k# n8 W% tX:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig
0 F3 V# \ h% p. I+ Xconfig TOUCHSCREEN_GSLX680$ o8 {+ U7 M( {: z1 K; A3 w' R
% t9 _, S" ^1 J$ R8 J$ Jtristate "gslX680 touchscreen driver" # d% x6 ]0 K/ E% |- L- V; @
help
: z4 D2 _8 i0 w3 sgslX680 touchscreen driver
; a- h7 K7 k3 a, L+ B1 P; ^+ c! }9 K/ g. g+ B; \7 ]
% J" t+ r( ]+ B; n6 l W* E第五节 实验代码
' D! }: y; k: J+ F3 |; T! y2 _/ A, m2 F- I s
1.dts part:
1 H$ }/ v0 |2 t! `4 p+ a
/ B; h! ]) I0 v# x+ K
1 k/ M+ i" L9 ^% d6 Q! m9 O
代码1$ T" L9 I* S5 E5 `: p! w4 w, v. T
2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。 q$ p+ \2 w2 y, u2 O
1 S1 y) O& x& b: Z
4 A# i0 w% Q5 d" I
* o' O, `4 @4 v3 X
代码2
( [/ w2 O- i8 ]7 Y6 ^3.测试命令
0 G1 P3 E4 T9 q5 z( C$ B命令输入路径/sys/class/touchscreen_test
) U# E" }5 y% ?7 ?7 O. _3 X关闭触摸功能:
P+ W$ @0 o/ D* K0 g0 e; cecho sleep > touchscreen
# Q/ g+ l5 l& y, W6 f% d- {4 m( xecho wake > touchscreen
: F/ Y) a4 _& k4 L2 @( `! Q0 t9 E镜像触摸屏坐标:
2 v) q0 E8 N: k V; R! ^echo mirror > touchscreen
6 r Z5 Y9 u# ]1 a- W H- |4.代码调试中遇到问题# ^4 h, B; E* B6 [
触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。1 H: a/ p. U+ N8 f* C0 w4 w5 F
; ~$ C9 F& ^; o
第六节 实验步骤 --- 镜像后的坐标如何调节
" O6 h2 k! z% S1 G3 G- W M" J/ K
$ K7 Z3 f1 R9 r% S- r: O. Xcd /sys/class/touchscreen_test
9 b/ [% c' s1 ~3 aecho mirror > touchscreen
% S: \7 q1 x* a6 h4 Q. {, C
8 f1 U( Z) c* A9 d! Z" r第七节 实验现象
g6 c$ r$ F0 A2 q! x: E- u0 R点击位置倒向,需要修改代码' y) S! s) p9 C) x: h7 K
report_data()中的两个地方 --- 自己做实验了9 Z. K* J% K! C
; w- _$ S; p# [- |- E R$ I) ?5 d
' t5 S' W4 N a/ f
9 V; M3 ?0 x `7 J
2 M" B) q! y/ K, ^
) r8 B9 A0 R2 w. ]2 e8 w( \文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
" h, q- f0 W$ O; v: [! C
4 g. \! n* H+ j# f! f( u( M2 q |
|