|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程
; z% s G5 A1 S" A$ Y% X
% X# f$ _- G6 P) A# X: K
) m) o* D% i7 N第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c& _" G5 S3 Y: f8 h: I
; A0 w0 F1 x; J9 q% s, x
触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:) d4 _2 H. [+ D/ ~! i4 @ k3 m: ]
1.input dev 的注册,参考 gsl_ts_init_ts()函数;
y! M4 ~: W3 W: `2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。 Y. h1 z8 D; F$ N) ^
" i/ l8 f+ \) [( q/ p! a
0 b- U" y! g4 m: I1 l% K' n S
图14 `# o9 p4 \* U4 U4 u+ F* F, z
. K4 y1 A1 `# b6 c& ^# c/ @6 L第二节 电路原理图介绍
" Y _4 q0 {2 O7 F7 v* C2 `( U7 Z, B% \! g4 S# `- B' t
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。1 k6 q7 H& B' L) t% ` q. t$ @% v
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。( E5 z" p5 l; E) |/ N
c* S; _5 s0 v, ^" A. i. d8 m
2 F& ~# T( S, Z* o+ \图2. e: d' Z( T9 C+ }& F+ j! J
+ Q" ]) v1 ]+ a; |! F3 ]5 K
第三节 TP 驱动代码结构
$ [9 R+ ^/ r5 H" g, m& F: S" G, @$ A% w
$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c, P+ u& ?/ }/ @7 V
--- input device driver @7 U" ^0 [; v2 F4 T$ K
$(dir)\rk3128-source\kernel\drivers\input\evdev.c2 R6 B6 Z9 W9 C L3 C' D- M5 `
--- input event handler
1 `0 [" M, U# D6 C7 z
8 w( w$ T( ^! w% G( n4 |% ]5 H/ X第四节 .config 文件的配置选择' @1 t- r! P) I4 ?) T! a
6 V2 O# c; {% |; A) K6 x
kernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择+ C3 v9 N0 l0 [4 x9 D% x
Device Drivers --->. k; A0 a/ S; _5 O3 y$ Q
Input device support---> 8 @) I4 ~0 N: d; A
Touchscreens --->
* \& r2 j& s. W+ j( d. Y c. l<*> gslX680 touchscreen driver
2 ~4 J6 a. C' T: Z' [" d7 ]
0 F# R5 \" ^* q* Q3 e& W& a( Z选择之后在.config 文件中会有如下项被设置:
! x$ q5 N, A$ MCONFIG_TOUCHSCREEN_GSLX680=y8 m. r- W; Y( t, X9 ]# k1 _. W
' S: O. s5 a8 j7 H3 z2 n! D& U
相应的配置文件目录位于:
* R$ N; ?0 _/ BX:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig
* ]2 \* ~) l2 F9 K( `$ Bconfig TOUCHSCREEN_GSLX6800 I% E8 K6 T+ D6 P' J% f5 B9 W- [
" ^, a7 R/ t( g+ K6 h
tristate "gslX680 touchscreen driver"
% G2 L/ R _+ M7 B$ I6 Dhelp
# O c3 U+ C, }) N$ ~gslX680 touchscreen driver
; _+ T6 y) g$ h. |9 ^) v1 B* F9 n. n2 g, T1 G1 b
8 H: v( [! g" a1 x- C6 o
第五节 实验代码
+ \; P/ R% S; a% C1 z
/ X' [- z: @1 y) C1.dts part:5 J! ^; Z0 n* y) U
% k: z2 ?; o" ^0 S7 C2 B
% Q# w) @- x% b% t6 C: S4 i代码1! f( _: _2 D' ]4 y9 V9 E
2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。
2 T z" p2 H+ U' K/ m. A; d
. V( x3 L6 i4 t) D6 ^' s4 Q
$ m+ v/ p0 A0 d; O" M0 n& g M
/ F# {0 \0 X" b
代码2
2 d* U, w, F& D6 k! l, S# {3.测试命令: d1 _$ W/ w) j# N9 a' H' ]
命令输入路径/sys/class/touchscreen_test
# ]& a1 N2 Y3 k$ n: X关闭触摸功能:
8 A$ V* ]8 c d* x: v" N2 _echo sleep > touchscreen - C1 O1 T6 l9 L' o4 b
echo wake > touchscreen
i' t% ?& u+ T. R镜像触摸屏坐标:9 l- |+ ^: O6 n# n7 A& T
echo mirror > touchscreen 2 }: V% \1 {1 S, l7 `
4.代码调试中遇到问题
6 N7 t+ l5 r2 L0 l: x4 B0 D触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。' {: I' R3 \- l4 f+ F. f/ r
4 w- M* x. G8 m+ O第六节 实验步骤 --- 镜像后的坐标如何调节
- k8 ^' S, J2 u- r& y" g0 B, X' Y' u8 S) d g' v: ]
cd /sys/class/touchscreen_test % ]2 Z& i4 n5 m
echo mirror > touchscreen! P& t( `* Z' Q' E
' L$ t5 x0 r" k( g, i! p, B. G& e! B第七节 实验现象
0 ~5 S: F# b# k5 [! j s点击位置倒向,需要修改代码
" H+ t( \' j% ^0 m. preport_data()中的两个地方 --- 自己做实验了( x. _ o8 ?3 J0 z
) b: [/ E+ E, R8 A% d/ J( E; |) d) e
& B& m; M- s: C* G' v* B
5 R0 L' P: w) ^: ^$ y/ ~
9 Q3 Z$ \' }8 _
) f/ Z- l2 P4 h e, {2 Z. @9 h文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
5 H+ K" n% J9 |4 A. p1 f( y
. [& N: q: o/ F |
|