|
|
求大神给下面的程序做注解,请稍详细些,谢谢。0 z p( N S5 W/ a2 t# `+ f
#include <linux/init.h>$ E( X; R) A8 l
#include <linux/module.h> W/ a+ M0 U! {3 a x, i! i
#include <linux/kernel.h>
/ B( k/ V+ e. ]' r& M#include <linux/types.h>
- i/ |0 o( Z2 n; k! w+ f#include <linux/gpio.h>
/ ^: v0 Y! L4 o. ^% i" W9 ]#include <linux/leds.h>
, r B. U j% Q- f: }2 t#include <linux/platform_device.h>8 q9 T( L3 R* Y
# c6 p% R7 j0 \#include <asm/mach-types.h>0 m: q; R( s+ Y7 f5 H! [6 f
#include <asm/mach/arch.h>
# b( o. C4 f0 b/ k3 \5 A! s#include <mach/da8xx.h>
" i- a9 h3 o5 O, k4 {0 D#include <mach/mux.h>
" ? O* P0 T5 a8 X+ J8 s; A( {& U4 F3 W
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)# P% B0 Z! b6 E$ s
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 m& {# Q0 d2 d. k
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 C/ r9 O: n7 d6 y+ x' Z. p
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
0 v4 e6 O* Z7 _
* C7 g% a+ p& s& r( D/* assign the tl som board LED-GPIOs*/
. ~" \5 o2 H1 p. d9 \* @static const short da850_evm_tl_user_led_pins[] = {
$ n9 U# s) f$ t5 c4 A5 {! S /* These pins are definition at <mach/mux.h> file */
# D0 K/ M- ~0 f, w% b- v DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,: F* }4 Y6 z4 @6 u
-1
: M; d4 \ d8 [. U};
' m2 _# \' J! p+ f$ s8 h* L0 Q, |$ a+ I' H1 x1 S6 G
static struct gpio_led da850_evm_tl_leds[] = { U7 P' Y* Y: g! s0 W# C
{
" C0 r) W1 V: K7 [- q( o, a: l .active_low = 0,
/ X1 X$ ^- U7 z) \8 A .gpio = DA850_USER_LED0,
9 j/ i# c; Y) }8 k' u" h2 s0 K" v .name = "user_led0",
/ [1 {; J" X" t0 e; p .default_trigger = "default-on",
) a9 a; m: n( n* K },
- D( D/ ~; X9 q {
5 q7 i r- k, y9 x .active_low = 0,
; ?2 Q! M- t1 H .gpio = DA850_USER_LED1,
, C7 Q, u' L/ l5 V .name = "user_led1",
; H$ U" x) d$ S; a2 | .default_trigger = "default-on",# o6 g2 S3 @7 ]9 \2 P4 s3 o8 I
},3 a3 X( `. L: s. |, A3 Y* i
{
8 L& h& I, e$ j; G B" g0 H .active_low = 0,
+ a& Y% y% S; R+ l e .gpio = DA850_USER_LED2,
+ p& n4 q4 o! F: T' P- a; K6 x .name = "user_led2",4 h' I5 p2 k+ o) @0 F% @
.default_trigger = "default-on",
q1 R0 g" \$ z- j! b* L },# K7 g6 |: Z" J k9 s. Q5 C2 t5 H. |
{
- m0 `# g% x" c5 b' a6 ?! a .active_low = 0,
- F3 N! ^& m( v0 G# U$ O .gpio = DA850_USER_LED3,
* C3 [: d: t* P( ^( l .name = "user_led3",
6 K9 @7 G5 t, k( E" t3 u; t9 A% f H M .default_trigger = "default-on",
7 C6 z( s4 Q6 D },8 Z3 }) u z. g% [$ N, J4 @- Y
};
- l& ~8 C9 y9 K& w
# I1 i( G% V7 x: F) R/ @1 rstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
! r% t, W% M( y3 ?) K9 n .leds = da850_evm_tl_leds,
' S% k% g& m; u+ N6 ] .num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 u j/ F, j+ L( C; }
};
0 O( {# O l" l. s2 e* x
+ Z; I" n. C4 z `$ ]: U9 @' zstatic void led_dev_release(struct device *dev)
( a$ \% S1 W9 E- u, A{ {* G z' a, B- [5 `& |6 U
};
. V) K- X) P0 i, A" R2 t1 e; `+ ?
2 Y. _! L( Z' {; C2 y4 O0 {. cstatic struct platform_device da850_evm_tl_leds_device = {+ q2 I: f8 u7 X7 E) \% |
.name = "leds-gpio",! {. A& {. Q) O! h s2 H
.id = 1,! o1 a8 y4 j6 G( M
.dev = {6 \- K8 ^8 G3 q, E" j4 e
.platform_data = &da850_evm_tl_leds_pdata,$ `9 D. ^& r/ j. N
.release = led_dev_release,
! |/ ]1 G9 o/ h; k6 J }
! b4 H0 s3 Y+ R: L6 l};
; [4 z$ P G5 ~( v- @3 T0 U1 W) R/ z+ k. ]0 e/ }
static int __init led_platform_init(void)
6 J+ A( m7 w1 _{# ]5 [$ Q2 O7 _' j' g$ t
int ret;% n. w/ q: [+ G. N0 T8 U
#if 0+ i9 U8 x }# h- y$ E! j$ P
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);- t0 B5 K( ^- Z
if (ret)
7 `: u' d& g1 a8 v$ g( j# \ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"+ G, C0 U5 P1 f8 {
"%d\n", ret);
+ {0 h c! U: s. G; v# n& b#endif6 z* `$ {5 ]9 \; O
ret = platform_device_register(&da850_evm_tl_leds_device);! O' s% C* [4 }1 F1 A b
if (ret)6 g6 D1 K) m7 |; x2 `6 Y! ^
pr_warning("Could not register som GPIO expander LEDS");
$ Z# S8 M1 T5 F: [ else
) C7 g1 t7 S6 j0 a: o printk(KERN_INFO "LED register sucessful!\n");1 q x9 K: h$ {
9 f( }6 i) e3 W7 A return ret;$ `. x; t0 L, d" r; S8 J* W& t
}
$ d- i" s; D9 v; m; U! s, a3 ]6 T
8 R3 y0 z$ a: i4 G& i }0 v5 Lstatic void __exit led_platform_exit(void)# }& H V8 T. M
{
( i: ]- \6 p' v( J* |9 z platform_device_unregister(&da850_evm_tl_leds_device);4 }( E9 X& v& a" o/ P- o$ X2 f. q
7 x0 |# C1 X/ q1 V' V9 j P
printk(KERN_INFO "LED unregister!\n");+ O) C6 |: H9 F; d) [( v
}
7 b9 W2 F# @. v' d6 D9 ~& {+ _5 v
9 O- e- X. I& |' s0 v# smodule_init(led_platform_init);; R& E' G4 [& Z6 n( t7 C1 }" U9 M
module_exit(led_platform_exit);
$ Q: W1 r0 \& A; @+ I5 F8 S4 k3 v
9 [" n4 i. D h' m' @. a! RMODULE_DESCRIPTION("Led platform driver");. h1 p5 B! c7 {2 `* h' x2 j* F
MODULE_AUTHOR("Tronlong");
0 W& Q/ |6 Q( y4 UMODULE_LICENSE("GPL");
! H% \) T" v6 y0 w- Y0 b) j. V
% J8 }9 ~/ j+ E ~2 ^. s3 x, z |
|