|
|
求大神给下面的程序做注解,请稍详细些,谢谢。7 ]9 o, E8 j' @" O# g- W2 @
#include <linux/init.h>
( J* O C% c. o, C9 i! i$ ]#include <linux/module.h>. R' n- C: M1 u+ H- T) u7 e7 ~
#include <linux/kernel.h>
; z8 r7 `! q' ]#include <linux/types.h>8 y7 u' w+ `; Z* b! n
#include <linux/gpio.h>
' z6 T1 k7 K5 O3 o) Y1 N#include <linux/leds.h>
- F$ u3 t7 |( j$ e#include <linux/platform_device.h>
" {7 O8 W, g( w% Z
4 t, D1 z5 O+ m4 x#include <asm/mach-types.h>
4 \# N A1 d3 x6 ?$ ]& n& e#include <asm/mach/arch.h>5 K8 {* v: m$ @" \6 o9 Q3 B8 i& j/ v
#include <mach/da8xx.h>
7 Y& j. l- B' L2 V) _$ {#include <mach/mux.h>
3 p7 I0 d' z5 q" s* x( J" E% \
$ p z: ]' L# Z. h; k; u$ n#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 n4 y8 u+ n" e$ e! Y2 g/ r/ D#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 i+ j) t) h# |$ \* A# n+ ?#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
4 V+ O9 L/ S" h9 \#define DA850_USER_LED3 GPIO_TO_PIN(0, 2). E V7 h- C. E A
' n. w( V3 z* Z( J/ O3 R) h" V
/* assign the tl som board LED-GPIOs*/2 g% y/ b6 U: M. C5 M: `7 P
static const short da850_evm_tl_user_led_pins[] = {/ P1 t; ^1 }0 G' A$ F* g
/* These pins are definition at <mach/mux.h> file */8 l9 h6 i4 K+ q) d7 m! X$ Y
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,6 ^- T5 K4 u1 Z9 d( e' T
-1. @# D) a$ a/ S4 K+ i) x
};4 D M5 c; A* l( y" x1 E- t
) J5 U) o1 S8 o7 L6 p+ j1 @static struct gpio_led da850_evm_tl_leds[] = {
. p; U2 d6 t" H {
- q& G# r( j$ n" o# W% p* o1 u .active_low = 0,
% ^1 f( ]; y) u4 ?; H .gpio = DA850_USER_LED0,
! L' a! `9 j, w! F .name = "user_led0",
6 C" |. U" ?( T, b; a3 z* X .default_trigger = "default-on",
3 H! H* V; ~, E* w7 V },
6 c! F* g, X' p1 W6 E8 C {
, D- u! a) V8 E ~ .active_low = 0,
0 B. l2 J* x, n3 ^7 G .gpio = DA850_USER_LED1,, R% M2 n, V1 C
.name = "user_led1",
7 ]* e. x" X; Q! U$ s( n .default_trigger = "default-on",
* j4 w& F5 Y# y% |9 i5 v0 \3 _ },+ C$ i4 @+ A. e7 v" D* b. H, i
{
: ]. `7 L# V4 E ^. R0 D" O. U: I .active_low = 0,
- K O, I+ v/ y/ C/ K .gpio = DA850_USER_LED2,
9 W0 L. }7 Q5 t# ~7 `, i .name = "user_led2",4 q& ]% T( Y$ E
.default_trigger = "default-on",& Q# i" Y! Z+ ~7 V
},
) M5 _; P* {& B {" O1 G0 N9 T) G6 ~2 U& m0 P1 f% ?
.active_low = 0,
! P% i1 P3 ~+ K. E6 M4 {' ~; D s8 A .gpio = DA850_USER_LED3,
/ m' F. y7 |& | .name = "user_led3",+ d) T& d- t! J% @8 Y8 X6 `
.default_trigger = "default-on",
0 P" l4 ^ J! `, u! s3 y },
2 H' U( y. v4 A7 m6 O};& S- y$ @$ Y4 |+ w2 I* b4 A
8 a! ?& e3 f; N" d }
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
. S6 E! M1 }& f$ m7 v .leds = da850_evm_tl_leds,
] u+ q" v- F( X, S .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ _$ v$ V0 U- d7 H};
8 h0 }! ]# r0 U6 I7 m9 X& b1 _% w5 z7 Q4 X
static void led_dev_release(struct device *dev)
* w/ s) Q7 l9 K. O+ Y/ B{4 U& v- m# q7 n& c. x
};
+ s; D) p2 M( Y; d Q& X* l; A0 z0 a2 k
static struct platform_device da850_evm_tl_leds_device = {, c4 S5 M- y; f9 F
.name = "leds-gpio",9 ~- ]! N! y/ d; J( _1 D
.id = 1,; ]% @- f; S+ F5 S
.dev = {/ c+ e/ B+ I8 v
.platform_data = &da850_evm_tl_leds_pdata,
" d6 c U& ?5 E; K z4 ~ .release = led_dev_release,3 p! ?8 ?2 w* _, ?8 L8 m( k
}
( R* J) j+ A) D};
" _' W( E: p+ ?2 i2 h% p3 e
5 e( _8 o4 [* h- hstatic int __init led_platform_init(void)
( { }: v' u" U5 k! o+ q6 J+ N, v{7 w6 V0 N1 G+ n$ j; n( n: X
int ret;# P/ H8 o" `5 m, e5 ^
#if 06 J2 p$ `# a7 t+ G$ E4 Z6 k& V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 O/ w1 y" ^9 O6 x& _, x
if (ret)- k" ?4 C6 C$ `" S. c
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 L! v" O$ z7 r: a0 L; A "%d\n", ret); a" H6 |, J1 r& M$ `) l
#endif
) F7 }! r: Z5 m& b" o/ G' E( C8 u ret = platform_device_register(&da850_evm_tl_leds_device);: B, I9 A* ]; X0 O w8 f
if (ret)
" \# N% y$ @ E- Q& V: L4 k' A pr_warning("Could not register som GPIO expander LEDS");
5 W. v# ^7 F; \3 \6 S8 O else1 `. k) L9 x' i) f
printk(KERN_INFO "LED register sucessful!\n");
8 I: V% d7 U4 K! H: H+ T
* |# q/ N( H* h+ x P6 f return ret;- n- l: m! u; j& e- F, j* s
}
0 a% E/ S8 C& [8 F6 F9 a* Q- L2 ?! B0 ~: e+ L$ W2 [$ d }. V+ [ f4 A% [2 m
static void __exit led_platform_exit(void)% t+ U& k9 b' s" Y, C# c" A: z. F
{
. H& ~" C) A U/ |+ b# l platform_device_unregister(&da850_evm_tl_leds_device);) j/ r( g) z3 N3 v$ }) ^
/ M0 g9 K% z/ u0 G/ z+ @* H
printk(KERN_INFO "LED unregister!\n");) t% A/ s- d0 h8 c* m
}- i9 L3 C: p* q T6 [! [+ N2 ], B
/ g& Z8 _: Z0 ]module_init(led_platform_init);) W! u+ d2 L7 g9 ?; A
module_exit(led_platform_exit);
4 i2 A. e4 p- g( w% z; ]; e# R. o' _. x4 N
MODULE_DESCRIPTION("Led platform driver");
3 F" k" [( d, N1 V0 `MODULE_AUTHOR("Tronlong");
4 B+ P! H! O: r. V* SMODULE_LICENSE("GPL");$ ]$ S1 X7 w7 J& v$ {: `
/ M: j' X' H8 Q+ |6 x# ^$ ]. H
|
|