|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; F; i: O& N& U# E2 W
#include <linux/init.h>
% H1 _2 }* y2 g( @#include <linux/module.h>
5 S5 T9 M- {7 }& I# A0 Y#include <linux/kernel.h>
' w3 f' D- ~1 n3 p2 S# A/ ~#include <linux/types.h>
. Q" O+ W1 J* T0 S#include <linux/gpio.h>/ e* M+ y9 ^4 b7 S
#include <linux/leds.h>
+ R. c& e6 s3 U/ O$ m9 l& i#include <linux/platform_device.h>
- [* D2 j) j3 v& @9 @: W- H+ Z1 h/ o+ v) t% {0 g: n
#include <asm/mach-types.h> Y( ?$ a% M8 S
#include <asm/mach/arch.h>
: j4 _, ~. g9 }7 ~/ `#include <mach/da8xx.h>
( O( s! p! P, [( j1 M+ U#include <mach/mux.h>
* p# u# `% z) i; d1 g& e: N' P1 t
: {* m- X( H/ I" H7 r# Y+ h#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' ^6 \. M2 [6 u {; ]- x0 g
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)6 Y) Q# o8 S* n" i: L- E3 r
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ h, P+ @1 U# R, V#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 M1 B: e0 p7 j3 o0 N" ~$ l' o5 j
1 m* K) Z6 L4 ~. F* R" n' H/* assign the tl som board LED-GPIOs*/
) H0 Y5 z2 _ s: h) ^+ Jstatic const short da850_evm_tl_user_led_pins[] = {
) V4 a j @- t: f S /* These pins are definition at <mach/mux.h> file */6 W* U O6 i: R# g
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,1 c& M' r/ \8 c
-1, k" h, S1 ^+ C0 u/ r Z
};
- `6 ]; [+ Y$ A1 e* R
' n2 g% w* r3 H2 L$ V% sstatic struct gpio_led da850_evm_tl_leds[] = {0 v' M5 C6 R$ B! U" ?: O
{) c: u! N; h% c k- o9 v
.active_low = 0,
4 M h6 U: r, ?6 W. I .gpio = DA850_USER_LED0,
) ^( V6 Y) D4 {* x0 g( g, x .name = "user_led0",
# Z; V$ ]: @5 A$ S .default_trigger = "default-on",
: f. H5 {& S2 ^) @1 x. G% v) v& T5 ~ },
) M" h* t/ E! C' ~* z1 ` {0 L2 E: z7 a% h0 ?2 O: f7 U! W
.active_low = 0,, L* x7 l$ W/ W& V( T. q
.gpio = DA850_USER_LED1,! D6 r8 J M2 x* y
.name = "user_led1",
; N( T$ V" h- p6 I7 n: y: O- H6 y) x .default_trigger = "default-on",
& v4 X* F1 V$ S2 J },
: g6 e9 ?$ E" |. R1 a) Z. Y6 W {
' a/ E2 [+ g5 O1 Y3 |" A8 \ D .active_low = 0,4 Y: K% E f# O4 h. s' d
.gpio = DA850_USER_LED2,
5 A. S' g3 C$ A. _ .name = "user_led2",$ g8 F: L, \. K1 D c/ P2 a
.default_trigger = "default-on",/ g; ~! T. ? Y5 e+ ~ j
},. ~0 n3 ]) u _- r x/ _
{& K5 S7 ]( ]9 C% R
.active_low = 0,% c& }+ [0 d6 \, _
.gpio = DA850_USER_LED3,8 L1 j2 g$ X- Y0 X1 `% K
.name = "user_led3",
Z, `4 ?4 w# D5 d7 d8 I .default_trigger = "default-on",1 j3 g, \ h0 T8 S" ~+ B$ S
},- [8 d: a& p# ~5 f
};
5 L5 S8 u# W. g! ?+ I
; s; w% ^) u( C0 a0 V4 H2 Lstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* ]9 k3 @! i3 ?$ A0 S4 y .leds = da850_evm_tl_leds,9 o1 U- ], ^) {( G. V# Y0 [5 H: i# T, a
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),; E) M$ E _9 {; }1 l# S* h8 Q
};
& m$ t) N3 d R7 v A$ w
1 r$ H8 j$ t- O0 `+ g4 fstatic void led_dev_release(struct device *dev)
/ `, f& e1 Z% R F2 p{
4 _9 ` g# a$ C; J, Z- L};
* P+ A9 d( ?7 h) W+ v3 Q/ ]9 ~+ j$ ~) |) q4 K
static struct platform_device da850_evm_tl_leds_device = {3 [; i/ J, u( ^$ [
.name = "leds-gpio",
b! W$ G8 k7 p; @ .id = 1,
* y3 ~. ?9 z( T2 T+ \7 W2 L .dev = {; a! r4 L7 Q" W+ k& F9 n9 l5 B
.platform_data = &da850_evm_tl_leds_pdata,: X, V, w8 o2 A) a" ?7 S' n
.release = led_dev_release,3 F1 f2 a8 w: |4 v0 k
}# B! Y: z5 n9 s. K
};
( }/ r# a: m) x4 w2 x! Q5 u# l) e+ \0 r+ M0 X( ~8 ~: N8 a
static int __init led_platform_init(void)
?! k. W; H( }% [% C; ?3 b{/ } A* }$ l/ }$ q0 X# {" F
int ret;
% E* v& n+ z: x5 X) V& B#if 0/ H* f+ E) w. U2 K# ^
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);. k! H* N7 F2 \1 e+ o0 ]& d) i
if (ret)
9 d( `. O/ k4 z5 c8 k0 Z7 x pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ H5 l4 P( `( ]& X "%d\n", ret);
+ O1 H* t8 _- B/ a#endif
2 P3 }. g# A$ f8 L3 b ret = platform_device_register(&da850_evm_tl_leds_device);
5 G0 A6 d ?) X# q if (ret)1 N \ X5 ~/ E r* m
pr_warning("Could not register som GPIO expander LEDS");4 M1 t$ o* I: e, b; F# ]
else
. }/ l& w- e1 L% B- b1 W8 m8 J printk(KERN_INFO "LED register sucessful!\n");
( i Q9 _9 l! d+ E c) a' o6 n o* `( f0 K/ m k
return ret;
4 w% y3 }9 r9 Z7 g. F7 m& j: v: q# ^}
( l+ e2 _9 F; s9 M) j, i$ a: c1 s, v) I- \
static void __exit led_platform_exit(void)
; G: q4 {' }& @- D+ Y) Y+ ~3 A{
1 v9 Y8 `3 P% U/ G6 Y' t* I platform_device_unregister(&da850_evm_tl_leds_device);/ n) t) D# j# h4 J' X" R
8 |( E. \( O3 d
printk(KERN_INFO "LED unregister!\n");" i' b0 p1 F# Z4 K- E
}, q9 u- m2 ^8 @6 y2 x1 u" a4 E
5 K' x) r" w) u5 t5 @- E
module_init(led_platform_init);
/ I) \* U' i; u1 @9 b; _) xmodule_exit(led_platform_exit);$ p% u. c) w% Q& [- ~+ v) [
! K2 ?& C5 k/ X3 m$ U. q5 f3 A# m
MODULE_DESCRIPTION("Led platform driver");
$ G& K# |1 L8 r6 uMODULE_AUTHOR("Tronlong");% T9 y0 D. j# ~. M& K" T
MODULE_LICENSE("GPL");
! l. r* v' ], Q1 E. y; H" n: x& S; r' [" p! L7 f9 W- f
|
|