|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ A6 [3 r' _" I5 z5 u#include <linux/init.h>, D* v+ I7 a5 ~! P a: U8 b& a/ t
#include <linux/module.h>) p$ G/ F( h! t) `6 ]
#include <linux/kernel.h>6 E+ v' P- A, \+ N/ z
#include <linux/types.h>* H- M& H2 H, n
#include <linux/gpio.h>* l# W: F5 m) p6 H# t8 Z2 e# s
#include <linux/leds.h>
5 C b: x* ?6 Y, m#include <linux/platform_device.h>
, c2 C6 F5 W; Q: V! u. b" U7 b0 m* }$ j' x; ~! a; o
#include <asm/mach-types.h>+ D! G; P" l3 v* o
#include <asm/mach/arch.h>
! b: u( X7 P' V#include <mach/da8xx.h>* _0 D7 b) y7 }. B( D0 c" e" @
#include <mach/mux.h>
) o# l2 w+ n3 ]% A7 y: m/ ~& ^& v5 I1 s! b2 ?
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* t& O8 Z E, T5 s
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) c0 J; e! y3 G
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1) T" d) d- ^- J! F, a* ]
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): b6 Y$ D1 B( | B
! f2 w6 ^8 e6 Z6 y8 r
/* assign the tl som board LED-GPIOs*/
8 i. i/ U6 @( f" u( O1 L9 Vstatic const short da850_evm_tl_user_led_pins[] = {8 G6 S! o M$ L, K
/* These pins are definition at <mach/mux.h> file */4 k& N( }9 o: p, _* |; |4 _& b& l
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
2 B% e, |! Y Y. v4 u, r# X -1
& _- `! a" E, Y};
4 X" B& F% p' S/ ~: D# D ^: a4 y9 b* L: r
static struct gpio_led da850_evm_tl_leds[] = {1 E v6 U) |' S: t: l% }
{3 A* q8 e( D k! @+ u. L+ b) d% ]
.active_low = 0,
4 H6 z; p' d( r" g3 d" N- R6 w .gpio = DA850_USER_LED0,! T1 M9 s6 L: _
.name = "user_led0",1 R" P$ H+ a+ Y \. i( M
.default_trigger = "default-on",
2 H( I5 i% j+ j7 o6 G; S( T# M* W },
m* v& p; ~* b2 r$ Q. D c {+ I! h$ H$ f$ Q* p3 D
.active_low = 0,
; [$ X# m7 Y9 u1 k- }6 Q .gpio = DA850_USER_LED1,& e" H/ Z) O% c
.name = "user_led1",' n. G1 e6 p9 H' \6 B8 t# f/ [# J
.default_trigger = "default-on",( _+ G& f! h; p' \- O1 a; O
},
6 p3 `/ g! G+ `0 I: D* T. g {
@: n' B2 e8 U3 D+ K .active_low = 0,& O. m0 l- @& n a7 Q
.gpio = DA850_USER_LED2,# t5 |. @+ x4 q+ D. C
.name = "user_led2",
$ m0 I* J! s5 V- Q9 b( K% u9 K .default_trigger = "default-on",- G l d, V. h' K- ^
},
. s! e1 |$ U- ^( ^: J6 n {6 q- l! D" z9 z
.active_low = 0,) z4 C! \4 t5 n5 w5 b& t3 c' G4 H
.gpio = DA850_USER_LED3,
! _* i' i3 V) k" G- ^+ E .name = "user_led3",
+ v j; z `) N( ~7 V .default_trigger = "default-on",
. I7 L; ^( y3 r/ k },
/ p* A: c6 h6 v};
3 d$ _! m+ d2 K/ D6 C* E( p9 s* p& t7 q$ k, K$ h
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
1 l4 V. _1 k ]% P$ O/ `: w& f .leds = da850_evm_tl_leds,
, ~8 s" V% H4 ] .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
Q% y& j- j( ?: ~$ V};
& T# {: m# e/ P+ y% k9 C( @ k1 z6 A6 o4 j; v& m, W
static void led_dev_release(struct device *dev); ]& E0 w4 F. V- m" S( x2 ?
{
! X! l$ m' [3 W7 p1 p D};3 \0 N4 N1 a; r7 g% j
1 D# r$ o/ X$ z5 d9 q U. E
static struct platform_device da850_evm_tl_leds_device = {
: t0 \ b) d' a6 A .name = "leds-gpio",
# q- u9 F. r0 a3 N1 K$ f9 R .id = 1,' i) s; g; H1 g" ^. x8 X
.dev = {5 M+ ]& L k& G! ^' X
.platform_data = &da850_evm_tl_leds_pdata,
" F+ f* L" e& r9 W .release = led_dev_release,
) H2 r% L/ q6 ~ }* d- r; E# k/ m6 X! U% z
};
; G( U1 C8 U& e, R( Q8 m* C4 K# @+ W! ^ w: F$ `( i( B/ X
static int __init led_platform_init(void)
- g/ @; @: B* f8 z0 D{
+ f8 {0 N. ^8 [0 z E2 v int ret;
! c* I8 I* X- F `#if 0. W6 c; y8 u2 v) w
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 C" i# i; o' A) } if (ret)
+ _% e6 q& w- C# v1 u pr_warning("da850_evm_tl_leds_init : User LED mux failed :"1 f3 R' X% r8 u- f! U8 L
"%d\n", ret); Y3 s! l! E6 X
#endif
' u7 I4 O5 W9 J ret = platform_device_register(&da850_evm_tl_leds_device);+ O; Y) p- V9 n2 n
if (ret)
8 H; ]; r9 v8 W% A: |) q pr_warning("Could not register som GPIO expander LEDS");
9 {$ Q* j% N, [, s1 J6 U: h else; t; }5 ^+ H! z4 u) r+ ]. @
printk(KERN_INFO "LED register sucessful!\n");; J4 F+ U3 I8 z' n7 g
/ S/ l1 r4 `! E0 n- ] return ret;
2 ^; w" K0 o! V5 D4 E}
0 R0 C4 \: E, G0 n' Y
/ ?' f2 m- G5 @; y2 x) G) Lstatic void __exit led_platform_exit(void)6 Z; t6 E# v5 k1 U; _
{( d" A# P( S4 u) G
platform_device_unregister(&da850_evm_tl_leds_device);
" y8 g0 n; f9 v: G. j6 `) K8 ~
` q9 n3 f0 q- T2 ]$ p printk(KERN_INFO "LED unregister!\n");6 l3 C3 M# Q$ J
}* ?; A0 p; {7 f3 O7 y
& U7 B5 P4 n: \* W+ O$ D; E3 Pmodule_init(led_platform_init);
# G2 t- C$ }) s* S8 \module_exit(led_platform_exit);
! C1 X6 q; H3 ^8 ]! a
n g/ C* J, o8 K& \& _9 ~( W. aMODULE_DESCRIPTION("Led platform driver");
- B7 C5 f( D2 H/ b, A# {! l# J4 G! pMODULE_AUTHOR("Tronlong");
2 J1 m$ A. `$ j8 C2 Z/ h' G$ G3 |MODULE_LICENSE("GPL");
; ~6 s: N+ Z. C- S6 c2 t7 V
+ I x; j; v- m% t |
|