|
|
求大神给下面的程序做注解,请稍详细些,谢谢。! ?7 j& Z1 e$ t M
#include <linux/init.h>
& N) @' S+ s+ j#include <linux/module.h>
, `3 g* {; b. Y' d# a9 { J* m#include <linux/kernel.h> o- E2 D; t! B$ q
#include <linux/types.h>
/ @' p) r3 i5 r' F K#include <linux/gpio.h>
% Q8 i0 V- g6 z* K6 e#include <linux/leds.h>( K3 Y2 B7 T( h. {8 Q- L$ c u
#include <linux/platform_device.h>
1 b$ S* h; g: d, a. ^1 i! Q' Z) W- T' R8 Y
#include <asm/mach-types.h>
: S! [ i: s, p- ]# R1 d0 B3 b$ C#include <asm/mach/arch.h>1 }9 N1 f( ]' d. p- h! ^" s
#include <mach/da8xx.h>
$ s# S8 `# X l2 M3 @#include <mach/mux.h>2 G, D5 \" q1 P6 [4 g' A2 o7 j/ P: H
: S5 Q1 I4 I4 c+ s1 r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) t9 U1 g. h6 C% G! g& H. X Y#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
( {- b; A) c+ a+ b#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)' j4 G8 l! \+ m
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
i8 A1 C; r4 R' ~# d t4 a1 U- h e$ X. H: {+ T8 j- J
/* assign the tl som board LED-GPIOs*/
% Z9 J1 T8 @$ vstatic const short da850_evm_tl_user_led_pins[] = {
* _; P8 `7 q5 N& R /* These pins are definition at <mach/mux.h> file */
2 c" w; J( d: }# M DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,8 O: {4 ~& w2 _. D* I
-1
. I" j2 g0 X; g$ H$ o};
) v( a- X" l1 e$ C: {) l ]3 {0 R1 ?! N' v8 C p
static struct gpio_led da850_evm_tl_leds[] = {% f$ E4 ^2 ?, o& C/ A% h9 j ^
{
% }6 W3 R" ~& e5 S3 H! k .active_low = 0,
8 D2 }" Q' s7 j/ c .gpio = DA850_USER_LED0,* m+ S# ?% u* F9 Z" M/ o8 d
.name = "user_led0",$ v+ b3 k/ q) G
.default_trigger = "default-on",
8 x8 M( z' b) k, [5 Y2 S' d- Q) M2 J5 V },4 Z, f- k6 A+ ?4 E6 r+ n) q4 h
{3 X) f% A8 H% E6 A; i
.active_low = 0,: h1 {7 |* e3 d j0 p! G( i6 l: X
.gpio = DA850_USER_LED1,
/ F, b$ n% ?* ~' M" o1 {9 k* x9 Z .name = "user_led1",
0 b4 i9 a2 ^& J& y/ @+ A5 n .default_trigger = "default-on",- S. _1 k/ e% h& m, E# M+ j
},2 a2 R# I# f; \* u0 ]
{& ?0 z/ J/ D( n
.active_low = 0,
5 \7 Z* g8 [1 k, V8 x .gpio = DA850_USER_LED2,
; A. K0 f6 r1 p5 g* V .name = "user_led2",
" i6 w( M& N# j) v" g$ F* X3 U5 u .default_trigger = "default-on",) w% a# c9 j5 S& t# C$ u
},/ @, K( [7 R/ u" z8 t L( @
{4 v* l2 a+ `9 M% I
.active_low = 0,3 r+ ~3 R: F9 Z
.gpio = DA850_USER_LED3,* P$ `% m8 \7 S& b
.name = "user_led3",; e, y5 N+ o! n0 g% K
.default_trigger = "default-on",
$ |" v& O5 v" Y7 ? },& N$ {& O- s. ?8 N1 k9 \
};4 U; f1 a/ ]! X. {$ _( E
; L' {1 M; B( N I9 n3 kstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, m3 b' B. H, i) W( b. o .leds = da850_evm_tl_leds,) b; {" m2 ?4 d$ c" D
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),6 ~/ Z. ? N0 \5 H
};4 | _! `9 ^+ P* E. ^4 D
* }( O; a5 d& ]
static void led_dev_release(struct device *dev)
W- C8 a3 [, \{* J. x. C1 @3 ]; v3 V- o
};
+ t, V* Y; O: W4 F) v0 _7 B7 \# z/ |
static struct platform_device da850_evm_tl_leds_device = {# c3 @- ]. X$ r: p1 y8 S
.name = "leds-gpio",
0 @) v% b' [& R+ O- z .id = 1,
, O- o X; ]6 @7 E3 h1 y .dev = {
V3 |9 `. I' H& V P$ F+ C1 Z .platform_data = &da850_evm_tl_leds_pdata,1 K/ e) H Z6 A
.release = led_dev_release,
( T/ R: g! v. y" q1 ^& z4 d }! e0 \* z( u4 u
};
3 t- Z5 p3 Y( E8 s- Z1 o( Y( y
8 s v; p2 q% ustatic int __init led_platform_init(void)
2 j6 V: ], T% D; e5 k# Z' l1 ]/ K{: b4 ?2 c* i5 b
int ret;
6 @5 h9 }; y% O, ^$ X; A#if 0
1 N D( L% Y, b5 f& C ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
# Q u+ g3 [, f2 v* c7 N K- a3 ` if (ret): g* S7 e6 U' O7 E. L
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
r7 F1 m& A6 m4 I/ B4 u. p "%d\n", ret);8 I" _% z2 |( P9 \, H/ k9 Y) D
#endif+ Y$ |# }9 V6 t# ]3 E% Z* e' n+ |
ret = platform_device_register(&da850_evm_tl_leds_device);
$ g" z/ S( i% X; D/ l if (ret)- x, l2 E, ~6 I( N0 g! D4 S m
pr_warning("Could not register som GPIO expander LEDS");3 E, i$ Z0 g# r3 l8 m
else
' W; ]. U; r" { printk(KERN_INFO "LED register sucessful!\n");# Z7 Y6 q6 C( _9 J4 W
8 |3 C' \! w- w( T( d: Q5 I1 t
return ret;
' A3 m7 Q7 ?$ d/ ]9 ^}
5 {! Y0 o6 o1 p, A+ d8 t E- X- R; w1 ]( W* @
static void __exit led_platform_exit(void)+ j- G* G0 n7 x. z
{$ U8 M$ K* W+ r1 n# \; v
platform_device_unregister(&da850_evm_tl_leds_device);
* V' A" V* U( R1 h* ]+ Z k N; v+ x, v) C; ~/ `
printk(KERN_INFO "LED unregister!\n");) v# W7 X& W0 i( e: T
}
( P- s, q& Y% |+ s$ ^$ x% R
, c0 T6 s3 z% x0 i) I. j/ [$ cmodule_init(led_platform_init);" m6 s& L7 e8 i0 I# v- G! Y& B
module_exit(led_platform_exit);
. n& }# ^5 ^( n2 M9 _' \% t0 O' c' ?
MODULE_DESCRIPTION("Led platform driver");+ Y( E% ~) r$ t @
MODULE_AUTHOR("Tronlong");2 w' W, \2 S" B3 d0 \7 P
MODULE_LICENSE("GPL");
7 [ d Y* s0 n2 Z+ ` }& M! I; B# T& x# `
|
|