|  | 
 
| 求大神给下面的程序做注解,请稍详细些,谢谢。 - N4 A7 o! U6 j9 P- f! j4 a0 r#include <linux/init.h>
 * M; F4 g* m/ v# z# s: R( e$ C+ q& Q#include <linux/module.h>/ R3 d6 v# t+ z2 C% Z  p( o  Q) i) k
 #include <linux/kernel.h>
 & j$ o" _/ u$ C1 a#include <linux/types.h>
 0 L! P, w, ?4 p- m, j#include <linux/gpio.h>7 P5 e) m1 q6 y" @6 Y7 |  n. J
 #include <linux/leds.h>
 5 r3 l5 {! K0 G+ R$ n, N' S! _% R: v#include <linux/platform_device.h>+ J& B0 [7 ~/ B( C
 
 0 N9 X3 N* y' g: r% X- }2 v7 c#include <asm/mach-types.h>
 5 S  ^4 a: l: F0 _+ H2 k8 B7 w" e, J+ u#include <asm/mach/arch.h>
 & d9 F. C% Q* {% E" F6 l! w' l#include <mach/da8xx.h>8 ?: p1 h( |9 P, `. |! {5 L
 #include <mach/mux.h>
 # u: p2 P: P+ ?, c
 # m; }9 z* U+ a% |# Y#define DA850_USER_LED0        GPIO_TO_PIN(0, 0)" w9 g; ?  i3 c" L' J- p" X+ v+ u
 #define DA850_USER_LED1        GPIO_TO_PIN(0, 5)
 6 u- a4 {' v* B8 ^! y#define DA850_USER_LED2        GPIO_TO_PIN(0, 1)
 * E: Y3 n* v5 Y, `#define DA850_USER_LED3        GPIO_TO_PIN(0, 2)' q$ c! O& f- ?& N9 l4 B* x) j
 7 j+ v* r- h- D3 O7 U. a9 I
 /* assign the tl som board LED-GPIOs*/
 ! |9 R- l2 |% P& y0 ]6 Jstatic const short da850_evm_tl_user_led_pins[] = {- Y1 q$ a; U$ N' v: n& K4 w
 /* These pins are definition at <mach/mux.h> file */( G& E( s: E( q7 D; Z+ D: H6 a
 DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
 / j; K8 Q$ r3 r7 t; G" b5 x        -1. z3 l7 r+ T; t+ _2 Y9 ?
 };
 5 D' j: N$ Y+ I; H& x% a
 v7 `' \( a. m5 ], nstatic struct gpio_led da850_evm_tl_leds[] = {
 : o- ^8 ?7 z/ L, {' {9 g6 U6 v$ W        {
 % Z" `, b$ ^4 r4 ~; K                .active_low = 0,* c( M( V/ w: W' H  Q: J. ?6 v
 .gpio = DA850_USER_LED0,
 0 c2 \. Z* Z8 n  N+ Y8 E! T) K                .name = "user_led0",; v6 g  X4 t3 X8 M* H
 .default_trigger = "default-on",
 + c& L: H( u% Y4 R- h0 W8 j1 |        },; K4 r8 ?- g: D$ W5 `7 m& O
 {
 ! Y9 I, g; T2 `$ d- R# H1 e$ P# T                .active_low = 0,8 r3 T5 V6 I, ^; C7 z- a
 .gpio = DA850_USER_LED1,# i% |+ [# _) u( ^: }+ y- w; u
 .name = "user_led1",
 / e; S( q( F( j  c4 h                .default_trigger = "default-on",
 $ k" W) x: v# {' K  X1 g/ E5 B& r' ?        },
 * M' k, @' }* p3 _. I        {
 * u4 e+ N- n0 v: w* F2 p                .active_low = 0,5 R; U' c5 |/ {4 }& \
 .gpio = DA850_USER_LED2,) a& Q% P6 l0 @+ X- h
 .name = "user_led2",' o! D" W/ S, y9 Y8 T, R
 .default_trigger = "default-on",
 9 u: Q: r) B% I$ c' G2 z4 o        },+ _0 w% f' L( I7 v8 j: H! ]3 ~
 {$ t5 v+ I; G4 F* r* T  K' m0 M; Q
 .active_low = 0,2 B; ^! Y/ f) M) Q3 N
 .gpio = DA850_USER_LED3,
 1 v3 L: V' l/ i. c0 W5 ^3 {% h                .name = "user_led3",
 3 F4 P/ V* R6 s6 f                .default_trigger = "default-on",
 6 Y& [5 f) k  r( m+ B        },- g: ]" L* u/ g/ E+ J
 };6 ?7 K! m& V4 A( h3 ^6 }: @( E
 
 $ {* g1 k7 ^1 S' P% i- [! estatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' F" u0 E, }; ?9 U
 .leds = da850_evm_tl_leds,
 7 A& T: j$ z- X+ H+ u        .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
 : z; c( A& T0 N/ I. q};6 i. y/ \1 L2 Z1 r/ F+ w
 4 r  u( ?" |) C3 i; e
 static void led_dev_release(struct device *dev)7 K; L5 |8 W' j
 {* R2 A. ~: i# Q0 T' j: j& m
 };: I1 v( ^( t7 ?* F0 t0 [
 & m' H0 z3 \  R+ U( T( \- l! Z( g
 static struct platform_device da850_evm_tl_leds_device = {
 . D# T7 N: c5 E; `, ~* c        .name                = "leds-gpio",8 A5 y1 D5 z) Q1 a7 Y% F! p, Z, s$ @
 .id                = 1,
 2 x' e+ e4 g1 v" A/ B/ u( Q        .dev = {
 2 I) ^! A* d; a( s, u                .platform_data = &da850_evm_tl_leds_pdata,
 3 R0 H$ y. K6 g' |8 z6 P# q! n3 K                .release = led_dev_release,
 8 e" y1 L2 e  O" D, m7 D% S  y. n" N        }2 A1 Q8 V+ H/ A/ ^# Y( O
 };5 V) w$ E1 P: S, [# R
 
 * a, f9 n3 L0 ^  Pstatic int __init led_platform_init(void)
 5 `( `* N9 W* @, o. P' a{! b5 N, _8 C- z! y& f" w1 j: `
 int ret;8 @; R- O1 ?# [
 #if 0
 & ]4 `! j  Y  P- E+ C  P        ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);5 {  S7 u; l& m& n$ ?8 D% ?
 if (ret)
 3 R) z% R8 q3 V                pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
 ; C/ D: O& C1 h' A+ t" T/ I                                "%d\n", ret);
 0 X3 A7 v7 }  [/ _#endif
 ! b: t) {- Z  N9 z1 m- w% J        ret = platform_device_register(&da850_evm_tl_leds_device);
 ( T. w3 ~* @! j: u  w$ }2 p; K        if (ret)
 3 E' t# v+ i1 A! w                pr_warning("Could not register som GPIO expander LEDS");- D3 X5 j8 }$ M
 else: j( R; b4 T9 k: d# B
 printk(KERN_INFO "LED register sucessful!\n");
 1 {( ^# U0 P1 }5 M0 z5 v& `+ X+ C' H& O/ a/ r* I
 return ret;
 0 t! x  Y$ s% b& U}( h' i0 t2 f4 k+ ]
 ; d) C9 R2 A5 y5 p7 u
 static void __exit led_platform_exit(void)
 # m0 M0 B* T% Z{9 x' g% {+ Y1 X" V
 platform_device_unregister(&da850_evm_tl_leds_device);
 # e7 T2 |5 M7 `' ?
 8 t2 ^( Q" ^; h. h' w: k        printk(KERN_INFO "LED unregister!\n");
 7 t  ~! F- R" P# A}$ d+ _- C1 Q: h, x
 
 . G! g  Y- M' ?& C" ^: Amodule_init(led_platform_init);. q9 ]( ?  Q3 q' O3 J0 i
 module_exit(led_platform_exit);
 ' z' H. }  J  l& ?  a
 # v4 Q% e) a# V1 @- Y. E! OMODULE_DESCRIPTION("Led platform driver");
 9 h  v0 D7 W" X' U! zMODULE_AUTHOR("Tronlong");
 ( T  P; ?3 I! {% {, ~MODULE_LICENSE("GPL");
 0 g  ]/ ^# D& p0 x, ^
 + _, A: T1 z, J2 H. Y8 I& P
 | 
 |