|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程 # ], \4 ]0 j( n9 k o/ K. b
: P) d4 G- K( q) Z
/ }& l3 s/ w# w4 }9 y4 {% I5 y7 C
( H" O; V. ~/ {( O7 R& r3 Y# m. I. h$ E' |7 R
第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c4 L! j' n* E) K
" g x# u' j7 p$ P触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:3 \ S0 ? q( K+ c( S
1.input dev 的注册,参考 gsl_ts_init_ts()函数;7 C/ L$ F$ v" \, o s/ ~
2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。
5 C1 g- m3 X9 B5 G7 [& I/ h
/ X8 y: B' Z8 }( H+ o
& y/ {% a" V1 k1 S" N) m6 \4 m* S
图1- Q! N! Y, k# ^( A
" ?2 I. f, U0 f0 t+ H
第二节 电路原理图介绍' e6 S" F7 Z) X1 ^
% m/ J" I8 [3 E( s. U# E
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。 {3 [1 n& j. E$ H& i& G
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。, T. x9 x8 |1 C
* A3 H0 ]8 O" b. Z$ ?
! F( d# k! j7 g; A d+ B9 X图2. e) m: V! K9 Z% V* e# N" Y
* |0 P9 j, X. @0 S& L7 u; B第三节 TP 驱动代码结构
) N0 v: v+ k& d0 v8 A% @% f9 _" k& n& Y. x& ^) i0 |3 j/ ?# l
$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c
3 A7 M+ @* ^' N--- input device driver
: i- I {4 j' N2 T# a0 n$(dir)\rk3128-source\kernel\drivers\input\evdev.c
3 ~9 O. o% h9 n--- input event handler
[# I; r+ x; @$ |. M& k) C& E. k3 ]# f( W% G: U
第四节 .config 文件的配置选择
% h- B [7 v2 h( h( Q% \; _
# \# t& q5 Q5 b t, q9 ^kernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择* o. `: F9 S# T3 \/ U
Device Drivers --->- O4 J. `+ R/ \# e' B8 f5 N/ F$ u1 q( _
Input device support---> * e' o& N( ?6 L A0 a
Touchscreens --->0 s% R7 F( i: O7 P/ k
<*> gslX680 touchscreen driver
' k6 w' e9 A- y* C/ {& }7 G, f; D# v" r
选择之后在.config 文件中会有如下项被设置:8 p' ^" K3 ^3 l) b% Y( q
CONFIG_TOUCHSCREEN_GSLX680=y
" s4 n7 Y3 c; j2 C
* x2 C1 G) W5 J. g" M相应的配置文件目录位于:
+ O2 @3 M# B+ u9 A* R6 r! iX:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig
; c$ Y$ p* c0 ]# kconfig TOUCHSCREEN_GSLX680
6 K# A; s, ~/ D; {) ?
1 W1 T& N3 K6 |6 C! K! F t0 X, rtristate "gslX680 touchscreen driver" . ?& m& U! Q- z# Q6 h$ ^; y) X0 Z. C# F9 a
help c6 i6 P2 n. F* @5 w+ Q& Q6 i
gslX680 touchscreen driver
9 m% i: C2 }, z2 }. h% Q* v. A( k1 ~) I- N4 f7 @) _- Z
8 w% k2 s0 \" T" D# g% X4 l' z
第五节 实验代码
$ d, W4 a! B. S! q! Y- @, H; w; p
1.dts part:
. V, V% {6 o8 G) T6 D+ s$ X7 I' A/ G0 g: y/ J2 }% Q$ F- |
. D0 y0 O k8 E% q代码1
1 B6 h, g4 H1 U! E* y9 N" R2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。8 R8 e( ~0 v: ?- K9 Q7 d' s
+ v1 A/ ]3 G$ G1 D# t3 A* B
. z* h, h: f7 K
( R4 @7 a+ L& n% F) t
代码29 N1 F, z) X$ s E7 ?8 Y, T: C
3.测试命令/ M0 J4 V: Q" f0 `
命令输入路径/sys/class/touchscreen_test V5 R- f& f; b' U; s. S/ @
关闭触摸功能:
& h t( \4 q1 \- M1 n1 ?( gecho sleep > touchscreen . L$ s2 O7 H5 R& s1 [
echo wake > touchscreen
: Q# p6 {- u M+ l) W镜像触摸屏坐标: P5 ` m; j% e% N- S# i
echo mirror > touchscreen
4 w/ L/ `6 T5 S4.代码调试中遇到问题
% b$ A6 V, u4 q. h触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。
8 {% [7 e3 D8 v& L% y G# ?* J
" F7 K0 M3 w, J' [- a第六节 实验步骤 --- 镜像后的坐标如何调节6 H" `7 y9 ]* N5 w7 b
; }% i; t% Z7 k
cd /sys/class/touchscreen_test " N( O" h8 `4 l& H& |1 g* X- c
echo mirror > touchscreen; S) t* \9 b+ d
- F% r3 l- [: y1 Y
第七节 实验现象0 V6 P; M3 @( }( _& s: F
点击位置倒向,需要修改代码
! w7 t+ b. j, e& d' ]5 Q$ R6 [report_data()中的两个地方 --- 自己做实验了( w. V5 Y, n+ m8 J' P
) p7 z3 l5 b' j8 o* d1 s
7 |, R7 v1 \9 D1 Z0 R& X0 @
) w1 N% k/ H G7 a5 T/ P7 P4 N' Q( ~. M1 @
3 \/ `9 L' k6 p& j( l
文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
" T8 s$ |8 q+ F0 C4 f. g* A M+ F
# H% Z8 z8 R& Y: r& l% k1 ]7 ^
|
|