|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
8 q: S/ Q: a1 E4 U5 X#include <linux/init.h>' a- M) }3 q& _. F; l% u7 N
#include <linux/module.h>
* s) \9 ~# k; [0 p; Y' v: r#include <linux/kernel.h>
; N' |% h8 i2 { S; D) X#include <linux/types.h>9 }' ^5 P, S4 M! h$ k+ `( W
#include <linux/gpio.h>! J0 Y. ?* n2 C/ h% `% c
#include <linux/leds.h>
# p& H+ j/ y6 L#include <linux/platform_device.h>% w1 R4 `4 V- g6 k# S+ z9 X `
( I- v2 ~2 \5 e" r' B4 O) |
#include <asm/mach-types.h>$ y# k% U/ I4 f$ G! p5 k) I
#include <asm/mach/arch.h>: @4 H' P+ H, A0 g
#include <mach/da8xx.h>6 x, A( {0 z8 H1 n2 f
#include <mach/mux.h>
( P# Q2 k* r/ R& O% ?$ w, G4 B K0 S' f7 ?0 g4 U8 w
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* Q7 i: y6 P; D! q2 M' u, z, e
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- l" k" K( N$ F#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)/ {/ P2 X. G* F, F0 }. x% E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 d& z; C" H- F6 K& ~4 j& y t% y
/* assign the tl som board LED-GPIOs*/, x. Q. h' Z' ?. F
static const short da850_evm_tl_user_led_pins[] = {5 B% F' k( N: t8 u# O2 I
/* These pins are definition at <mach/mux.h> file */- E, ^: x( r+ w- P c
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 ?! B& E2 D2 I- i1 S4 X% n -1( h) R( @# {3 D& Q
};
' c3 @( t+ p" e G, N S+ z7 b
6 U7 ]+ b4 z4 m! @7 astatic struct gpio_led da850_evm_tl_leds[] = {
6 Y$ b9 I; p' a. w# j5 Z) K! c {. u) j, w& K: H: t
.active_low = 0," r# G9 D' ~7 ^/ L0 b9 C4 A
.gpio = DA850_USER_LED0,
5 g+ l$ Z0 _, ~+ W7 F6 J! r .name = "user_led0",: v M7 U: \* }+ m
.default_trigger = "default-on",
& d1 `+ [8 C( P( M7 T( m) a! K# L },
; @8 H% d/ P9 r$ o7 k+ f2 F4 t {
G) E' ~8 Y: |3 ^2 e4 y .active_low = 0,; a1 b) j$ W T, o: N
.gpio = DA850_USER_LED1," r2 U Q1 T1 }& Y
.name = "user_led1",: H( s% y! ?1 M6 c8 Y% u
.default_trigger = "default-on",
& R6 z% S, E8 ]5 w },
" l* R9 E* p1 j# s" e# @1 S {' d) C1 {5 B9 V
.active_low = 0,
9 ?+ R- R! Z% F' d* r% H .gpio = DA850_USER_LED2,2 e. h: s5 q# P' E" E
.name = "user_led2",, X; T! ^1 S8 M9 p
.default_trigger = "default-on",8 w2 o4 |5 a N+ d, q, |: ~
},
- v) @- z( p* @ {) l- K2 n) c: T
.active_low = 0,
0 k7 ]7 o ^ U0 E- }% A4 H9 q .gpio = DA850_USER_LED3,5 p$ C& z% ^2 a0 l7 U) Y) |
.name = "user_led3",
. A- I+ y: D; A. I6 Y- r8 c' i7 d .default_trigger = "default-on",
& ]3 c+ A& w9 @& c) p+ ? },+ g% C% L4 ~- e/ e; j$ t
};
; B$ d* O4 J8 P4 F( O3 I( B) d K% W- I
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: b- w5 r$ E" \; S .leds = da850_evm_tl_leds,& n; p2 [) c3 C: C1 \ f' ~
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. S9 Q; M# w* }# J: k! A$ j};
: N8 w% W% M8 i3 t% A8 i
( G) Y( L e: K5 L0 q: ]static void led_dev_release(struct device *dev)
# ~* c3 @( B) {. z1 M& G+ {{( g6 k% z8 ~4 `) k$ j+ `# Y
};1 F' [% k4 M2 S2 C2 u- |
4 u0 B% `: G+ ustatic struct platform_device da850_evm_tl_leds_device = {
6 J r7 {- [" C7 k. J/ k .name = "leds-gpio",
1 V, f% m3 f8 G$ y .id = 1,
3 R" N. \8 z1 @) ]3 `: f- C .dev = {- h& ?. [4 i* b" x4 B6 b F
.platform_data = &da850_evm_tl_leds_pdata,
" H5 Q, P" H9 s4 W& q5 a .release = led_dev_release,; S4 d1 H9 W8 |, k
}! r1 ?+ I* L& ^, i
};
" A/ P6 D' E# ]( [1 k) c4 [1 D8 {6 Y
static int __init led_platform_init(void)6 ~. p4 z: V) y) L6 C
{( ^$ [" V2 R- i4 ] E
int ret;
- `7 _1 V3 V- o6 H- j2 i#if 0( I) u4 K. z# K4 [& B# F' l$ H) e
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);; H9 G+ u5 f6 @, L! [
if (ret)( n5 |6 M, V; c' r0 t) w
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
D$ {+ `7 I0 k0 p( j& O. ~ "%d\n", ret);
9 o& B; N; Q# G2 Q! Z* J. d" G/ ]#endif
4 m4 Q' Z: c0 h5 ? ]! v ret = platform_device_register(&da850_evm_tl_leds_device);
8 X/ r4 Q' d! v if (ret)/ {1 |" e+ \: G" Z/ R e
pr_warning("Could not register som GPIO expander LEDS");
* ~0 R/ H& U4 ^! i# k, u else: ]. }" E3 y E, ~7 u& q3 ?
printk(KERN_INFO "LED register sucessful!\n");
# C2 B6 T3 y0 N! `5 K/ ?1 V# w& G7 C; h
return ret;3 {0 l% L2 ]; J7 p. Z, n6 d6 R
}4 L/ S% N# @+ O" N. O+ R" [
3 {- a. T8 A" G; A$ D3 q4 }0 Gstatic void __exit led_platform_exit(void)
* x" c) C2 D1 i$ o% A- s. T{
4 M5 H+ _" \# ` V platform_device_unregister(&da850_evm_tl_leds_device);+ e9 g/ i) T; I3 G, M
1 |0 ]$ i: S$ m1 e. k, Q printk(KERN_INFO "LED unregister!\n");
) D! f2 @6 }# P/ m, b/ r}
/ `3 K' ]% G# F- Z" J* d+ f) u9 a7 ?( h( L: @* U
module_init(led_platform_init);
. u4 Z: X! g' o# O" S. Omodule_exit(led_platform_exit);5 k' @9 s3 }+ E7 ^& J/ r9 f
* d8 F7 [' {% q% k; E3 w% _
MODULE_DESCRIPTION("Led platform driver");0 Q( U! ` u1 U( U3 R/ J+ L; |3 V2 Q8 N
MODULE_AUTHOR("Tronlong");
5 h) T( c: j8 T, u7 G% MMODULE_LICENSE("GPL");
, T+ k; O4 z' A }! u
4 f6 ]' t0 M1 p |
|