|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
8 h* W7 z& J$ B. }: m#include <linux/init.h>/ D7 I% E! r7 k$ X7 w
#include <linux/module.h>
* z# g: S1 X: L( w#include <linux/kernel.h>
4 {8 W: d% ?6 D9 ]#include <linux/types.h>
* L2 Q+ \( ]* A' N+ s& U; u) B#include <linux/gpio.h>
3 |* I0 z5 Q, Y& Q W% Q#include <linux/leds.h>
) e V% J T# v& v2 w8 C, \#include <linux/platform_device.h>
4 H; `% B6 W5 J. x) X
3 ]& c6 O7 @% M1 H4 X' Y#include <asm/mach-types.h>
$ I- p8 R4 X$ o2 p#include <asm/mach/arch.h>
& Q! E9 k* K. m- {/ T! r#include <mach/da8xx.h>& B, h$ n4 ^1 T3 x1 F1 T' b
#include <mach/mux.h>6 X, S# B6 G9 Y; w0 ~' m
: h) Z1 A, I t. e
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 o9 h% t. Z: p#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)% D) R3 o3 q" e" G" F a2 f. I
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
9 M9 a/ z' [. C1 E- ?$ ^#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)$ L) Y, \2 `+ Y7 l( n1 O
# b+ e1 _2 g& i+ x" `/ `3 E/* assign the tl som board LED-GPIOs*/
. ]; x3 I) V, V) a8 Ystatic const short da850_evm_tl_user_led_pins[] = {, N4 \' h5 V) ^1 m! p* J' \5 P/ H
/* These pins are definition at <mach/mux.h> file */
- k$ M$ h- E& ~/ G+ ]; ^ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
; D2 T) i0 \' t ~4 b2 f -1
) v: A U1 ~7 }, ~$ F, F# W! K, z};
4 G7 [/ y) v; c2 b3 ?0 g: W E6 X8 _/ z6 G
static struct gpio_led da850_evm_tl_leds[] = {7 a* m2 G6 d! J5 P* N
{$ d8 F- ^( y' q& ]
.active_low = 0,) V) ?" L- J. l2 W9 t
.gpio = DA850_USER_LED0,
, u6 j7 q- F$ M9 w& I- H$ ?5 T/ S .name = "user_led0",1 X- l4 ]% P1 \1 o) K C
.default_trigger = "default-on",( ]# n9 |$ @3 }0 x
},/ s: ]* \, i! y- c! l
{) N2 L6 P! { E# C# _
.active_low = 0,- v* J. E+ ]1 L' i; d9 M
.gpio = DA850_USER_LED1,
2 d2 X' w' D$ X .name = "user_led1",
$ @( q2 p9 ]; ?1 ?; O2 }# f .default_trigger = "default-on",( ^ |* p4 s+ G. W
},
& I' l( x. O: k* |2 O' }8 K/ ]8 c {( S9 T1 Y- A4 u! |, Y
.active_low = 0,
/ y8 Y u: i& G& h8 H2 c. q( B: H .gpio = DA850_USER_LED2,+ d4 E' G) e7 i
.name = "user_led2",) K1 }9 o) I' s% Y) V7 {
.default_trigger = "default-on",
1 u! w1 o0 [8 `; L3 c+ {# D }, U8 u5 k' |' k( ^
{2 D2 P3 h: ^6 T$ w* h3 p `
.active_low = 0,* u# [ k G+ F O& z" E8 _
.gpio = DA850_USER_LED3,, o- z9 i* u$ p
.name = "user_led3",
' a- p. l& a- h8 t9 K* l4 N/ J .default_trigger = "default-on",
1 b6 t* d! r, P/ l },
6 L1 N) |2 c+ w* R8 v0 W};5 r! Q1 o5 \# y0 }1 @3 a
2 _0 I4 w, J! i7 d( @6 cstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( @% T! r0 T9 D9 ~5 t
.leds = da850_evm_tl_leds,
# [5 x3 Y& ]& a% y* I2 s0 E0 ?. k2 v0 N .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 k0 [7 A7 u% H8 ]};5 Q+ Q8 i' C7 c7 L* I
# G# g" B( `$ l5 Z. ustatic void led_dev_release(struct device *dev)% E$ [8 ?; \, c( ^
{4 H4 u+ s, d U
};
: g5 o, n. X9 |2 s9 q' ?* [: J& Y: _- x. H' M
static struct platform_device da850_evm_tl_leds_device = {* w7 y! n$ M P' Z3 d x5 ]/ k
.name = "leds-gpio",
5 L% p) j' G: T) x .id = 1,' Q* @8 h3 ^! N6 F4 k- l' I9 ]
.dev = {
* Z; Z, D a$ v" H% p .platform_data = &da850_evm_tl_leds_pdata,+ {/ C5 [; f) }3 N) ?/ s
.release = led_dev_release,) [* E2 n( W# ?# a' \, K
}
, `0 d9 `$ D4 Z4 C, a};4 C! u- D2 A& [/ }
1 P: s0 D4 a! ^6 \" hstatic int __init led_platform_init(void)
' Z% B V1 g" z- o' N9 T/ Y* X{
) N, ]7 S6 W3 I int ret;
# y9 P2 c$ [5 r2 j#if 0- m& @$ i3 u Q+ _5 f
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
. C: u0 a m& j) q if (ret)
3 d: y3 g% a4 U( i pr_warning("da850_evm_tl_leds_init : User LED mux failed :": c: G3 j- z, t, o
"%d\n", ret);
7 c; w8 S8 M+ u" b#endif
* U! y0 V" c1 r' I6 D ret = platform_device_register(&da850_evm_tl_leds_device);3 r. Y1 [5 z0 l! q( E7 f
if (ret)( Z+ F! T3 g* B
pr_warning("Could not register som GPIO expander LEDS");& B# P1 c$ I; m! \
else
) @- H: ] A/ R) D printk(KERN_INFO "LED register sucessful!\n");, Q4 L, D* E3 }6 ]' B. |: ?7 R( l
, H3 L4 I0 n3 }8 L return ret;/ y, v9 Y; \# |+ _" q
}
: h0 A9 s L( s3 D) k: A6 K, C1 I
static void __exit led_platform_exit(void)
@2 Z5 e3 M( `" f, x8 p{! [: W: d6 J8 l$ ]7 `
platform_device_unregister(&da850_evm_tl_leds_device);* _. V+ _: N8 H8 D5 X" z5 m# w
9 T5 {# E5 l1 E, d% o printk(KERN_INFO "LED unregister!\n");$ G, Z Q+ ^1 w- n4 z4 A% @
}
4 q1 n0 a) i1 O. }. }
% X' F s$ x0 E8 p6 s5 C. x6 pmodule_init(led_platform_init);8 l ]2 V, j! {0 X
module_exit(led_platform_exit);
5 n: `: j6 Q4 {+ [5 v) c
& @0 Q/ o9 [* R& g3 K' aMODULE_DESCRIPTION("Led platform driver");* D' K1 M8 S. C# G, D9 \6 z8 v* {( n
MODULE_AUTHOR("Tronlong"); a: F) t& ]+ x" K4 t
MODULE_LICENSE("GPL");
6 Y {2 D; P0 [, |
5 ~0 w# O0 w3 V: t- h |
|