|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; t: ]% c- }3 t( @1 c6 q
#include <linux/init.h>
" t* `& b! w. ]" p3 c#include <linux/module.h>
: }0 o, ]! a# ?* S. \" Q3 w#include <linux/kernel.h>2 f( p$ H v0 W: i z/ I! U8 E. x! l
#include <linux/types.h>" {& J7 K) \# |/ c( r. V" ?7 i
#include <linux/gpio.h>! E( Z- p! {! m. m8 ?: S- K
#include <linux/leds.h>( I! N' s3 \6 G' e+ Z' ~* I+ N0 I
#include <linux/platform_device.h>
3 d8 X4 }% U4 X! U8 y* x# V( c* Q: Z' V5 f. I2 q6 M* W# ?0 B0 r
#include <asm/mach-types.h>
. c2 K% N% L# X. |! z0 g#include <asm/mach/arch.h>
# S. u0 {0 ~- N6 p$ w0 A0 R#include <mach/da8xx.h>
3 s$ w. Y: _3 b7 A+ Z9 k#include <mach/mux.h>
8 |3 ^$ T: L- J, v, q$ x( f" _& l. Z- s7 D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)1 N; R/ S3 q# S; W
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)8 ?) ^+ q/ ~5 S5 d! E2 g7 J
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
& I$ v! K& ?' y0 K7 ~#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)8 O% z4 [0 O3 |! _: [% L( @3 m) ~
. w+ m& y- V0 s* R" ]* m
/* assign the tl som board LED-GPIOs*/
3 t5 J* ]# u1 p) u) r" |static const short da850_evm_tl_user_led_pins[] = {6 Y B2 H, A4 I* x
/* These pins are definition at <mach/mux.h> file */
9 _0 [; M1 X0 t$ } DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,1 g$ \; H4 Z0 Y" `6 I! K; }3 K O
-1 s7 O$ N* H0 H/ u
};
3 a0 x/ Y d9 i- F; n$ D4 R6 i' ^7 t8 Y
static struct gpio_led da850_evm_tl_leds[] = {& ^1 X+ y8 m6 v% g
{
$ k, u6 Z5 B: q0 _% J& v. { .active_low = 0,' Z) F$ G; ~5 F1 l- [ L) Q
.gpio = DA850_USER_LED0,
: ]7 Y. F$ v4 m% \( ^; B .name = "user_led0",
) y8 ]; I, M" x e+ @' t& M .default_trigger = "default-on",
# P* `7 {' K# T6 d+ a4 r& a },$ F* u6 ]7 W1 P0 D; C2 \9 D- W
{2 }9 |- j# r, V6 o9 X% y
.active_low = 0,
/ R) E5 x9 F8 D, C .gpio = DA850_USER_LED1,( f, V# E% S+ }9 E0 \ g7 s1 \
.name = "user_led1",1 K* J* I/ g+ @+ R! R
.default_trigger = "default-on",
" H0 T3 u, P$ h: F( f },- j4 V' j- j. D% I. I8 O& g
{" I+ r* H+ T/ G3 R! m6 h+ y' j
.active_low = 0,
& H7 k, o5 e x. m. d- D7 O .gpio = DA850_USER_LED2,# g3 o: Z' G j0 X# p7 B
.name = "user_led2",) C1 _4 Z: l' w3 K
.default_trigger = "default-on",
+ ?4 x. n* C. w6 q$ s! v },
8 K! x9 ]# d4 O" A. { {
5 M- s9 b! R& t3 e( }) @" r( s .active_low = 0,& s1 Z+ ?& N' c) Z3 N* ?+ F: p$ [8 C
.gpio = DA850_USER_LED3,
# L5 @" M! r0 w& a" s3 a .name = "user_led3",
7 I. w Y; C+ V3 R1 B; q .default_trigger = "default-on",& _5 X7 u1 F' {: Y2 @8 f0 c
},8 Y ^7 c) H' h3 ^
};
: K1 [! \/ v% f7 {
& y5 Q. U5 {, y5 y1 G7 Jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, Z, u5 h+ n& o; R .leds = da850_evm_tl_leds,$ ~9 d5 O! u$ a$ ~2 S; Q2 ~
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),; k+ C- M" E* D5 {) V' V' \
};5 e1 E- v5 y. k3 c, d. s. c- m6 J
$ K' t$ }$ O1 v T! U$ c; N! Hstatic void led_dev_release(struct device *dev)0 B: {5 _, d$ _: I- r% j+ K5 ^
{
R5 u7 E. B8 F6 Q9 w Z};1 f! P" _0 W, Q$ _! j! Q
0 Q2 D4 W1 t. tstatic struct platform_device da850_evm_tl_leds_device = {
2 H1 j: z R3 Q .name = "leds-gpio",
' V- d6 q3 X* ^0 { .id = 1,: m3 y, o# Q' }4 e
.dev = {6 I( U# }6 q3 R9 e5 ~% [
.platform_data = &da850_evm_tl_leds_pdata,! X) W b) L& ^2 y' {: o
.release = led_dev_release,+ z4 e$ p& R* [- t+ C, ?# l1 x
}( P6 A. J* R! w
};
0 f) M9 u% q* G( _( B \- l& ~ x% _. v% V% k/ M/ w3 Q
static int __init led_platform_init(void)8 x1 Y/ U; X5 I8 d" p9 U
{
2 z6 b- g$ }% H5 P; Q; n: M5 `2 k int ret;( K2 s+ y- u% g
#if 0
- _5 R* s+ R9 g6 I+ t ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);' P2 `* }, J' n9 S( j0 a6 B
if (ret)
3 q" [4 Z P8 A pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 o3 r4 T7 _. {0 D) \ I3 m* E0 N
"%d\n", ret);( ]4 w1 D* W6 Y1 a: v
#endif
z, k& _3 L) j+ x. R% c ret = platform_device_register(&da850_evm_tl_leds_device);* i5 y9 u/ x! G* L$ {4 X# L
if (ret)
& m0 V& V" |% f% w pr_warning("Could not register som GPIO expander LEDS");* K3 E0 d/ c7 p. a( T# X
else
0 }# u$ V M# L9 J; X printk(KERN_INFO "LED register sucessful!\n"); s" v9 ~0 W$ _% f7 A% W5 N5 F
% T5 U7 d2 L2 M+ y0 Q
return ret;
5 W2 A0 d) w& u6 e. f0 {! S4 W3 u}) K2 `! s' w0 `& ~" o* p+ M( y
$ N; r. |7 J5 f; y- s, X) ystatic void __exit led_platform_exit(void); |* Z! E8 l$ [
{
/ @, Z5 O7 e+ y5 T' ? platform_device_unregister(&da850_evm_tl_leds_device);
, e2 c. U* o% s8 n8 \% z8 T, W
% I' g7 U; p; ~0 |. M( o5 v printk(KERN_INFO "LED unregister!\n");1 P1 @; m9 u8 s8 S4 O
}/ h! ^6 r9 f7 n8 R% T9 B& J
* z! ]+ K s' r4 O3 V3 Z6 j! Lmodule_init(led_platform_init);
8 ]' _9 B: S+ y/ bmodule_exit(led_platform_exit);
; g5 l- A) V7 |4 s3 N; b/ ^) s( O9 s& Y2 i2 {8 x0 Y) q( ~# D
MODULE_DESCRIPTION("Led platform driver");2 x8 H5 W: {- a. m9 g
MODULE_AUTHOR("Tronlong");% b' \& _" t: x3 p- f' p
MODULE_LICENSE("GPL");0 Q' Q( x- O0 H6 Y0 {" ^9 u$ ^9 ] a
8 A y4 P% `& v! u5 I
|
|