驱动需要包含 #include & c! B3 @& T. ^; D
0 s0 t2 C% Z) y' i; }
判断一个IO是否合法:int gpio_is_valid(int number);. p, T. c2 m( Z4 b3 J
; \! Y$ N* D+ o, z6 E8 B5 ], n4 ^
设置GPIO的方向,如果是输出同时设置电平:
+ v" t& \: N/ F' R. D* v
# {% _' _2 h s/ b: C8 M+ p0 C /* set as input or output, returning 0 or negative errno */
- o) [+ T! P0 g5 a$ h& b ; |9 g6 H0 U: D4 n9 s
int gpio_direction_input(unsigned gpio);: U* Q$ f, |! g: c5 _
+ A+ N% C6 Q! v) c) W* ], h
int gpio_direction_output(unsigned gpio, int value);
* ]7 @& @3 b) E' r* f8 R* R 1 M: r8 f( M' t$ l/ H1 m
获取输入引脚的电平:4 c+ s2 f0 ^ I( V" v$ P5 p
S$ U! ]: a) c8 d; z$ n; f; y
/* GPIO INPUT: return zero or nonzero */
, N Q4 s P% K5 z( } * ]: ^0 S( \ `0 d g" U3 ^, H2 m; G
int gpio_get_value(unsigned gpio);
+ q2 H3 @1 j! M; p$ o 4 k+ N- ]9 m/ U, @7 R9 o9 j4 W& |
/* GPIO OUTPUT */( k6 O7 E* |/ I1 P% \5 ^
7 z) j3 X% H1 z; h/ H void gpio_set_value(unsigned gpio, int value);; K0 u$ g) G. e) Y$ L) G# Z+ b
! Z5 \% l/ w8 M: @) ~ int gpio_cansleep(unsigned gpio);
7 {; J# u/ z; k1 { : i7 z" H' m' y0 Z- E
To access such GPIOs, a different set of accessors is defined:
8 h: e, n, z0 G% p. b + S! T! u8 Y8 l7 H
/* GPIO INPUT: return zero or nonzero, might sleep */# q1 b6 C" T+ V
' ^2 N# b; {5 U7 H2 e% d+ t int gpio_get_value_cansleep(unsigned gpio);/ G) _! o1 o r! G8 P
- R% ]: x9 s- h- b /* GPIO OUTPUT, might sleep */* z* _8 l0 }7 x
9 L7 `, A: [( B( S' f5 J6 G% P
void gpio_set_value_cansleep(unsigned gpio, int value);获取一个GPIO并声明标签:8 b) V2 c Y) a- [2 ]+ @) }
6 j4 N& P2 _6 t" k% t% a% _ /* request GPIO, returning 0 or negative errno." M2 L% L6 v. e7 F# O+ Q! f
8 e4 z) V7 P0 G2 J3 t% d- `, o
* non-null labels may be useful for diagnostics.
" M7 D7 z& z* I9 D9 p 0 I; R6 [) P' |
*/
. K2 N' a q) h$ A3 t! K / e9 a3 C% K M$ Z2 I
int gpio_request(unsigned gpio, const char *label);
+ @4 B* L- Z, H0 t+ t: q# q( }
Q i! [7 ]. d0 ] /* release previously-claimed GPIO */
$ j6 E) y) z# u& c/ c6 q ! ^! c- j7 A9 W4 p' h2 ]3 a7 j( Y
void gpio_free(unsigned gpio);
8 w/ S! S' {$ ]8 U H
$ h; n* ?) l5 c( K) S( S8 C 将GPIO映射为IRQ中断:$ I( |+ o2 B* G- f; e2 a7 ?
# j @' S: Q* r7 @6 L) L /* map GPIO numbers to IRQ numbers */1 b% ]9 h! \, v2 a) l7 O" g
1 v6 o n9 J7 r' `4 A% \. t, H int gpio_to_irq(unsigned gpio);1 s% L4 D4 z I, I% v+ [
1 @ g2 ~1 c& m% W
/* map IRQ numbers to GPIO numbers (avoid using this) */
$ f1 C$ b5 B9 y4 ` " I( s4 P- j# y
int irq_to_gpio(unsigned irq);
0 T6 U. j9 L+ I: O1 n/ G$ f
* Y& h/ e' t A) o# J5 s 设置GPIO IRQ中断类型:
1 F& j( I6 [* C: \, ]' Z. H
4 }) `' W) U/ E+ A if (!sw->both_edges) {$ x6 X) P! k/ T$ f% S
! c! f, C; T3 x& O! h if (gpio_get_value(sw->gpio))3 `# i: o! c; n1 d
9 `6 P0 s1 `5 A/ q7 a( z1 l set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_FALLING);
7 g, X2 K u- J
+ x! o0 N9 E a) ?" B& G6 v; L else- S4 D; `" D2 A; n% Q- w
3 L/ H2 @% i4 ?5 W$ @; e9 b6 Y
set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_RISING);9 }# `6 N- A& U1 k& p; w
1 T* Z* l. L' z }: R5 ~1 K: |, W# F+ E" K# }( O- b D
6 N1 g3 V j' ~ i! f
在驱动中使用延时函数mdelay,需要包含文件。 |