|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ z; u N: W5 {/ e0 `5 q2 L" ?# U# A#include <linux/init.h>
- m/ d0 m! Q5 p& b; j {3 D) r* ~#include <linux/module.h>
1 z* Q7 q# I' b* o0 f#include <linux/kernel.h># X# C* L. {& E7 X( ?" u
#include <linux/types.h>' Y: F, h# |2 c$ e$ R
#include <linux/gpio.h>
( @) ^, k2 ^/ u#include <linux/leds.h>
) i2 A$ }8 s1 L9 a#include <linux/platform_device.h>
) q/ f* E! a. m' L7 c1 u$ I! R2 [7 _$ n9 [2 P1 B$ A- k
#include <asm/mach-types.h>/ ?! s+ ?& \1 I" [* G
#include <asm/mach/arch.h>2 F( F( @" |& F! N5 U1 s# P/ q
#include <mach/da8xx.h>
: A, r8 @& J( \7 B: L#include <mach/mux.h>4 H4 {# h* |8 P( v- N" w
0 X8 C9 m: N7 c8 H& {2 G0 L#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
; U6 Z" X7 y8 T; U$ W i9 C- s#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
; g& R4 {1 {) I1 I. |#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)/ N% T% g: G M9 p5 _
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- b; R. O: k& o j5 Z
* k8 H& B3 y1 Y* N5 M/* assign the tl som board LED-GPIOs*/: D; }" T5 Q8 c5 \ T# \* g& i1 Y# r
static const short da850_evm_tl_user_led_pins[] = {3 {! F( s8 `! b& c4 g
/* These pins are definition at <mach/mux.h> file */4 i4 m; S) b* I4 B$ K/ l, ]
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
6 x9 ?8 x" m# M- c( i7 o- } -1
& p5 W8 Y" {1 T2 Y7 C5 [};$ x5 T, P/ e1 t# I/ F$ ~: s
3 x" k1 q; @- [2 q1 ^: p) r: p: Ystatic struct gpio_led da850_evm_tl_leds[] = {
3 k* b& K1 i# T3 R6 v( j {# ?% j: z2 r7 K, C
.active_low = 0,
: t% J# _$ K" C% @! ^: @ .gpio = DA850_USER_LED0,+ X) R. j6 V2 L+ w. d: d5 r+ b
.name = "user_led0",* V) E+ l3 n/ c. S* `4 M% C
.default_trigger = "default-on",. X* M J5 b) A4 M
},
7 l) Q2 p: A& r N* b {' {, d4 t/ {( L0 |0 G: p
.active_low = 0,7 @8 F8 S; T& b1 U4 H: C
.gpio = DA850_USER_LED1,
% D0 U- J% X: ]* | .name = "user_led1"," X' @4 {' W) _. `1 ?4 m5 J
.default_trigger = "default-on",. y# ?3 ^6 g( K
},
3 e, a- `3 G1 H# g1 C$ { {! ~6 X$ N- K0 P' E
.active_low = 0,
4 y: V1 G6 v' J: z1 J .gpio = DA850_USER_LED2,
6 m+ w6 I. a5 n9 j* w: e7 x b .name = "user_led2",
3 v5 L* @4 c2 a N' _9 T .default_trigger = "default-on",1 N/ u. ^* q4 j7 |7 a
},
6 t0 }$ O# n) }+ M; _: R* p, } {
! X+ m$ ^ @( e, ?/ x- ~% B .active_low = 0,7 O/ ^4 t- H7 {! v
.gpio = DA850_USER_LED3,
$ r; b* c$ `! q6 P; p .name = "user_led3",4 T' l% V {- J( x
.default_trigger = "default-on",
( t+ M# r, Q0 ]5 X& S3 @ }, i2 K& X1 ? t" i
};% p5 b, R5 S* g/ O8 F" a( x3 V) V
8 t" E9 [. i! r$ b! N# L% c
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ s; V* Z/ b& q4 f2 Y7 {
.leds = da850_evm_tl_leds,4 p/ l! T5 U; u+ |/ p
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),# E* F/ y! _6 H8 V' {
};
# r3 f+ [; L2 h2 [9 {/ a* |% J: H3 e7 ~, W
static void led_dev_release(struct device *dev)
& j& m7 t1 f6 p{
1 O& ^, N$ x& ?$ i' v$ `: M1 K, [7 q# v};% ^8 c" `3 @ B' c9 c$ }( Y# e
: d$ x. i( ] a; {/ Z. o1 S
static struct platform_device da850_evm_tl_leds_device = {
; r6 \6 j0 ~* J# y .name = "leds-gpio",
5 c, F }1 R, l) _# W .id = 1,% A" R3 b4 C5 K
.dev = {) M8 m4 d5 X# P" x/ Q1 H4 ^* ]
.platform_data = &da850_evm_tl_leds_pdata,
* |/ M* F3 `! m: Y3 } .release = led_dev_release,
) T3 y! C+ b; ` }# m* N: @" b. G
};5 _; i( S8 z: C8 x# M2 s
, \; V5 l7 K, T6 u2 E( h
static int __init led_platform_init(void)
1 G" I9 ?* X0 _6 V" o& f0 x1 k{
2 A! C' ~+ }% W( y int ret;8 I$ W' [9 N4 l' F+ Y0 j) @
#if 0 Y$ [2 T1 _% W, `3 B. O
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); \ c+ J# X/ ? r+ S
if (ret)
% w$ L: t) P( V+ Q pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
& p% U2 N( p9 n l7 E( s "%d\n", ret);/ s6 Y: a* s- `/ v+ t: g
#endif
0 ~( `6 H4 ~+ R: R( ?" l. Y9 `8 Y ret = platform_device_register(&da850_evm_tl_leds_device);
. x6 {+ c2 P' O+ T( t- } if (ret)- q1 z2 t4 E6 D4 ?$ E4 [- c
pr_warning("Could not register som GPIO expander LEDS");( L( ~) U: j8 D. w+ n( q! b& Q
else" @9 o! C. V2 \8 z9 m* C
printk(KERN_INFO "LED register sucessful!\n");
8 n/ I+ x6 x) v0 l& r9 n) H& B- @7 h7 K9 T( n
return ret;
9 f% F$ g' C8 S5 z2 e}, r; }) n: G! O4 P+ `9 n* V. \5 F
! ?8 O% v! L+ m; w$ ]* u" E' m. ?static void __exit led_platform_exit(void)
( X% R, q$ J2 J5 l/ k" g' n! {5 J{+ @5 y2 W0 p5 m# i
platform_device_unregister(&da850_evm_tl_leds_device);
3 o( R2 Y' c- |- G
# A! X/ Y' j1 v$ {% c" H printk(KERN_INFO "LED unregister!\n");+ g( D9 g" H5 ~/ H0 Y
}) S/ A! _3 p, l) {: z( A: M; {
+ _5 x- A0 r. X0 X7 p" D
module_init(led_platform_init);
- N. ^5 R) H( Q! q1 zmodule_exit(led_platform_exit);$ P( L+ ]8 Q! K+ `
4 {5 Z$ l; H3 o; r& FMODULE_DESCRIPTION("Led platform driver");2 e3 V, k# D7 a' q4 N: K9 H4 V
MODULE_AUTHOR("Tronlong");& q- ^' ~; \' l+ E4 j
MODULE_LICENSE("GPL");8 R0 h, y+ ^* i
( l( E7 F9 N$ L8 O
|
|