|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
设备按键驱动实验教程 # W; X2 `6 q' z
, P; M- J6 V8 l. r' X: B! L4 u% ^
q# S" K2 u+ I, n0 B
u( \, t. A& g2 g; Y; i/ M1 f) y0 s2 t# V6 N$ Y! H
第一节 引言 --- 如何看一个 GPIO 按键的电路原理图
& n3 o5 V( c7 T* c# c: C" R2 ^ m3 ~' ~
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 9 页和第 12 页。
* ?8 V0 Y: V) f& D* c 如下第一张图 PMIC_PWRON 引脚在按钮按下前一直保持高电平,按键按下后变成低电平并触发中断休眠/唤醒屏幕。第一张图所示 pmic_pwron 连接的是一个按键电路,第二张图所示 pmic_pwron 连接的是 GPIO0_A2。综上所述,按键可以由 gpio 来实现的。
& ^4 D& l( j9 z3 g6 x& u
+ q/ l" }6 m) w; E6 a, @4 G
# Z, i9 y9 _$ R0 n
2 x- K9 i8 s/ } C+ m+ ?
图1) _. f* m4 V3 y* R# C5 P
. F8 a, G- Z- B7 I$ m3 W) v
第二节 按键配置实例 --- 以 GPIO2_D1 为例,高电平触发上升沿来模拟按键被按下2 A9 R0 @' g, O% V% F$ B' y2 d5 b
" l+ A* K7 }/ H! W# q6 u5 e- l
gpio 引脚通常可以配置成输入和输出功能。作为输入功能,一般在 linux 系统里面是以中断的方式来使用;如果作为输出功能一般主要用来提供一个高低电平信号。本文利用 gpio 的输入功能来模拟一个按键。
: F8 a3 Y" N- O* @5 t/ [" V# Y 本章主要以 GPIO2_D1 为例子讲解,给 GPIO2_D1 一个高电平来触发上升沿产生中断操作并串口打印一条语句。6 A% F f9 K2 f' U9 U* I
( L& I$ P; c) e8 P6 d+ ~
4 u3 S0 E2 m) y( Y 图2
@& |5 n1 q, O& _- I7 ` 图示红框位置表示将要配置的 gpio 在开发板上的位置& W, S, X/ j) e" Y% \
! l, @& s/ ]* O+ f. B/ ~
7 Y0 _7 t0 G% g% A gpio 在电路图中的位置
- O0 Q% p" a. Z& ?* r( d: { 图39 R$ D; g/ ^0 q9 o3 f$ _+ V
6 U1 {8 [7 J0 v2 g
第三节 rk3128 开发板 gpio 在 DTS 中的配置
+ b: j9 \- B# z5 ?+ u( s$ {
P7 X6 t+ c: ?. w rk3128 驱 动 配 置 使 用 的 是 Device Tree 的 方 式 , 所 以 在 kernel 路径 $(dir)\rk3128-source\kernel\arch\ARM\boot\dts 中 rk3128-study.dts 描述了我们整个系统的驱动配置,gpio 的配置如下所示:4 J, ?+ B# q' v2 Y/ D; F
, o. {) s3 s. {9 K. h3 u, ~
# E7 H0 T/ A: p& n! S代码1
5 o- A( Q9 h( }, x5 ^; m1 b( I
) ^! {0 F# d8 K 第四节 实验步骤/ g1 C; z' R5 t& X9 ~& W1 s
* b: `" \4 W" M" `' P! c7 m7 U
1.如何看中断是否注册成功 --- cat /proc/interrupts
+ ~" N6 K$ p ~5 ]6 B+ j+ t 我们注册的中断名字是:gpio_input_test 对应于中断号 1609 f1 e+ ?$ c1 Z% I3 P8 h6 M
) @" S# D8 p+ a0 n b5 C" K
, O; R/ e5 B: y$ ~0 ~8 q
图4
! N9 Z( f+ F0 A" ]: Z 2.kernel 实验步骤2 @! d+ [1 F, k1 M
' l! _9 P0 p" l5 I
. Q" G- M2 S) C0 g- Y" W) D3 p 图5+ A& ?. B' ^+ ?' D D+ F9 M
第五节 实验现象2 i, }5 B7 I6 |3 ]9 I4 u% V, e! B
以一根杜邦线为例,低电平触发中断 G' |6 ^4 o$ q: v) W3 \# e) F3 `
4 P1 W6 W# _4 X% |! J1 w7 I* T
8 d" ]% p; S% Q ~, y& p4 @; m
图6/ b0 I/ p( o5 @+ A8 M; o) ?* t6 `; M
第六节 AD 按键; \, ? k" k) M1 d
' m8 @; z/ [- j# \! R. { 什么是 AD 按键:“AD 检测法实现简单实用的按键”,仅仅需要一个 AD 接口和若干的电阻,就可以实现 1 个,2 个,3 个 多个按键输入。原理就是按键按下的时候,IO 口将检测+ ^6 ]% D; f1 Q2 j( S
到不同的电压值。) {% O! z7 b* k+ K0 `0 I" k8 l
本节第一张图所示三个按键就组成了 AD 按键并对应不同的阻值报告给 cpu,cpu 检测后知道那个键被按下,相应的 driver 配置看$(dir)\rk3128-source\kernel\arch\arm\boot\dts 中rk3128-study.dts 的&adc{ }选项,源代码对应文件是$(dir)\rk3128-source\kernel\drivers\input\keyboard\rk_keys.c
5 e, y1 a6 v6 T" s W 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 9 页。6 o+ M, n) e7 y
; A4 |. `0 q6 x, x+ o
) _( T) u/ q9 O W& ?
图一 AD 按键原理图
5 a9 ]" _0 c& S+ V: V, [9 r6 | 图7& N2 z' C z* G3 {* V7 f7 N% y& q+ e
" v5 a$ T9 P) r9 }
. Y ~0 l# B8 Y2 i( M0 F3 ~
图二 cpu 侧接线图
8 T# n. I& d8 j2 Q6 J: o% ?5 o) d3 L 图8. z3 f8 u& N3 s; H' Y9 W; U
. a; \3 a7 m4 m3 _ 第七节 PMIC_PWRON 休眠/唤醒屏幕
; T- k% @4 X$ n3 D, z3 C7 ?
, ~0 r1 [: m' j: ]7 b 本节主要是继续第一节课的原理图讲解一下屏幕的休眠/唤醒功能(gpio 的一个应用) 相应的 driver 配置看$(dir)\rk3128-source\kernel\arch\arm\boot\dts 中 rk3128-study.dts的&adc{...}选项,源代码对应文件是$(dir)\rk3128-source\kernel\drivers\input\keyboard\rk_keys.c* J7 ]4 i2 b6 V+ f
注意中断响应函数 keys_isr(int irq, void *dev_id),具体的屏幕休眠/唤醒由它来处理。1 [2 H1 f2 \* W& Z) B
; s( q; q4 j- x( f$ h$ c+ B1 x6 w2 q; i' \8 m- f9 h
2 |6 Z9 _; \; h' S) `4 y
4 h8 \$ C3 E9 ]- h N s
文件下载请点击:
4、设备按键驱动实验.pdf
(887.32 KB, 下载次数: 0)
" v* [& @3 S* G# b
7 ^& z" J+ Q* B& {% p+ W! D4 Y8 H4 `# X8 V0 _3 R
0 H. t1 X/ `% [8 Y, o8 x' n |
|