|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
& y# j( I5 E- X a! n3 D#include <linux/init.h>
* A4 S# j; @+ v#include <linux/module.h>6 M0 Q1 f& W) z1 @7 u: V$ a
#include <linux/kernel.h>
* ?; z0 c. t, j" l& N; K#include <linux/types.h>
6 W0 R5 s' n3 w+ Z#include <linux/gpio.h>
8 Q; g3 |' k& m#include <linux/leds.h>- \+ m1 t* z1 q* _ ]' B
#include <linux/platform_device.h>
" W; @$ \. B( ~- ?4 o) d a: \4 z7 f$ j. J9 {
#include <asm/mach-types.h>, W. `$ m# I0 {; z5 [7 n2 i( a
#include <asm/mach/arch.h>; x! p, ?8 m5 c1 L1 k' E" e
#include <mach/da8xx.h>; ^9 w- X2 O, v1 T
#include <mach/mux.h>( z+ v6 I8 D/ D7 i3 n+ ^. O
6 E: g+ Z. H7 s6 X% w. X: p5 ~7 H
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
9 a V2 H: y* L I#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
: r1 N) h. O2 t; b" |#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 K, L; K, F. u#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)8 z" d! ~ j/ X" x/ S
1 V# P F, X0 e) R- |1 w" k7 X- z
/* assign the tl som board LED-GPIOs*/
5 }' y6 i" B5 h9 S" u9 N( f2 ~9 C8 sstatic const short da850_evm_tl_user_led_pins[] = { l7 r: T1 l7 a! n9 `& ~
/* These pins are definition at <mach/mux.h> file */
; K9 m( r- s9 F DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,: [7 v9 e: \7 B
-1 u- J6 H7 ^! \
};' c" _) ]" a7 s: s" ]1 X9 E
1 {( {5 x9 X3 P+ R/ n! v" k9 Q2 rstatic struct gpio_led da850_evm_tl_leds[] = {
2 E. v0 n. f) }# o s {% ~: G: @( U [' q
.active_low = 0,6 \/ S4 h" M+ E7 i5 D
.gpio = DA850_USER_LED0,
9 v2 l s6 q$ a5 f8 D% s2 B, n9 m .name = "user_led0",# ~! R1 W% _' r( z5 C0 N- [ e5 C' X; t- a
.default_trigger = "default-on"," D9 w+ Z7 ~) J% p- T& K# h
},
- J' s6 y$ V) C( W {+ k: E: L! O+ e5 a4 z# u
.active_low = 0,
6 l* \2 Q; B7 U, [" u2 K) F .gpio = DA850_USER_LED1,: Q+ S7 x0 e" O& R/ w- A
.name = "user_led1",6 @: W- [4 b/ `+ O8 i. |( D1 p
.default_trigger = "default-on",; e& C" j& m1 N- U6 _4 {1 o. J
},
! t$ I$ S! l8 F# [2 g' ?/ c {- `9 L* M( C! X) H6 u! u3 E& d8 i
.active_low = 0,- I) h$ f# c- ]- p
.gpio = DA850_USER_LED2,
$ P4 X! X2 ]3 l .name = "user_led2",9 x6 C2 b' s6 G* j# b, q
.default_trigger = "default-on",- I t. \- c! Y8 N, q) L& U1 o
},
' ^' p9 a! t: e/ r! h: |; L+ E* ` {
, f) L, Q: X" B .active_low = 0,) i4 P1 X* [; }+ \
.gpio = DA850_USER_LED3,4 u6 ^/ A/ v2 R2 u5 f6 m: l+ A9 `
.name = "user_led3",
2 L) t, o& f0 k+ f6 U1 j/ c& W9 F .default_trigger = "default-on",! [% f+ `7 j" t7 R3 s
},% g: R; E! P- x+ @/ C- v
};3 j3 v. G( x5 o2 J5 ~8 ~
1 ^! V2 D! ?- p" L& C" c
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {2 J; H; O7 o! D0 W
.leds = da850_evm_tl_leds,
( y3 \' y0 s1 ^; f* c .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' Y7 S3 ^: Q2 w) t# B9 G4 L, d};8 q( t$ Q& ?7 `
3 e/ t8 c+ j" w! kstatic void led_dev_release(struct device *dev)
2 ], k, D3 @; E{) j2 N& S# w* @1 H8 W. K" L
};
+ `3 [2 U, q) `" X+ Y
6 @2 Q( S7 Q" j, Mstatic struct platform_device da850_evm_tl_leds_device = {5 ~: K" a, m5 I( H) F4 k3 }
.name = "leds-gpio",
/ L' e% W5 W, l$ B- U+ R$ q4 i .id = 1,
3 w% M0 Y4 |+ P; f/ C: X( d* D .dev = {
0 I" x, ?2 `8 E5 p .platform_data = &da850_evm_tl_leds_pdata,
4 J+ L2 |6 B/ I% j2 b% ]- Q8 M' u .release = led_dev_release,
# P& Y7 m) P- j5 S: Z1 L }0 h0 Y, C3 A) Q
};# }) n5 E: \7 N- N. |
# R3 S2 h4 O6 C6 ]0 I
static int __init led_platform_init(void)' G+ k0 ^ E9 P
{
2 W+ i/ M, V- Y2 g3 T) ^ int ret;
! A8 j) x* @/ p# U* h4 r+ m& _#if 05 |4 \ Y* z9 S8 O* E/ Y
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);, D, w2 A! j1 U3 Y" x. z
if (ret)4 Q$ U0 x% J! t
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"* v: k# R+ O- O n( S' a
"%d\n", ret);
/ W, b( P5 S! m4 v6 Y#endif
9 U( M$ c5 T8 c I ret = platform_device_register(&da850_evm_tl_leds_device);. ^- W/ N+ ]7 _1 ^) i) z4 P
if (ret)
: m- v+ }8 U' b! T. C4 x+ G* H pr_warning("Could not register som GPIO expander LEDS");
1 Q$ A# K& k7 V else
1 z r% J% `5 O C( v6 n printk(KERN_INFO "LED register sucessful!\n");6 l' C! `: M) v: ]8 f
: v" e; y6 H g& Y
return ret;8 f, b% ?8 M2 J% I( Q
}
% R* ] u: j* p0 p
1 {; j: K$ S3 X' Lstatic void __exit led_platform_exit(void)
5 ^# }7 g3 F' _ \( c; p{, J. k: i- y/ S; W. u
platform_device_unregister(&da850_evm_tl_leds_device);
~$ Y. @7 Y6 i$ L( v: [9 l- i+ W2 Y7 z' _
printk(KERN_INFO "LED unregister!\n");, G7 j+ [: ^2 y2 Y% j% J6 A$ b/ r( R
}+ N( M- ^" j: R0 j/ F2 B8 M+ ?8 K
: S0 g3 _/ {, W8 d
module_init(led_platform_init);/ q2 P7 F+ _& @! o3 K$ r$ e0 X
module_exit(led_platform_exit);
$ a4 O1 }" w; c& r' b2 _. E" @* C, e1 R( J7 j7 Z
MODULE_DESCRIPTION("Led platform driver");7 a! n6 O5 J) J( q+ P p
MODULE_AUTHOR("Tronlong");
% E: e; B2 W, ^MODULE_LICENSE("GPL");5 x; p% b7 ]$ D( E
9 D9 r1 l% u/ U8 U
|
|