|
|
求大神给下面的程序做注解,请稍详细些,谢谢。/ A+ w( G; p2 d3 r( s
#include <linux/init.h>
4 M8 X b+ |5 ?! A! y#include <linux/module.h> ]9 u+ k; d, p' @6 P
#include <linux/kernel.h>+ ]+ F: X* {+ R x2 B
#include <linux/types.h>
* e) X& f: W; a" ~#include <linux/gpio.h>
6 k5 |6 L& G0 D' C# O, p, n( ?#include <linux/leds.h>$ R1 D& @8 t5 U0 c% d
#include <linux/platform_device.h>. @! b: Y0 t4 p+ m; } n7 M
: Y# _5 ?/ m% I) u# D
#include <asm/mach-types.h>6 [, V# E6 K; z% J5 W
#include <asm/mach/arch.h>9 A! F7 v2 g1 d* a
#include <mach/da8xx.h>0 b+ y+ |* m7 M, l. o; I) K2 p$ o) B
#include <mach/mux.h>
- q, F' Z8 K5 k8 I) ?8 F
% V3 l/ o0 ?' ?! h#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( ?1 _2 v# q( x#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ F( ]3 V, J- \% k0 P) t- t#define DA850_USER_LED2 GPIO_TO_PIN(0, 1) d' I( m* m5 L5 P* m3 E$ x: a
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) n: x- o; F( T- ]9 w9 s/ _/ I: t* }: b1 j' ?
/* assign the tl som board LED-GPIOs*/, P' C! Q3 T4 ]5 ~4 m
static const short da850_evm_tl_user_led_pins[] = {0 c4 ]9 f, v; L# G* X) [* N
/* These pins are definition at <mach/mux.h> file */
; c# E! ?$ h8 ~! U: X# {6 G+ i5 U( S DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,, Z5 ], M" V- [ z9 \, \, c8 T
-1! S4 X1 x. D; n8 ]; k/ ^" a, m3 |
};
5 u9 |5 J" n: p8 Z1 d& M Y
: l2 y$ ^+ ~; y; C! N5 A7 p3 r, fstatic struct gpio_led da850_evm_tl_leds[] = {& N3 s+ H! f! D3 j% a# o
{ s* ]) s8 b0 ~
.active_low = 0,
2 G, e% X2 R3 d+ ^4 c. b2 T .gpio = DA850_USER_LED0,
3 W" [* q: s; V9 G1 k2 ] .name = "user_led0",
, v7 P$ W) f. E( P, k .default_trigger = "default-on",
+ [; k% v7 Z7 C. B) A },0 a9 i5 j; S2 K* v, [' L
{# n1 K+ M, l# ?$ D2 o; }9 E4 K8 Z. R+ x
.active_low = 0,
4 Y, v4 c# F' G5 J* V .gpio = DA850_USER_LED1,( X8 O H: K0 h7 q' H# H
.name = "user_led1",
! c8 A- H$ S& x5 Z; o# q4 \ .default_trigger = "default-on",
' |" i& N) H! \& m5 T7 a }, d* l5 U3 e" n" l3 n& \' D N9 N8 [
{
# b, c8 }& ]) Z9 Y* t' F" h .active_low = 0,
; x; p! F& L* g E: l .gpio = DA850_USER_LED2,
( }- S2 e$ r8 p( l# H4 [ .name = "user_led2",/ L; E/ j- C% T$ F! T
.default_trigger = "default-on"," @+ H# n. s+ S6 w: h
},
) J: [, K( p9 V) z {) n y; b0 ?1 v* b
.active_low = 0,) k3 i% \$ O! X; ?( L# B
.gpio = DA850_USER_LED3,! z5 ~) J3 ]% k
.name = "user_led3",/ d* R }8 \" o2 o
.default_trigger = "default-on",4 c; N2 _/ R* c) o% e
}," P8 n$ P3 i% ~, G6 p
};# I6 q7 H$ y M3 v$ Z
; Y6 m6 P( f* T( c2 V5 k& Q5 U2 a8 c
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ \1 ^4 Y# b, T$ ?4 W2 E3 `+ S
.leds = da850_evm_tl_leds,
1 r4 T$ G, e H* x/ C/ ?- }$ f* z .num_leds = ARRAY_SIZE(da850_evm_tl_leds),# u1 {( d) p5 X& G Q E
};' i& V+ S: R: h3 c
1 x. X7 Y: ^% |- E# L, N0 L; b
static void led_dev_release(struct device *dev)
+ \2 w6 b/ v+ N: h) `{3 B) L) X2 a. V1 j
};
. ]% P& u7 i7 M- o) X; W! O1 \7 x' m: o6 H7 `. l
static struct platform_device da850_evm_tl_leds_device = {7 Y5 _: n( x% |' j9 L5 W
.name = "leds-gpio",
2 h! [$ u- V8 V d W# D .id = 1,+ x5 W5 M- F5 o' v$ M7 Y* I
.dev = {0 }9 z6 G) S, [4 @3 O% u* \
.platform_data = &da850_evm_tl_leds_pdata,
7 F5 n" K# Y+ ^0 b' g2 T5 C! { .release = led_dev_release,' J( M* b1 i# S, _
}; U2 `# ?5 [% ?
};
# K! Y* Z; R$ W/ G7 {- g3 V
/ m# w: Q8 \- L& m0 vstatic int __init led_platform_init(void); B, h$ ?: O0 h0 M
{4 q0 y. [6 Z7 `1 C1 G2 B0 a* x
int ret;
2 P& D/ u. n. F" W0 b#if 0% z! B) W- ?8 C n5 L( H
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);! N3 V+ }! }9 r: D$ Y
if (ret)3 Z z+ f" x5 @
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
, u1 ?2 K3 ]0 K) H1 U8 ]2 @ "%d\n", ret);! ~7 |3 W& k- q+ l" s5 j
#endif2 R( _6 }% J& D& S5 p
ret = platform_device_register(&da850_evm_tl_leds_device);
5 s7 {- U0 O" W. W5 K4 j$ _' z9 j% N if (ret)) Y4 i" P4 _0 g3 f
pr_warning("Could not register som GPIO expander LEDS");
0 ~* g4 O0 q; @( U. o p) A- m else
. G4 w2 Q8 l+ {2 G' Q# j: U printk(KERN_INFO "LED register sucessful!\n");7 r1 o# u9 k4 `9 `" j
5 Z% e' l. U) t$ H' H) [1 c return ret;
) G" c- u. W5 k' Y( ^* \% c9 k% j) t}
" m% S% \# P3 `1 [
0 }+ T3 o! d$ |/ j: H2 b7 |static void __exit led_platform_exit(void)5 t( p0 v1 U2 z9 W! Q) W: g6 U! _
{
' S8 ^3 N5 U3 p platform_device_unregister(&da850_evm_tl_leds_device);6 o1 X& Y) p6 u M" G
1 p; q/ L* b/ z1 m# f, ]4 Q printk(KERN_INFO "LED unregister!\n");. I$ f: Y+ o; z2 s" a
}
6 ^. D& \" B) c5 f6 M5 s, Y( n) B9 Q) d2 F1 C8 i4 V( {5 W9 C/ b8 r) S. O
module_init(led_platform_init);
0 H) M) m$ `; s4 Q0 i& H/ Vmodule_exit(led_platform_exit);' ]! Y; A, p& G# t+ Z7 A. |
3 e e3 }/ \2 |/ I( z. nMODULE_DESCRIPTION("Led platform driver");/ ]! I5 a% A# _( H: G& s
MODULE_AUTHOR("Tronlong");
0 A# Y% @2 u, kMODULE_LICENSE("GPL");
+ ^* P8 e' s. L4 q; l( S4 _3 k$ y+ L+ u7 @4 C
|
|