|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
* M) G {/ R1 Z( F#include <linux/init.h>
2 a) C, Z" o, z1 X0 K#include <linux/module.h>
7 ]6 |9 A# T$ r+ \( k#include <linux/kernel.h>
/ ^8 O" F" b; m1 T R#include <linux/types.h>, W4 _. @* _( k( \3 j5 m
#include <linux/gpio.h>
/ K9 X0 w. _$ W; U#include <linux/leds.h>+ J, h7 N# b D" K5 q; c+ k6 ?3 Z, P
#include <linux/platform_device.h>1 B2 v! e' ], O2 E; [
+ O8 R/ a5 K3 M2 q, K; A7 R2 f#include <asm/mach-types.h>
. D% i/ F6 i2 N& x: M2 o#include <asm/mach/arch.h>
C: | y; D. F* v# K#include <mach/da8xx.h>
- D* X2 f- Q, s; h& W; q#include <mach/mux.h>0 [! T2 k, ?0 I1 X @* E
9 @0 Y+ b% S$ C. R# u
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
+ L$ b0 @$ g Q) H0 r* L1 }6 @, g" F#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
# I$ `* `2 x: w+ U#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)% {: a# H g Y6 ]
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) L' c, S# o! K1 u
2 c% J& P5 W+ p
/* assign the tl som board LED-GPIOs*/6 N# z6 v- `4 d6 V' F; n/ u; x
static const short da850_evm_tl_user_led_pins[] = {
/ u2 \9 Z8 o- l1 F4 a7 |& k9 o5 u /* These pins are definition at <mach/mux.h> file */
/ A3 d3 z6 K0 u, `# R7 z5 ^ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
, C0 m y' x, p -1
: C$ r! W6 S7 Y8 I};& n$ C# o' t* F
# b2 t/ _" Z, F3 J! ?/ V3 d
static struct gpio_led da850_evm_tl_leds[] = {
9 _5 X; i) T) @+ ^ {
" k; z- D$ F0 ]" X9 L& e .active_low = 0,
- q% F8 Z1 \- B .gpio = DA850_USER_LED0,
) Z2 l: o% o9 T& ] .name = "user_led0"," O0 e- c) j6 O( W" A
.default_trigger = "default-on",% l1 T. ~& v/ X8 d/ x
},
6 ?. S$ E% ~( l* \ {0 y0 D2 K7 p2 ~
.active_low = 0,
3 O# R/ h8 S6 s, C .gpio = DA850_USER_LED1,' B4 {( n' A8 O
.name = "user_led1",
$ W4 F* n. O8 c1 ]1 b .default_trigger = "default-on",
/ X6 E% x/ \/ t0 A# p- j( \# K },
$ ~# h$ p/ Y9 F T7 ] {
! A; \5 \. N8 g% x# B3 { .active_low = 0,) n# r# O s- b* n
.gpio = DA850_USER_LED2,
$ T+ s' b" o2 g3 D2 c6 E .name = "user_led2",( ~, q1 B+ E% N9 W
.default_trigger = "default-on",
+ ~0 Z* ]/ x, J' J },; {; m) G6 a/ B/ Z
{
; |0 }: |% V4 `/ B' A$ X .active_low = 0,
9 c7 i/ E- y6 s& Y$ {2 H .gpio = DA850_USER_LED3,4 _$ H' [! r# N" e# N
.name = "user_led3",/ K7 x; D" R. f" n
.default_trigger = "default-on",
& G. _; v8 _+ G2 u" H& n# \! u },
/ y/ P7 P0 O3 B7 F; c; P& U};5 v l* _4 t8 F
/ U! C- {1 E! @/ zstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 D, |3 Q/ C! c5 F! O .leds = da850_evm_tl_leds,
|5 }3 x2 c+ g9 w .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- X) D( @! a e};! @5 j! G& E' S/ `0 Y( ~8 N' j
r$ E4 v! x* G! [
static void led_dev_release(struct device *dev)
9 Z% o' ?$ R. S# ?, v2 _5 T{3 y5 q& T7 {' O3 U V% e
};7 n& N# [, P) d* D) m
+ u+ _- ^1 l# V5 Y6 `% astatic struct platform_device da850_evm_tl_leds_device = {4 g: A# a* x$ v+ k
.name = "leds-gpio", I' p" W S. v6 U/ x, j
.id = 1,5 z2 S7 G. m- J- C" p7 T
.dev = { w$ w: E, c0 e" n: L: U
.platform_data = &da850_evm_tl_leds_pdata,1 u9 V E: \ w1 R9 P* i
.release = led_dev_release,& m9 A2 T& L: t& W L) b1 j
}" k7 T9 [: g# ~( i- D U5 N
};# Z/ _% A2 O' b n
: h8 {8 A$ i2 p1 Dstatic int __init led_platform_init(void)
. N0 x; {- y% [& J/ [6 `$ f9 z8 P7 Q{
' C/ j. e. F q# S- b. j int ret;7 |! h# }/ [. [; w! _5 F: i/ }" G
#if 0
6 ^) W" a. }3 j; P: l ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
$ q# ~# b e# D9 R, B6 O5 a7 ] if (ret)/ O* p! A5 S5 r. o& J" ?/ v
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
7 o! z4 Q: S& ]1 `3 F0 R1 |& } "%d\n", ret);
1 P: @5 s& g9 k5 t1 }! ]7 ~5 m#endif
; ? O- m: G8 i+ b1 x ret = platform_device_register(&da850_evm_tl_leds_device);, [7 K: ?& L& j- l/ {, d% l B+ N% q
if (ret)$ C/ I& ?; q* B" B) n, Z! r. C
pr_warning("Could not register som GPIO expander LEDS");
/ m8 k& A1 ~5 `* ?0 A1 a4 } else: z; Q9 a: L- C& Z$ u' |
printk(KERN_INFO "LED register sucessful!\n");, `. g1 L% S) @
$ Y c. Z. f' v; g d
return ret;/ q$ G8 Y# C5 p' X9 X
}) H) c" g) |+ _$ j6 D4 Y
& e+ k7 l+ ]8 S/ s6 f% M" s3 b
static void __exit led_platform_exit(void)! N; ^7 \% p6 i3 K+ B8 O
{
2 ~, g6 C9 u# x0 { platform_device_unregister(&da850_evm_tl_leds_device);
& o/ j0 Z O" e) H2 b- F
! ]; q* X2 i+ A2 k" _% H/ X1 Y: H! E printk(KERN_INFO "LED unregister!\n");
% |' W$ `& V6 p* }: F% P}
( q' P2 M6 k( h7 w E: m+ x. R1 \; x8 M: |
module_init(led_platform_init);, O' @* H- _! G6 Z- O1 H$ L
module_exit(led_platform_exit);# ^7 v$ a6 n! w3 M& k6 w. G
0 x3 n4 ]' E: ]7 |2 E$ m" \MODULE_DESCRIPTION("Led platform driver");; d- C2 A* W' S E& t, b! \0 a; |8 H" T
MODULE_AUTHOR("Tronlong");
' p4 Y3 P. E6 q% X3 K: m) yMODULE_LICENSE("GPL");8 B0 d' G! d7 o
6 m( s' Y1 E% i" i
|
|