|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% u" v! s! m$ J# u3 i#include <linux/init.h>
( {% P2 `$ }6 X# d" v9 g" v' g#include <linux/module.h>1 V; A. F. j' ?% k$ u; U) g8 o: g1 P
#include <linux/kernel.h>
% X& a5 y& c$ M& N5 \( u5 U#include <linux/types.h>
2 c* E5 m. E- O' |" V: v8 i8 U#include <linux/gpio.h>
8 ^# i- l2 @* z7 w+ J+ U#include <linux/leds.h>5 E* {/ M8 n( y k; j& v
#include <linux/platform_device.h>
# |% ?& ` @. I7 s1 i' g' z( y; |" T z% a$ g+ E$ k3 }
#include <asm/mach-types.h>
d- d, b% `4 l. ~#include <asm/mach/arch.h>4 R0 s. m& A( r) Z
#include <mach/da8xx.h>
. Y) \+ e5 v7 {# n. j _5 F, d" D+ ^) I# |) w#include <mach/mux.h>
~' `. z1 P% ]: f& I" T9 K3 C+ a5 Z& k* g$ R- v- s* A; N5 ]4 D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& m4 _: S; L: S% P7 l) v$ J
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, C# O& |3 a! x1 v: }6 @$ Y#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 M' K3 w- J$ Z0 f" @. T#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)4 J$ V) t. a3 i) I! d2 N* }
& k# `" P% x+ W$ e
/* assign the tl som board LED-GPIOs*/
$ Y& y; b0 x8 Z9 T6 K& T1 }static const short da850_evm_tl_user_led_pins[] = {( w/ r5 X& V% G* E
/* These pins are definition at <mach/mux.h> file */
* m6 ?9 Z" O& H8 L( ~6 B DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! \$ U, d0 g) t4 R0 D3 V% z
-15 H6 \% ]3 S2 a5 t2 M8 M
};7 j' \" S4 [* x+ K5 K+ z3 H& U
' B" A) A" V/ O4 |/ V/ P X9 `7 A q
static struct gpio_led da850_evm_tl_leds[] = {" ]7 N+ H7 B7 X5 @! w
{
; G* H1 y: h. ?9 ]4 | .active_low = 0,! F" ^9 D% R, w2 @6 [! T
.gpio = DA850_USER_LED0,* i2 D8 X/ f) J$ F7 J2 q4 a \3 o
.name = "user_led0",% y! M3 ~% @! r6 v8 Z6 Y
.default_trigger = "default-on",) r, \; r; W* K. h7 j0 H# h* w
},( l# |$ ?7 W. T+ V3 F# \5 L4 g8 [
{# D) V2 x0 q6 @- P0 b* O9 ~- \; B
.active_low = 0,# U J7 `' l* y3 e2 w
.gpio = DA850_USER_LED1,
& l1 V+ T# | | ?' _$ a .name = "user_led1",% B- [3 ] H0 R! {9 M2 x
.default_trigger = "default-on",1 I7 h- T9 O; F* J. f2 L
},
( A1 j) K% L' _! {2 n {9 g! E7 a2 Q3 p
.active_low = 0," R+ J+ }) a3 @/ A
.gpio = DA850_USER_LED2,
# y+ L! O: u8 p .name = "user_led2",2 q' E: \/ O; D/ Y- }+ z; E) \' F
.default_trigger = "default-on",4 v5 s0 @( Z; o, g4 s7 ?2 h
},
7 F3 V( G7 ] J/ J( o" n {" m* v ~+ t! a! K# }; z% v
.active_low = 0,7 F a( X5 n: O' G* l: }
.gpio = DA850_USER_LED3,
5 m$ d6 r/ I& b5 @; k& f .name = "user_led3",$ a0 \. x$ J, P
.default_trigger = "default-on",+ C+ E! m4 X# q( y6 O5 n
},
5 A) \6 y4 T! n m4 _};3 e. _! N7 T( J% |
' s+ Y" J; H1 Y. a' i: M( a) O# ~
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
& d1 |6 l) ?6 a% g' X .leds = da850_evm_tl_leds,2 A4 L& `! q4 w0 M" Z0 ~0 Q
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),* |) v1 |- d' }8 a- S
};8 B! a+ a( c7 w: h
, i8 y4 w3 ~2 K- Z0 Jstatic void led_dev_release(struct device *dev)0 S; ^+ P; X) C; o
{8 K: Y1 N! @- ]$ c/ A2 o
};% {; S7 I& b0 i4 J( |6 P$ ^! i4 V7 w
8 p- F+ U( y- P
static struct platform_device da850_evm_tl_leds_device = {
6 { K" y/ i6 l) ]) g. b+ y .name = "leds-gpio",3 b- K( x$ L7 R2 {
.id = 1,+ S |0 L! {0 ]2 q0 |
.dev = {
1 W8 g' a, A n Q' T .platform_data = &da850_evm_tl_leds_pdata,6 ]" v8 f! G) m e
.release = led_dev_release,5 J2 i. N5 ^" Z! E
}
2 c( w }1 ?+ r# D! ?};
1 Q m4 L0 S1 O4 y7 A/ m
) D" R7 J; `6 q7 |$ g7 _# L% D V7 I. rstatic int __init led_platform_init(void)! }: }7 @% T. Y; ]& Z( K
{
1 w( A/ G: j' A+ p, v5 s; } int ret;- D. i3 M9 d$ w1 d* A( k) }
#if 02 _7 W5 j Y; U. x! U" m9 Y
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 w5 g3 d( W# W# f% g6 Q
if (ret)
2 X: G) x9 S7 E/ e pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 @# y# Q. {0 d
"%d\n", ret);
0 ?; ?! V, x; g+ o6 }8 j#endif
2 v; ]' L4 M |' H ret = platform_device_register(&da850_evm_tl_leds_device);
# B: g/ H1 @& i7 N$ ~" B, F/ d if (ret)
% j! G3 i8 V6 O+ n pr_warning("Could not register som GPIO expander LEDS");
0 I! S6 u" G( F, b else4 q4 U. P- d/ P, f
printk(KERN_INFO "LED register sucessful!\n");
8 \3 s4 ?( D) Z' M) H/ e$ I
, _9 ^) q0 @( s/ A5 \2 J return ret;
; G y$ n$ k* ?}3 A/ `3 R# Q' H7 M l2 y
9 x+ x9 o- y3 E. Dstatic void __exit led_platform_exit(void)+ E, s$ r3 \! e8 w' W* @2 N
{! z) m7 n- x4 s. K
platform_device_unregister(&da850_evm_tl_leds_device);3 O; K8 L# O; j6 W
* x) ]9 _' `; M- q& v printk(KERN_INFO "LED unregister!\n");
; T$ ^( H" }" ?+ U! H5 E5 L}1 A5 T1 ]4 n/ z/ J- ~7 Z
" S/ `4 {# ]7 u0 ?7 i
module_init(led_platform_init);3 u7 [. E8 ]$ p. o4 z4 t
module_exit(led_platform_exit);# f0 A+ b) b [& t
9 b8 O4 l; w7 G' S) z" IMODULE_DESCRIPTION("Led platform driver");4 H, g# ^+ }' X* W \( S/ c
MODULE_AUTHOR("Tronlong");& l5 V1 l5 C8 ~/ Z
MODULE_LICENSE("GPL");% Y' N# m- b1 K% x) H8 z! N
~; M2 o# X9 ]& @0 T/ b |
|