|
|
求大神给下面的程序做注解,请稍详细些,谢谢。& F, C1 `8 _" C' w' n8 G
#include <linux/init.h>
0 S& r, G1 e2 I, c H#include <linux/module.h>' E. ]* J, _( h' P6 R8 a& H% C
#include <linux/kernel.h>0 v3 b5 f* C& A4 v+ P+ u
#include <linux/types.h>+ ?5 a+ W2 k# n7 O+ B% } Q6 h
#include <linux/gpio.h>- m( l) O. X, c4 r/ R
#include <linux/leds.h>! {" s3 K4 p- }9 d5 L' Y- q0 B/ L
#include <linux/platform_device.h>1 u( ~' n% ^0 ^4 j! q& t; e
! a# W: {0 o0 `; {+ _
#include <asm/mach-types.h>4 S4 ]" w0 Y1 i2 J1 O9 O
#include <asm/mach/arch.h>
1 a' L: W5 T- C* q8 Z! _8 c#include <mach/da8xx.h>
6 y; c/ {2 s) P' `& [6 b. n#include <mach/mux.h>4 A. b* a+ [# V: P+ h7 H' a! j3 }
" L. p1 E! S/ F7 {#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
2 ~& E- }# _% k* l4 R#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)" S$ ]% s+ H7 n4 A( R) v5 `4 B
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 a4 s: r1 U4 m) K. C' w" c2 g9 K
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)% ]1 w" d3 x+ H' G% v
% ?7 [* Z! G4 Z+ r: B3 c& p5 @: ~" S
/* assign the tl som board LED-GPIOs*/$ u) j3 b# T H& J$ E
static const short da850_evm_tl_user_led_pins[] = {
$ k( O9 B' d- Y. M; z2 ^ /* These pins are definition at <mach/mux.h> file *// l* @$ _4 f! U
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! R; u% @8 j+ f! a& V0 J
-19 M: d7 y, G# A9 T
};% R7 L5 q$ S1 w- d! e1 h1 @
$ T0 e" Q# z- R) ~. Wstatic struct gpio_led da850_evm_tl_leds[] = {: L! K5 o% J/ W; F& P; m( z' h
{; i+ }+ U# H+ B3 E( }3 ^
.active_low = 0,! a F1 u. L; a. y- b& S
.gpio = DA850_USER_LED0,
1 H% K8 X5 V/ _6 w) g0 I8 ~( Q .name = "user_led0",
# y. N7 z9 |9 E( U0 u .default_trigger = "default-on",
; m5 {! \6 K( Z2 P }, S& P# y2 o) ]+ ~ M$ {" ?
{) g' X1 [; J! o* X$ J
.active_low = 0,
% m/ J' ^' q6 `! }4 V6 d N .gpio = DA850_USER_LED1,) p8 J; y1 l0 B! E4 }' X% n) d
.name = "user_led1",
9 N, m# L5 v C .default_trigger = "default-on",
# |, a2 l6 b1 Q% F },
0 X' c7 h5 c) ?# D. i+ x {
v; {: W. D) B; k. C. x6 [( M .active_low = 0,
9 v' p' ?5 n+ l9 D" o0 ] .gpio = DA850_USER_LED2,% S. t; h& Y* o( H0 i
.name = "user_led2",
2 }# P5 c7 d3 q6 ` .default_trigger = "default-on",
' E* q& q0 k: v; L2 s( t2 v' u) e },
* n+ y( K( P2 j0 Y' I' k {
5 X$ X" }/ L3 f p% B1 K3 J! b .active_low = 0,
1 ]5 _7 D4 ^ X: j) z! P6 w9 _" T h .gpio = DA850_USER_LED3,
8 S5 L: {0 C5 _4 z. a' ]& L! L .name = "user_led3",' R; _, V7 J; _ ]- }, | K4 T
.default_trigger = "default-on",4 g# v' z. o7 R& D) a. \; p' @
},
0 A( n& C' J2 U" i};
1 w6 w! l+ r8 ~" ], x$ C6 m- Q( y& x& ?6 M
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( r6 a- u9 O# _5 C, K1 B: G
.leds = da850_evm_tl_leds,
9 d) P7 ?9 t4 K R0 s' ^; P .num_leds = ARRAY_SIZE(da850_evm_tl_leds),/ v, E5 e x A9 S( t0 _# s5 |
};
Y( G# q* x/ `& K2 v, {6 c5 C$ A& M) x
static void led_dev_release(struct device *dev)
" {% Y; \2 \+ S{
R+ z6 F N0 l' e};
0 H4 q. f( k6 R: M7 i+ ~5 K6 V/ _
* J2 g6 v9 e9 Q: N8 ~static struct platform_device da850_evm_tl_leds_device = {
4 |9 W3 q; X( V) C5 t .name = "leds-gpio",( P2 z$ M: G4 |& S0 a8 {
.id = 1,
- z/ n r5 Q+ G, h .dev = {
3 t9 _4 V- A0 z. q .platform_data = &da850_evm_tl_leds_pdata,5 v5 [0 v O/ Z: D; t
.release = led_dev_release,
: G2 p- V* R* m [1 p) O5 H }: t) \8 S& I' w- U X3 j5 @
};
7 W9 [# \, O* u# w' f7 e {
7 M! W# I! c& O* hstatic int __init led_platform_init(void)
* F" [7 [- a$ \! c, b{
4 \, T! E+ u/ B- l1 @. X int ret;5 d5 `7 j; Z5 n2 ]% _' ?, T! k! R
#if 0
* y5 X' Q, G3 ~4 B4 C0 ^9 D* }( i ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
$ {- Q( X; c/ t if (ret)4 m- j2 z( t( X# L3 Z6 X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"& d5 B. x3 z+ j3 s- ]6 g
"%d\n", ret);
+ C1 P9 Q0 O3 p M. s% u& Q; i#endif
6 L7 j1 C: Y& F3 S ret = platform_device_register(&da850_evm_tl_leds_device);
$ j3 B4 o- X& G& p if (ret)
- G. E" R' B: z0 W pr_warning("Could not register som GPIO expander LEDS");
; ^) i m" z, M2 F& K: {6 W3 U else% O( I: N5 O; j7 Y# o3 W
printk(KERN_INFO "LED register sucessful!\n");7 r( ^' p" Y \/ ]* q) ]- b
2 l8 c; h( f9 H8 n& S
return ret;
& N0 h6 I b% |6 G/ d}
; m, `9 k, @! O* \0 m4 G4 h: b
* Z! g; Y6 Z, Z5 Bstatic void __exit led_platform_exit(void)# ] Y7 V7 g3 q' e6 O. e* |
{/ n/ N9 T) G+ O8 n+ O" E) u
platform_device_unregister(&da850_evm_tl_leds_device);
4 r9 T# T1 ^9 M+ S- \1 l1 F* [% j% t, U9 G2 D7 V; b h1 J( F
printk(KERN_INFO "LED unregister!\n");: W5 y. c+ }7 N
}
& k' B5 |1 P* I- V+ _: C5 ~6 n/ Z2 l5 B9 v$ D& @& g
module_init(led_platform_init);" I K/ ~/ q$ Q d$ i) N
module_exit(led_platform_exit);& d* c4 L7 i" H0 U% K1 U
8 ]0 C, ?, ]) _
MODULE_DESCRIPTION("Led platform driver");
6 o' B V: s8 _1 z& Q# p/ DMODULE_AUTHOR("Tronlong");
; S- \ \1 h9 ]: O$ e8 ]3 m( T( sMODULE_LICENSE("GPL");/ [( ?6 ^% O4 L5 T4 G8 f8 l. _8 W
' i* I# M& g' t. H- ^; }( A) k9 U |
|