|
求大神给下面的程序做注解,请稍详细些,谢谢。% P( u, ~! \- F+ M2 ]
#include <linux/init.h>
4 s j2 C6 L6 @3 s( c#include <linux/module.h>
0 o6 A4 T+ d! [, d4 ^9 J#include <linux/kernel.h>" p8 B2 f2 H5 L. s8 k/ z3 c
#include <linux/types.h>
1 \- Q3 J t/ L#include <linux/gpio.h>3 N- L7 y4 g( i7 r( V# j3 e) W
#include <linux/leds.h>
8 Q0 k# [" D4 u4 x#include <linux/platform_device.h>
6 c1 Z( r4 Z2 `, [6 L/ I0 t s6 C0 [6 c! v
#include <asm/mach-types.h>" @4 l. O' _7 P2 p. i, X# O* }
#include <asm/mach/arch.h>0 g3 W; w8 a% a5 P/ G
#include <mach/da8xx.h>
! c- {+ w; E7 T" Z! d#include <mach/mux.h>. a0 s0 v1 u% J' W) u
" Q }) X, }: }( v% o) H#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& j6 M0 g G* ~( r3 z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
% j6 k$ x0 d9 J$ ~$ q#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 d' I2 M6 P h; I' T' N+ }6 S3 X
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)& t M! D! m r1 t3 V u
2 R* O* d; R3 `- N0 v
/* assign the tl som board LED-GPIOs*/
6 K8 N8 f( `/ S/ ?6 xstatic const short da850_evm_tl_user_led_pins[] = {8 E/ z6 x! W v1 [- F
/* These pins are definition at <mach/mux.h> file */
; W. \6 T4 g& t K8 a2 O% y ] DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ C9 D3 L: C! ]/ U
-1$ P5 d! S/ I7 \
};
- e3 l0 M( V) a* a5 a
5 a0 {( Z/ V0 t: }6 O9 gstatic struct gpio_led da850_evm_tl_leds[] = {
4 O8 n, T3 y; }1 j& w {
2 h9 B( t7 h. y, ~ .active_low = 0,
4 q0 D5 r1 j1 p P x .gpio = DA850_USER_LED0," v @# Z. W7 p0 E) K+ Q
.name = "user_led0",7 `3 w, x' c% ]3 ?! `, H
.default_trigger = "default-on",1 `- p( `6 Z6 P. ?4 T5 ~
},
# i8 e- K; E1 A2 S+ }" s1 S {
3 L8 b* ~: B/ c/ Z% T' H4 N0 C .active_low = 0,
, w* A/ R) H) P+ E p# W- \ .gpio = DA850_USER_LED1,; D/ N3 U+ o( J0 j( M0 m6 s1 C3 {
.name = "user_led1",
/ `* b1 B" ?3 S6 Z1 H3 L .default_trigger = "default-on",( ?, T! n7 _( J0 N+ C; o5 Y' }! X5 |
},
; ]5 i( |8 A0 {: s% o. t2 u) s {
# K) x3 s5 B) e4 ?' Q .active_low = 0,! m i" K0 I) X1 C: Z, a
.gpio = DA850_USER_LED2,
1 I0 I6 k0 U! }! y$ H .name = "user_led2",
* A+ [' v9 A7 E1 v .default_trigger = "default-on",7 _0 l3 \ _& ^( O
},8 X1 E8 T: ^/ d% z2 u: P5 b
{
) m5 `6 E8 w, z$ N# t' W3 \ .active_low = 0,
/ l* N. J1 F' I9 X6 p. J+ Q( a: w .gpio = DA850_USER_LED3,4 R- T3 z' X. f8 o9 b
.name = "user_led3",
' k, w# t" S1 A" Q .default_trigger = "default-on",
6 L/ x) G) ^- ^ },
$ C7 O- J' \" X; ^; y8 d};2 i/ r" X6 ?5 }$ Q" Z) d
9 D5 U' @8 K4 V- E5 d, I" f- o
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% k4 J, Y s% | Q( g3 C! ?( R: D .leds = da850_evm_tl_leds,( w0 z- k! ?7 d
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),, h+ x' g6 ?, s, X
};
+ l9 ?( L0 f# z$ Y' k- X( X1 d: t1 _6 z% ^- k
static void led_dev_release(struct device *dev): V4 p" a' u4 t! {: l
{$ y& G+ C) c; r; P( O5 _) O) s
};
! h# P# V9 X! Y! F% R0 L6 t0 f9 k0 ]- N& h$ _; j
static struct platform_device da850_evm_tl_leds_device = {
1 ]& W( s! B: F: x6 U8 g .name = "leds-gpio",. g0 j# H+ y- c/ ]
.id = 1,
1 Y: l& q4 h6 ^# e/ ~$ t$ g .dev = {& h. r$ K6 v5 H2 I7 E
.platform_data = &da850_evm_tl_leds_pdata,
5 l! V( q7 B- k: S .release = led_dev_release,
4 z3 a" g# |% } }# X3 Z' v5 M; ?! b o/ E: {
};
1 s6 n4 }) W0 D0 N3 \
; W5 x0 C: Z2 }4 W! ystatic int __init led_platform_init(void)
' P) x8 C1 _1 i: E{
* q+ O p/ X- h2 }* c# w int ret;
; J( S) ]) E9 a! T; ^#if 0$ ]+ G7 p( F- l2 ^' O
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);2 Q2 y. d5 f( J# J0 x" q2 a
if (ret)3 q' B4 t9 B+ O: o6 J
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
: B8 H$ ?6 A0 a2 y+ `& R1 J "%d\n", ret);+ l( L+ a, r/ I& z) F/ K+ p
#endif
9 k( O4 d& o. ~# y; O* ^2 T ret = platform_device_register(&da850_evm_tl_leds_device);
) D6 z- Y' }5 ]& ` if (ret)
1 z# X2 _ \, T- Y* `- G pr_warning("Could not register som GPIO expander LEDS");
# V9 ~0 S2 F* C0 v else) w) [, D5 s! z4 I9 o
printk(KERN_INFO "LED register sucessful!\n");7 J" S- d/ O( ^( |
0 s. x4 x. u- k: l( n return ret;9 X' G% e m0 F3 T) p! W& U
}3 n9 b" P" z7 H" o
1 ?! U6 ~& _* K/ _$ Vstatic void __exit led_platform_exit(void)
# e/ N2 T- N5 _$ ~4 R( Z5 Z{
1 S; C0 ?$ |0 l0 c, E8 B# r" x platform_device_unregister(&da850_evm_tl_leds_device);
5 l, |8 S/ X% z6 T5 g
9 D) h+ I5 S+ O4 n. U6 _ printk(KERN_INFO "LED unregister!\n");9 K: W2 I0 R( o h
}
, @" u: i# P' L" X" Z/ B7 ~4 |# `. S1 W$ u( B* p7 L" S
module_init(led_platform_init);
7 }' q; P) L% m& ^0 t9 a* smodule_exit(led_platform_exit);: c1 M0 N2 U. R% n: t
4 u8 s0 Q2 n4 e1 r4 I& L' jMODULE_DESCRIPTION("Led platform driver");& }+ G$ {6 J& {: [1 ]8 O2 ^* J
MODULE_AUTHOR("Tronlong");
# F4 {, M0 p# RMODULE_LICENSE("GPL");$ z" g4 X4 h! V$ I
) [$ q2 ` K, ~0 L$ j1 k |
|