|
|
求大神给下面的程序做注解,请稍详细些,谢谢。: Y+ P9 ?- f; P% V
#include <linux/init.h>
4 x+ X' \# C* J ^/ u" k5 @5 l" Q#include <linux/module.h>
" e7 |3 }: Z5 _, \, _#include <linux/kernel.h>& Z. p& R1 I! k! Y: @: E
#include <linux/types.h>: Y; N5 p, v4 |4 e6 A F, J; ~: B
#include <linux/gpio.h>
) z/ k' p8 Y, B" L#include <linux/leds.h>
5 \1 n" }2 \% U5 _/ E5 E, Q& N#include <linux/platform_device.h>
8 ~8 T8 P& H, ~* }$ K' h
/ n& Q; H2 N6 Y0 ~$ ]#include <asm/mach-types.h>
' g9 h# X$ h8 e2 g6 P#include <asm/mach/arch.h>: t2 {% z6 \& q5 [9 \; q
#include <mach/da8xx.h>+ _3 y/ z+ b, i$ [" S& B! C1 ^6 _
#include <mach/mux.h>
9 G) _+ \& p& J+ M6 c- {3 H) z( ^
5 C% r( H# P8 O% Z$ u* s2 ^#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
% C8 g& Q& I! V+ y; `. K#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ e# E( E+ @+ S% P4 B8 d) S! e/ z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). x- y7 h+ E1 {: j7 c
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- v4 N k* \. ]) T3 D
2 E# Z- G/ [( a9 }% X9 S; ?/* assign the tl som board LED-GPIOs*/3 q; C- B" [+ \; W4 }, c7 G
static const short da850_evm_tl_user_led_pins[] = {
# }2 X+ l* O+ a6 k" n- a8 T. T+ ? /* These pins are definition at <mach/mux.h> file */
6 T3 w0 j: h$ }6 m; f DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
' ~# \* r. D' E) F% E -1% |0 Y& i7 h" V* J9 L5 d
};
) a8 E1 x, a# _
) F) Q/ I6 L% g4 f8 A1 wstatic struct gpio_led da850_evm_tl_leds[] = {* S* D% S( `, L1 s3 v9 Z/ N* m
{
- j3 i* i" R2 s4 F } .active_low = 0,- S! w. N1 f* L0 r7 A9 g3 i
.gpio = DA850_USER_LED0,* |% r9 U- t& S& c. N7 M J7 I5 N( G
.name = "user_led0",' R$ L6 }4 W1 ^2 p: {+ p) _
.default_trigger = "default-on",# P" p' R( D, f5 c+ C' D+ i& i+ t. q
},& m& r, y. U7 K) s0 F0 d" h7 i
{; _0 W8 ?; \4 c0 b- w3 F
.active_low = 0,
0 [5 `5 Y9 P8 V) V6 \+ r& j .gpio = DA850_USER_LED1,
9 w* b8 ]# s2 o2 d3 `( c2 _: b .name = "user_led1",
, A1 [# |; a' z# C) M5 ]6 N/ T; Z .default_trigger = "default-on",% [/ H, B: i" Y! n
},
0 w" i. Y: x3 Y, I1 J/ j {
% H4 p% Z; \$ d) Y, ?) s3 W4 \ .active_low = 0,
0 {* J5 z* Y+ v0 [% U .gpio = DA850_USER_LED2," P7 ]7 C6 F6 E/ `6 i- ?5 O; Z
.name = "user_led2",
2 |- f' p4 M$ ]2 q3 T .default_trigger = "default-on",; a+ l3 R# H/ ?
},5 T$ J: y. C0 `
{0 B0 U& [8 n+ d- Z3 j
.active_low = 0,6 d8 ~0 W: H8 `+ C% [
.gpio = DA850_USER_LED3,
7 P; d0 q; u# t8 D8 P0 N4 W .name = "user_led3",
; \$ h, ^; s, c- V H! U- K& c .default_trigger = "default-on",) E- |8 i$ N/ w/ J* s
},
; O: e e V* q" }; w- ^};
' S# D$ _- c$ y% ~1 q# j) f) K% }2 x
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
+ _4 `! J1 I9 L" V$ w; H1 N .leds = da850_evm_tl_leds," H, w4 d/ u% d- D7 X& n# W
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),% I; t6 e# T9 C1 s9 A% v) ?9 {
};
, V* i. Q7 k9 y9 P% L5 Y4 R& _7 c5 M/ }+ t$ a
static void led_dev_release(struct device *dev)
/ c X7 G8 p1 m& z0 W{3 w8 `- b/ K6 B
};$ k3 D9 ?/ w6 `/ Z- h$ x, `/ B
& E4 n# A* X7 e( t B" b1 G; E( u5 C
static struct platform_device da850_evm_tl_leds_device = {, [8 I; X& q: K5 |/ g
.name = "leds-gpio",1 p1 i+ B. s3 B* l9 }
.id = 1,$ z5 s+ J6 b6 S+ \' o
.dev = {8 G& I1 E/ [3 `! o: A7 q( D+ ~7 d
.platform_data = &da850_evm_tl_leds_pdata,; {# @# s3 v( V9 [0 f
.release = led_dev_release,9 ~; J; N; j Z
}
7 X) b U+ n7 H) p};
c* R7 B# ?9 J2 @: `& n; \0 c8 V7 ]- Q- j
static int __init led_platform_init(void)
6 W' z! k) D6 {4 p. G& b2 F{ k2 ^+ M2 D- L4 s# |4 ^
int ret;- z& J: ^/ ` z+ D( K
#if 0
5 a& K- i. j# e/ j ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
: {+ k7 ~5 {" K' m* m. D9 ` if (ret)
. H4 l/ Z" p! G pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
7 A4 s5 n5 D5 q% v5 o5 T "%d\n", ret);1 N1 C3 u3 g( E l9 y" j3 n' I
#endif# _2 q* [7 K% Z+ Z
ret = platform_device_register(&da850_evm_tl_leds_device);8 P$ q, h% t' o, `- _0 q3 @
if (ret)3 X# I$ h1 ?" d! X! }
pr_warning("Could not register som GPIO expander LEDS");
- L! I% U$ S. u* Z else
* o: C! b8 n: l; I/ L printk(KERN_INFO "LED register sucessful!\n");& m# T6 N8 V5 H6 r5 P! @
4 x7 d% C% S, S# r return ret;
8 a w- j i/ P9 F* f5 R' _}
4 M; p9 c" ~ \4 `- b+ n% P6 Y7 }! M% f1 t
static void __exit led_platform_exit(void)
4 A; Q# ]) f. o6 o( k2 j" i( k) L{6 q. P# `& V/ p# a9 I" c% l5 u) \
platform_device_unregister(&da850_evm_tl_leds_device);
: a! [2 W. M2 m2 j2 H: {8 a- m+ z$ [4 h) J, ~6 o0 ?
printk(KERN_INFO "LED unregister!\n");/ ~1 h/ {# K3 T/ d6 S# T
}
8 g& k1 l4 S& L5 o( \+ {% u+ G
0 h8 y" @# } B; T9 O- B5 Umodule_init(led_platform_init);
% ]. Q# R5 ~& v( D+ c# rmodule_exit(led_platform_exit);
* |! m9 o( Z* a/ V
9 [! h4 ]. U! s8 T# Y$ GMODULE_DESCRIPTION("Led platform driver");' p% S& a9 Q0 P& R1 T3 I: f+ [
MODULE_AUTHOR("Tronlong");
# n ]3 @$ ~ `* L( [6 U) l7 p; RMODULE_LICENSE("GPL");
0 W3 x M' c1 A5 ~8 L
# T' N$ }) G# o |
|