|
|
求大神给下面的程序做注解,请稍详细些,谢谢。4 S8 ]# x; F* V$ P
#include <linux/init.h>8 I' ?" }+ f# F& E. V
#include <linux/module.h>4 E [$ G9 q1 O
#include <linux/kernel.h>
0 P0 w* v0 k. ^#include <linux/types.h>
6 ?' w! |1 \0 J0 T#include <linux/gpio.h>
1 j" L+ e; s) S# S& R& w, S#include <linux/leds.h>& X* a0 _, o) g! i V: n
#include <linux/platform_device.h>
5 G. O" [# C2 @, f- `, v
9 j% o& u) e( j2 ]#include <asm/mach-types.h>+ |4 G9 v- N% Z, o( T
#include <asm/mach/arch.h>
+ E& h9 ^# I# C#include <mach/da8xx.h>
8 T9 s9 g2 v$ S( n/ \, C n9 W#include <mach/mux.h>9 W. K. {+ F6 b3 o3 T( n" B
3 M; c1 g4 N' k0 l: }
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)2 Y0 X6 d/ ]4 a5 A& t9 v- l1 y
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5), j7 E/ Y" n/ u. Z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 J+ i$ Q9 m* J3 L
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)9 l1 z4 D1 c+ s
2 { y7 u: m7 C- T" r( m" z U
/* assign the tl som board LED-GPIOs*/( {9 J# p/ Z& K: T
static const short da850_evm_tl_user_led_pins[] = {0 a( U. w _* K8 r# s8 R
/* These pins are definition at <mach/mux.h> file */) z; V @ B9 L) H: m' F( q4 n
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,2 d7 U! @* R* h1 [+ O
-1 K' B! B: d2 ?+ M2 g% P
};. R, {2 D0 U9 @- y e0 }
3 ~* c" |& k- u3 d$ h2 c# j! T
static struct gpio_led da850_evm_tl_leds[] = {0 u0 _6 \2 A1 b- J
{
" n" m; u+ k5 |8 ~* b, F .active_low = 0,. r I- j' v9 y, k1 E
.gpio = DA850_USER_LED0,
0 v5 W% x: w/ V, ^) c6 u- L .name = "user_led0",1 l6 r6 f3 `8 C
.default_trigger = "default-on",1 {' C# B& H5 e2 f0 P5 ]# t7 c# W$ h
},
" `( Y& \ J% ~ {; L5 Z# o% O ]2 v( S: V% Q6 \, q: J; M
.active_low = 0,
3 F8 m2 V* X0 f! ?- [ .gpio = DA850_USER_LED1,
) [, y) F& e4 u% s/ A2 O. ~ .name = "user_led1",( K# B$ z7 t: L) g" X0 R) H7 ^
.default_trigger = "default-on",+ Y6 O- G, r. t
},
5 {: N- [7 {2 a) o" A' n2 l. R {
! ~8 O" w1 j; Y# A9 P, M" N .active_low = 0,
2 Q. e" \& y) d# |- a' z .gpio = DA850_USER_LED2,
, Y. T) D9 y9 ?4 \$ q- n: s7 |# b .name = "user_led2",& b! S: i. A# [2 B; h# u9 g! c
.default_trigger = "default-on",% ~" s( J2 F. U1 X
},9 z6 d4 x6 g) K/ Q/ i% @/ D
{5 r1 g! ^) E3 f
.active_low = 0,
3 Q% M* m" n& g- B- v .gpio = DA850_USER_LED3,
$ i6 x4 {. J( m! a .name = "user_led3",
# q/ `7 d; X0 r, x8 ?4 Y* a' } .default_trigger = "default-on",
' g+ n4 J# b a, T },5 I- p7 O- v( G( ~8 A$ C3 x$ I
};
' g9 @! r7 q: y' f# ?8 U( e. I, C+ e) R4 u: v L8 B
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
' k7 |) K1 H0 n. d .leds = da850_evm_tl_leds,
" y8 j6 N+ M, z4 h' R+ B .num_leds = ARRAY_SIZE(da850_evm_tl_leds),9 P5 z1 L1 Q# D& X9 N: N7 u$ X
};( v0 s: x" F9 K9 k: J* H( k: C
5 y+ ^1 J2 F# p6 Dstatic void led_dev_release(struct device *dev)
' a! e- W& `4 _6 F{! x1 H M; b4 v1 M
};
! I- r) v9 _1 W% d8 v
* K8 j" k# T) L8 Y4 [7 T+ l3 Ostatic struct platform_device da850_evm_tl_leds_device = {; }: k$ o1 S2 f% h
.name = "leds-gpio",. t7 H S3 o& ]6 I1 D
.id = 1,/ x& l* b/ y# x' \! v
.dev = {2 I3 [9 R4 S/ a0 B0 k6 ?! A- G% n
.platform_data = &da850_evm_tl_leds_pdata,, c# P( p5 y s, q
.release = led_dev_release,. a* g9 [: }" a" d3 b9 b* |
}/ M, R' x* I; y( H1 L* Q$ M
};
3 y/ {; ^$ g! z' X' O- M& ]. `3 {7 h) g+ Q, d7 h- i
static int __init led_platform_init(void)4 B* C5 n/ J$ s* R- S
{* n: o5 x) Y+ M9 Y& c
int ret;
9 Q3 A, ~ V! }2 D4 z8 o#if 0& n9 k' A- N' R3 A0 _1 u
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 K1 V7 d) j( { if (ret)
" L/ z1 j8 h4 z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
* f1 c- F. p# H3 f4 L. r( | "%d\n", ret);# C; }/ i0 ~, R( t
#endif
) p5 I' U2 Y) V ret = platform_device_register(&da850_evm_tl_leds_device);' V$ k9 u( N6 L7 |
if (ret)
/ ^# C( d5 W8 S pr_warning("Could not register som GPIO expander LEDS");" ]6 w$ I1 ]7 Q/ T; {( ]1 y( {0 v# k
else$ F0 _- g) T- F8 A% k! U
printk(KERN_INFO "LED register sucessful!\n");
: W t& w5 t3 |6 ?8 s2 J L/ u
: _( M- Q4 U; P+ Y% ~' e. ] return ret;
& \; T9 u5 ?! {$ T1 T}
3 Q1 w& {+ P" {/ R" l* c
+ J3 m8 `/ ]# d3 Gstatic void __exit led_platform_exit(void)1 V" i; P7 S* G# Q( Z) _
{
2 e% t# D4 y) m* _+ J |# W platform_device_unregister(&da850_evm_tl_leds_device);
& j* B; |( J3 ~) C9 c9 Q1 S8 d" d8 Z; ~
printk(KERN_INFO "LED unregister!\n");
" w1 L g' o. Z' _# f}
/ `# ^8 ?, O8 z; }$ i; Y6 v
5 P5 L1 c! H; N* S k3 x$ y+ Umodule_init(led_platform_init);0 R, O( D$ o. d$ U. x4 O! s5 O
module_exit(led_platform_exit);+ n; [5 j. v0 U/ R o
# I! D8 C; ]6 y ~MODULE_DESCRIPTION("Led platform driver");+ U- {. \1 @( r4 \. u. L; M; Y
MODULE_AUTHOR("Tronlong");
4 U/ l& d6 z% ^6 T! kMODULE_LICENSE("GPL");# A8 M" D2 }$ r5 p
' W, N& w s, \+ R" f1 y4 i
|
|