|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
+ `% O- c3 x2 T6 X- l#include <linux/init.h>
" h' \7 T9 l5 e9 b2 X: _% w3 \: F#include <linux/module.h>
8 p( B7 `% ~& k+ e; Z- y0 M& [#include <linux/kernel.h>3 l" |4 ?) }. M; _9 T2 b
#include <linux/types.h>
& x% K ]: `9 W/ l3 j#include <linux/gpio.h>
# F( w0 x" _3 y0 Z#include <linux/leds.h>
% Z* Y7 c7 W; H. H#include <linux/platform_device.h>
2 g. X1 @' m7 c5 B; C6 c' P4 P$ D- U1 m5 N/ ^8 X6 k& \& N
#include <asm/mach-types.h>% U" h0 C# R h/ m- t* W
#include <asm/mach/arch.h>
# t. e# n0 F7 J( f1 |% V; n9 V#include <mach/da8xx.h>9 D. D6 q$ g. m5 }$ B' L: G. d b
#include <mach/mux.h>. S/ _; |. t2 X4 w1 {* f. i, z
. [) c7 k* [0 A" ?8 Q% R
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( P. O0 E* U z8 ]1 d#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
0 [1 s- }3 x1 C( w4 M1 h#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! N, X$ [: S6 Z& M4 S
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# w0 b" c0 e2 [, `! j
4 k% v3 V* X$ b
/* assign the tl som board LED-GPIOs*/+ K! z2 q5 T2 k
static const short da850_evm_tl_user_led_pins[] = {9 G5 o5 T4 S3 j+ i5 R
/* These pins are definition at <mach/mux.h> file */3 ?: z+ N& a! p. Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
. X" b6 q% _$ T: `6 E; I0 [ -1
# ?) w1 P; s- v7 p) o' F2 J5 R9 P};. s% v8 P# Q/ G+ ?
- m3 c3 w3 k1 I! o' D( G% Ystatic struct gpio_led da850_evm_tl_leds[] = {$ ~4 m7 n* a/ G3 H, l6 A
{# M! q% Q4 K. C/ k% _
.active_low = 0,
% w6 U4 O# W9 ]2 q7 u .gpio = DA850_USER_LED0,' P- z- Y, Z% _& }3 [
.name = "user_led0",
4 J) C- r+ l- x! l; H% D+ c6 f .default_trigger = "default-on",
- Q2 {5 M0 z7 I1 g% U6 \ },
9 u. ?5 ~* r/ K' [: x {5 m0 u9 C: H1 I e$ J* e
.active_low = 0,
! d/ P1 j% k4 e* V- u! V+ y: s .gpio = DA850_USER_LED1,
9 b$ r K1 x) Y) [4 e. _ .name = "user_led1",
: Z% I1 h A" |/ Q/ a- t .default_trigger = "default-on",
/ y, y- p4 z6 f8 { o% l A },
8 z) L: K: Y4 ?; ?# M {* x* J. D- @- r* s& z9 R' d6 j1 g
.active_low = 0,
9 `, _, B* j C6 U .gpio = DA850_USER_LED2,
6 ]) t A+ M d1 Y4 h4 J. i .name = "user_led2",8 b: L% s* A. r# r# o
.default_trigger = "default-on",
! g/ G) C3 v% R9 Q$ Z' H },
% X. w% k# N6 h/ a9 O {
& i5 c2 p+ O. ~% Q; J! n+ V/ N .active_low = 0,3 x# V% ?* S" P$ H0 {- L# w
.gpio = DA850_USER_LED3,
7 S8 z, ` R2 {5 o/ B .name = "user_led3",, g E1 j7 B* d! R7 ]
.default_trigger = "default-on",/ [! m4 m) T1 o- [& O7 r e
},- B, t0 ~. _! K' V+ p# E
};
. p5 x# B) X9 @) t3 D) ~5 r
0 m2 q3 P- b. z' w. o5 `3 l! fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
2 V- D' T6 S- d y- n2 e .leds = da850_evm_tl_leds,
2 T1 I6 j2 g) q% { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
! V+ C( |8 E+ H5 D1 c};
8 c/ L4 A' r! P- I6 K0 t2 K3 i, O, A2 v& J' B8 y
static void led_dev_release(struct device *dev)
4 T. y8 p" r& j# E) L& S{* \' Z1 z, o# R! Z+ W/ U
};
# Q' h: X. ~" b; J) p) P1 s& v- X% { h! Y' v4 }, m7 V
static struct platform_device da850_evm_tl_leds_device = {
( v( a& ?* p% c& n# C6 H4 l) c .name = "leds-gpio",6 o3 O( w) U `/ X
.id = 1,
$ F \$ J3 z1 C/ b4 C& m1 s8 | .dev = {# _& }/ }' k' @6 \6 ~5 s. I
.platform_data = &da850_evm_tl_leds_pdata,
' U: x# V( R# p l# Q5 Y .release = led_dev_release,# @& c& }9 |+ m; } g
}7 q! n+ g* ~8 W: j0 I+ h. J0 ^
};
/ c; Z [/ {( r
1 u/ J8 Z4 B. h6 Q0 P* astatic int __init led_platform_init(void)
8 J7 B5 }; j- s6 ^7 i# o# K{5 W1 j* P! J) F4 M f9 f( |, Z
int ret;
8 l. S: K9 T6 R- ^: N. s6 \; Y#if 0" }- J: E! z7 b# J
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
) E/ U$ z0 \4 P, E if (ret)0 i- g# @, I* {5 }! X: S4 l2 z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ U' s; V. C: w, w: ?9 b: s; G- n "%d\n", ret);0 X: ?$ o0 r$ h+ c C
#endif
0 h. C9 R* f1 y. j ret = platform_device_register(&da850_evm_tl_leds_device);0 Q! ?/ h/ c, X
if (ret)/ Z% J) Z: |. `. Z' s
pr_warning("Could not register som GPIO expander LEDS");; O2 B+ J1 a. v6 f9 O" n- J
else
2 |( e7 ~4 E/ Z" q" H% Z3 l printk(KERN_INFO "LED register sucessful!\n");; T1 F+ U B7 @9 x5 X8 M" y8 D+ _. ~6 E. W
+ Z x& w! u' m; m return ret;8 A; W+ r" I/ L- d6 m9 U+ d/ f( s
}
Y6 R$ x( G c- c% q& D
+ Q& H2 _! Z) V" Ustatic void __exit led_platform_exit(void)
# W4 v9 h* t0 C. m9 r{: z' ]# c: W; U: A% l$ B5 L' t
platform_device_unregister(&da850_evm_tl_leds_device);$ g/ ]7 o; O) L+ O
3 g: p8 E- Z! v2 K! b+ |
printk(KERN_INFO "LED unregister!\n");3 ~9 m, p# _ `# q2 s- z
} w+ M. @1 M* n4 G9 j" }
7 ^% w3 ^4 V3 T+ _module_init(led_platform_init);
% u: x! j2 H. f7 K& h5 `) Xmodule_exit(led_platform_exit);$ z! K( Q% C7 F1 _5 J
6 Y7 D/ O8 d5 Z# f% J' I0 F! @+ D$ U
MODULE_DESCRIPTION("Led platform driver");
i% C# K, U2 ~3 KMODULE_AUTHOR("Tronlong");4 s ~! ^- Y. @; q5 s7 S
MODULE_LICENSE("GPL");* Z0 Y" g: \2 H4 g4 I" @
) j+ Q/ B Y( z0 [+ I1 q% w4 D |
|