|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
触摸屏驱动实验教程 : C, Z, j" B# Y+ P( F; X
6 J8 M4 X5 ?- Z$ O& V! r! _: \# j# Z
, r, Y* t$ v% Y6 ^$ p& T0 r0 S& E2 I4 \ U& P7 L+ o/ n' G
5 ]0 M- {& Q( g0 E) `% k3 x; k
第一节 input 输入子系统简单介绍 --- rockchip_gslX680_rk3168.c! X% u7 J7 Y0 ^/ m
4 R1 f/ m7 y6 p% U: G2 i
触摸屏驱动注册到 input 子系统中后要遵循的框架结构如下:
# U' k6 w% c7 k9 K* u' d. \3 w1.input dev 的注册,参考 gsl_ts_init_ts()函数;; o0 c9 j) r F, n" @" ^
2.input 事件的注册,这部分没有明显的调用 input 子系统的 input_register_handler()函数,说明是用的系统缺省注册的 handler,即 evdev --- 一个原始的(raw)输入设备事件。
: F7 Z; _; v: `3 m2 g$ z* y, M) g* h- j: @. N; ?1 B* j
5 g$ ]7 h9 H+ ~6 R9 f
图1& W7 F# ^# s$ I7 K4 ~4 A2 \" V2 P
7 W9 A% F8 j7 h5 F( c3 @) i
第二节 电路原理图介绍
% L- H h3 r: c% L0 z1 D# M' q& ?! ~2 C4 E9 x: E
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 19 页。2 f4 |. D: f3 r, U5 x: z1 F
如下图可以确定 TP 是通过 I2c 与 cpu 相互通信的,cpu 作为主设备,TP 作为从设备。TOUCH_INT 是用中断的形式用作告诉 cpu 已经有触摸产生,cpu 可以从 I2c 接口读数据了。TOUCH_RST 是用作触摸的休眠/唤醒。$ x+ F# W) _6 ]8 s/ i
; Y. b( t8 H- ?+ p) i" h; X
( A$ s) F. o4 `4 T* d, z( a8 Y- O图2
" M/ c6 N# V7 c1 r! N& w
. Y. B+ E% W4 p! a5 g. j第三节 TP 驱动代码结构/ J" E( E- Y/ I* S8 i
' `% [( u. T3 v& w, b! S) B+ r$(dir)\rk3128-source\kernel\drivers\input\touchscreen\rockchip_gslX680_rk3128.c6 X; x+ e& C* M3 R9 L: w
--- input device driver
) q0 R, D. l) ]$(dir)\rk3128-source\kernel\drivers\input\evdev.c! u: b( [- a8 A( P' M0 }5 [! p
--- input event handler
) B5 v0 d' H. Q1 Q
7 i7 N [8 h, H第四节 .config 文件的配置选择
$ L( H3 O9 a; C; i( ~( |
7 n. U9 x: g3 W+ e5 R% `$ Vkernel 目录中输入 make ARCH=ARM menuconfig 然后按下列步骤选择7 \9 J5 x- _- B9 ^ V+ j# J8 H
Device Drivers --->
' c( _# `8 ]* N! JInput device support--->
Y* f% w. j) [7 K4 S& q( E( nTouchscreens --->
+ E2 a2 A) Q' ~3 u0 x2 G<*> gslX680 touchscreen driver
T+ b+ D, |. d& d
: }* I) b- y# j+ v* F/ I+ O2 o! O选择之后在.config 文件中会有如下项被设置:
( k& k7 }) A+ h: G3 t6 t3 L! ?( CCONFIG_TOUCHSCREEN_GSLX680=y
& |8 @- \8 ]2 W# K$ U k- a
+ k# ?) k2 p" `相应的配置文件目录位于:
* P( _; i3 `# \9 jX:\rk3128-study\rk3128-source\kernel\drivers\input\touchscreen\Kconfig
8 a* n1 k5 C" Y" \7 A; Fconfig TOUCHSCREEN_GSLX680! d$ F: M1 r& O& d7 c. n' ?
- `1 R6 i4 O8 |9 V# H, @ etristate "gslX680 touchscreen driver" 6 C4 I. B( [& T5 V& X1 L
help
Q6 _3 M. V) k! ugslX680 touchscreen driver
- k+ z( U6 K! R4 f% {* |2 t
) C& ], d' T! `' S
" h5 @* [8 D' e8 m. b第五节 实验代码
2 ?1 T& _' a* |$ n
5 k5 W+ s, t& ^# ]( G. e1.dts part:
: ]; }& d/ I+ j+ F* Y2 u$ r& P9 q* R! R, k6 [" C' f& w* j' T) Q5 t
4 N. h. D2 r! l0 e代码1
; H L6 t( ^0 _2 B" `2.增加一个可以动态测试的函数到驱动中,用户可以通过 adb shell 或者串口去输入数据完成触摸屏功能测试。4 q; O, [. w% K# F/ R! u- c8 F
& t' U4 C% c# V0 d
8 X5 X6 w: ?5 b% {8 O ?/ O+ w
- w1 o/ s- b" O" C+ C2 m+ V
代码2) M; X; _: c- `. u" _
3.测试命令- y7 ?0 w. n: j. p) F t& @
命令输入路径/sys/class/touchscreen_test
6 [: {" a( O/ \6 c: G' ~关闭触摸功能:
/ y% I' f. Q4 k* u( \echo sleep > touchscreen 2 j" d: i: d6 c- ~5 o7 x
echo wake > touchscreen
1 f, K6 ^3 [5 v: @ @8 P镜像触摸屏坐标: y# D6 y( t* [0 a$ { x( c5 [! i
echo mirror > touchscreen
0 M/ z1 m% L$ P& v0 B# l) C- J4.代码调试中遇到问题
* I5 t2 r1 H/ ?! R0 } X; Q1 r触摸挂上去后没有反应:a.中断产生了吗?可以通过在中断响应函数中增加调试信 息;b.I2c 通信正常吗?这个可能要接个示波器或 usb 逻辑分析仪去看波形是否正常。
) W4 A7 O/ l: W& n! K6 @
9 \; [ X$ {% G/ }第六节 实验步骤 --- 镜像后的坐标如何调节8 u- }" g) O8 h B
, R- a( r' b( f$ o0 P( x
cd /sys/class/touchscreen_test : o8 e+ f) u- Q0 h( \- y- _9 v5 m
echo mirror > touchscreen$ C$ p& q1 P. D
9 T. g1 Y" [$ Q$ J! `1 g
第七节 实验现象
) q% U4 P& A8 x" b) X$ K点击位置倒向,需要修改代码
# z$ }+ K" N. H o! Ureport_data()中的两个地方 --- 自己做实验了
, O; I* Q% f' E# X' e! }8 `7 R2 @
; s, L9 F5 B2 ?7 O% H7 @) X q" d3 k/ j+ H
7 _: b2 N! F; d6 d6 K" [
! P8 y; |+ e$ o' F" y文件下载请点击:
5、触摸屏驱动实验.pdf
(446.7 KB, 下载次数: 0)
+ |2 x( B. z$ @/ R; u
. W+ E; O7 W+ @: D3 E5 N' N/ g; V |
|