|
|
求大神给下面的程序做注解,请稍详细些,谢谢。2 L5 k# v, n, |" o( q6 N) |2 z, D
#include <linux/init.h>
$ b Q" C8 J/ U! t9 i5 M+ m#include <linux/module.h>
, G3 [5 k4 I* c6 ?: _, B#include <linux/kernel.h>9 \+ M& j* j; C5 I$ b
#include <linux/types.h>" `1 ]) `/ F9 b9 M X/ `7 o
#include <linux/gpio.h>. s2 t3 B% ?: g! H5 l$ g; d3 R
#include <linux/leds.h>
6 p# ^ ^7 v b6 d2 s# C#include <linux/platform_device.h>% `# P/ ^5 g- R4 n3 [9 B
. Y; P. G3 A7 q#include <asm/mach-types.h>
1 F* }* q. ^2 U/ `- E b#include <asm/mach/arch.h>4 T* z3 Z f1 D& k8 x& u0 f
#include <mach/da8xx.h>
4 X4 \+ H5 ?0 J7 e/ G$ w! |#include <mach/mux.h>
8 y/ [7 D+ k# V, K( u6 W! i
' Q* A8 L1 Q8 F6 w8 v#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 a; J" V" y" P7 u p
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ r9 l% b$ F2 h: ?* z2 ~( q( j0 N#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
) |2 ^: `* l& [$ N' t# @3 d. w#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)& X7 n( X" i A6 G7 |
4 G5 _. ]- ^ G2 L$ x/* assign the tl som board LED-GPIOs*/
' Y, M J) m: e% c9 d8 [static const short da850_evm_tl_user_led_pins[] = {& \! l7 Y) t, I& j/ ]$ i3 ~
/* These pins are definition at <mach/mux.h> file */
2 ? J) @6 M* O' Q3 ^# R+ V DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,& B2 X7 p+ `5 z# v L' k/ q' O
-1
6 f/ E: n. S; H8 _};
- I% i+ P. Y: H7 |$ M. p6 z
+ }4 [; e$ S+ ]static struct gpio_led da850_evm_tl_leds[] = {$ o$ U( r1 b2 \$ P
{
6 T2 s% g% s6 J4 i- { .active_low = 0,
5 j5 P" B9 Q" v- B .gpio = DA850_USER_LED0,$ Q/ y( N4 b/ O; ?& p
.name = "user_led0",
# `% J5 h4 F$ n0 a% y1 C/ l .default_trigger = "default-on",
: P2 G( n# ^& a& T- j4 t },
4 r' |6 Q' p# I: N( m9 b M4 g {
( J% i- t9 i% O3 ^ .active_low = 0,% \* h* X. X8 _- K
.gpio = DA850_USER_LED1,# _! e. Z/ `$ Y% `* \! |9 W
.name = "user_led1",
j2 ?. ?5 X) _; N* S: R$ W .default_trigger = "default-on",
9 b( b" N. E4 Q: U9 e6 ?; e( A },
' m/ E9 L. h: v+ N# ~+ k( e8 ?$ b {4 ^5 u' W1 b' H& }
.active_low = 0,
$ B0 Z& i H; C) u7 t: L$ a. o+ Q .gpio = DA850_USER_LED2,. p, V5 H3 ~; R9 D! x/ e5 x2 A
.name = "user_led2",
! B& G9 O) N8 n# R .default_trigger = "default-on",
, r, D7 Q9 N3 T% g# ^ },( [+ k% b) k! s0 V* l; U# d' Z
{3 ]: k6 j) j$ K+ O& O5 K: ~
.active_low = 0,
# z. |/ f, T! H1 A9 t8 J .gpio = DA850_USER_LED3,
; D E. v: i' K& b( N( \4 C .name = "user_led3",
. ^0 p1 E$ n. F7 P3 G7 e8 }( m0 I .default_trigger = "default-on", E5 A9 q8 {6 N. i I7 `
},0 L% T( u" }; f6 H1 T
};
$ {& v% r" {% Q* Y- O; e; z q+ } i1 j- X
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( p/ K; ?1 X# v' R" X: m8 `! t
.leds = da850_evm_tl_leds,, v# Q h6 n" v$ M. Q( u- b# v
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 l/ ~- _2 Y2 D J
};
7 q" Z v! U" b s6 B' \
. u6 q5 P3 F2 t6 \1 @, Q) m7 ostatic void led_dev_release(struct device *dev). u# Q$ }( {3 r5 Y/ a
{1 J! J3 o* v1 _3 M g
};3 O. f- L' K7 Q v' r
( k- |6 @/ N+ pstatic struct platform_device da850_evm_tl_leds_device = {: q7 S1 ^! S; a& ?, I
.name = "leds-gpio",7 ^/ j: Y& m3 q, L4 r
.id = 1,
4 S/ g0 l8 t( }: Q .dev = {
( i, t: p* l) K .platform_data = &da850_evm_tl_leds_pdata,
- K I1 V) ]; g e/ K* A9 o: T .release = led_dev_release,$ B1 o' h1 _) a
}
" j2 f1 F8 N3 J* y6 b. Y. _5 T5 L};
& B6 y( z# s+ H4 q" Z0 P8 x# i" J* K8 H. C+ s0 J* G5 o- w
static int __init led_platform_init(void)3 Z( Z9 o" ~% ~, z/ P
{9 X- `2 T$ M- y7 B( I
int ret;: \" H. Y: g9 O# j$ m/ e3 E
#if 0
8 s# P" n- r( e1 m: Y( O1 L/ w- ^ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
3 @- I5 k- ?. C" k; l3 z- j if (ret)
& f9 D' i/ e8 e' T pr_warning("da850_evm_tl_leds_init : User LED mux failed :"& l$ [8 z" c. C& `# {1 q
"%d\n", ret);
! a- f+ p5 O) D- v8 D#endif' q) b4 {% ~7 e J% f4 s* _" x/ C& ]( _
ret = platform_device_register(&da850_evm_tl_leds_device);
. T; T; t A" z8 _5 \. @ if (ret)0 @& Q. u, W& T: o& I* V6 h
pr_warning("Could not register som GPIO expander LEDS");
* }( w6 Y) R3 ?) X else6 |" S: w( U/ A2 |: k. o+ y" n
printk(KERN_INFO "LED register sucessful!\n");6 V' f1 w% i& @
! N$ g0 N9 f* {/ w2 }* U9 t0 `
return ret;
6 D! E Z( M; z8 N8 P! A4 e}7 i2 z8 g; e8 m6 Y: ^) @
, ^* a8 u3 H: t7 Y8 T+ w5 u
static void __exit led_platform_exit(void)4 D4 E% j9 h: p- {9 J& Q$ I3 ~2 l* |' h
{
& E1 B0 v0 Z. [$ ? platform_device_unregister(&da850_evm_tl_leds_device);/ _5 H! g% t; n5 h3 I* v# ?0 m
# X" @" T0 Z3 r; X s& \
printk(KERN_INFO "LED unregister!\n");" G& f0 }" G, u4 V7 L n, j- s
}
5 y6 j s3 v1 A! ?3 c- `6 b' b9 T+ }4 q% C6 z( F. W
module_init(led_platform_init);
. ?* `4 ]$ f2 u9 o: C# B. kmodule_exit(led_platform_exit);' U, x7 p5 m, g8 ~) Q+ I* `) J
# k3 d) Z1 e& B
MODULE_DESCRIPTION("Led platform driver");
) |! I9 P1 H3 D9 M) i7 VMODULE_AUTHOR("Tronlong");
, Y, U2 G* H. g4 f' w$ M) a; rMODULE_LICENSE("GPL");
) G" k% I6 N: p# w
- o: p/ p6 F+ g- s |
|