|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
+ _3 z' H6 x. S$ n* C6 n#include <linux/init.h>
1 ^; I+ z8 C' B+ i6 L5 p#include <linux/module.h>
& W, C' Y ~4 S8 a2 a#include <linux/kernel.h>
$ _' H1 P9 L: q; h. y#include <linux/types.h>
, S. ?5 f# k( Z" Z: t/ e7 M6 p3 {#include <linux/gpio.h>
2 {0 c2 S9 S1 K) L* Q7 y0 {#include <linux/leds.h>/ M8 m4 Z! d* R! D2 @, v
#include <linux/platform_device.h>8 ~7 j! Y( Y% B2 X2 F1 r
$ d" r% ^8 `) |% L- v#include <asm/mach-types.h>6 I* ^9 A; u4 o. K; K) d
#include <asm/mach/arch.h>8 `! y% @5 k( B1 c
#include <mach/da8xx.h>) e$ _; }4 n+ f) [! i8 [) t: c% C& h, \
#include <mach/mux.h>
7 F. G, ~/ r8 w) r, @5 k0 \
8 Y7 Z% k' E6 s1 y P. U, @) N# [1 E#define DA850_USER_LED0 GPIO_TO_PIN(0, 0) s& h2 T7 h/ y* }: u
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5): g( r) p3 x/ | t! d
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)+ J( u) N( E( z* {0 V: Z# b$ b
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- o( {( ~! f( E# u( [1 }
6 _8 b! D$ _* k0 B2 k6 ?& |: V0 O
/* assign the tl som board LED-GPIOs*/
& A3 C) S( k* Z) A; hstatic const short da850_evm_tl_user_led_pins[] = {
) [6 `, ]" T7 l0 l% X /* These pins are definition at <mach/mux.h> file */
/ n4 J* }7 V8 [. p: O DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,& } a9 t" [- Y" S3 h l a
-1
6 S$ c/ x c N};
2 l! g& W% {/ b/ }- W4 f+ U
0 V U2 d" r5 ]# i0 C% c- nstatic struct gpio_led da850_evm_tl_leds[] = {
7 H! ?- @; b ]+ |* r. F. m; ^% V: F {
T8 d# E8 X6 k: s7 z' g( g .active_low = 0,
1 n, N% \" r; C. z+ x7 x .gpio = DA850_USER_LED0,8 f! f( w1 K8 s' s6 w0 m; D- U
.name = "user_led0",
% {/ n9 f. k( @1 m0 | .default_trigger = "default-on",
5 ]$ i9 @3 N" i5 R8 b },* Z4 y* K. H4 }+ m& V
{. s$ K3 m l/ j
.active_low = 0,; A! D6 p( A9 ]# m
.gpio = DA850_USER_LED1,
! ]1 |3 n! p4 h3 g' k .name = "user_led1",3 W5 w/ G& P7 x. Y2 n% m/ M/ r" n
.default_trigger = "default-on",
& ]* y! k( C& y4 f: M) y },
3 I9 U7 u5 g" S4 d {
9 s4 k# o1 a. l5 d, o" z; m .active_low = 0," Q/ ]" M% j" A! u4 [ @
.gpio = DA850_USER_LED2,
: ]6 }/ K4 F8 C. u .name = "user_led2",9 h8 Y/ ]; a4 W1 z) v; v( S# G! D
.default_trigger = "default-on",
- t: `# h8 e5 [" M. _6 _ },2 S5 ~' \( W3 P( @# ]' H: T: P' W% S
{
! E. v- O& [2 w; w% ]+ }. C .active_low = 0,
: D: ?) T& n" q. j+ {) s .gpio = DA850_USER_LED3,
9 z- A+ k/ O# [) ?5 l% c' F, Q8 | .name = "user_led3",, ^$ {' C$ \7 ~
.default_trigger = "default-on",+ Z S6 I& Z/ x
},+ Q. i" j v' d5 Q' s( E
};3 h: X5 a& W* O5 t# s
$ g6 v( d) t/ ?* S1 Y* jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% P9 v1 L( U7 ^/ M# V .leds = da850_evm_tl_leds,
" x7 m% @+ {/ ?9 \ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
8 o3 w& S6 S4 {};
b, e6 j- B. D) U0 e/ U) d) M1 t7 u1 p6 P3 M$ O8 o8 m
static void led_dev_release(struct device *dev)$ ~: u2 J( W5 H" `4 N9 x" R
{
4 x) K; n. A; u/ p9 ~7 O( E};
- G% ?% L2 B4 c+ q
+ ?# Z5 w6 R7 G2 p/ ? l1 u* t+ ^static struct platform_device da850_evm_tl_leds_device = {0 O( t* P* B. a
.name = "leds-gpio",5 H$ F2 ~/ H0 Z* O _
.id = 1,1 ], \! y5 m; W- _) T4 Z7 j$ y
.dev = {2 z) ]" P! D0 e p8 J
.platform_data = &da850_evm_tl_leds_pdata,
% z; |1 Y) [: t# n0 A" o5 m. n2 c .release = led_dev_release,
% F% |' f6 r3 A8 f k }# h7 H, ]$ G5 r6 S
}; @ G, [* J( V+ \2 m
& C, S4 D% Y3 J% i/ y% _ R
static int __init led_platform_init(void)3 i, }% d' q- t* x% j
{
2 r$ a& w! n- X int ret;% f' Q8 d" l! K5 ^/ l. `) u
#if 00 u1 h* `! H) L
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
% [2 O0 ~# H5 e$ s9 ~ if (ret); N# Z3 k9 m! Y7 l( `% B3 c
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
# x: G5 P0 ?% \# q9 m9 y5 p$ G "%d\n", ret);
) L$ m4 f+ Z4 _4 Z6 B: p#endif4 `3 n" m; Z# w5 t' k) K, A: V, B* i
ret = platform_device_register(&da850_evm_tl_leds_device);
/ C7 M* r. q ]0 M: p. x if (ret)
8 U8 h, b" n( r, ] pr_warning("Could not register som GPIO expander LEDS");
# K4 g4 h% y+ C/ v9 L else4 o6 K7 W8 @, _+ D* M: e# N0 F
printk(KERN_INFO "LED register sucessful!\n");
" w# O4 m" P2 L' V+ }# u
7 d8 P2 P. d/ ]: \+ E% W7 [$ J return ret;% S4 i. o$ z& E4 L d; A. N( @
}2 a1 E B; r/ ]5 \* N" H, ^! e
: \2 U$ @0 J3 Q+ B
static void __exit led_platform_exit(void)2 d' Z- n: { v' A/ @0 {: X* Y
{
, Z `- y0 S+ C# ^ platform_device_unregister(&da850_evm_tl_leds_device);0 G/ y4 ~# ?# a; Y
4 M4 A3 I1 `0 C printk(KERN_INFO "LED unregister!\n");$ i7 B5 V9 @, l9 r# @) |3 \2 x
}/ u; `' J2 L( H. ^
' E: ]$ D6 m4 u* L
module_init(led_platform_init);
" h7 q, h3 p5 a1 C& s; Dmodule_exit(led_platform_exit);
- `. ~, v: R ~, q
, o! l8 W: [ Q5 F5 XMODULE_DESCRIPTION("Led platform driver");3 y L, ?; m, z" P
MODULE_AUTHOR("Tronlong");' S6 Y& Q1 k( | g8 D
MODULE_LICENSE("GPL");
7 F6 z! J: F7 l; x
$ @3 P" R/ B) D' g" M& U |
|