|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; t; |8 @7 z* ~4 L9 r& x* @
#include <linux/init.h>
$ b; I# l3 l0 m#include <linux/module.h>
# W4 _, S; a$ @- g) Z1 [' M#include <linux/kernel.h>9 x+ z5 q' o5 S) Y* Z# s
#include <linux/types.h>
) x) |9 n* T1 h, I. B4 b. O$ |#include <linux/gpio.h>
$ I) }4 a) c/ j! I, g#include <linux/leds.h>/ P* O1 \1 s8 J9 P+ C, s: C
#include <linux/platform_device.h>
. a, w8 T9 D: f. `$ U
$ F: M% w$ B: A0 v5 H#include <asm/mach-types.h>
* e4 V/ p, Y& k, p+ Q#include <asm/mach/arch.h>
. `. k' ^1 ~' d- k7 j/ Z F6 X#include <mach/da8xx.h>
: m; t( M0 [; {- a) T#include <mach/mux.h>
. C6 o( T ^+ O/ b9 P e( z9 S& \( A# n) m
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
, T3 | C- y5 J9 }7 A( U#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
. O1 c+ Z* A6 X+ f/ I1 [) N#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
4 q8 R) v1 ~1 b1 A#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 u' i6 f# v0 p2 @+ |& q) o \
/* assign the tl som board LED-GPIOs*/; n; X+ h7 k& v4 a: Q
static const short da850_evm_tl_user_led_pins[] = {
2 t* m5 R" K; }% t! j7 ]9 s6 P /* These pins are definition at <mach/mux.h> file */6 a* _5 H3 g- M: M- y' q* x
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 ?! u: A* w0 G3 v# _$ v6 o -14 B! V# K- ~" ~: i
};
# b# N! ~* `0 h4 h! | z4 E9 u9 l6 t2 S) \
static struct gpio_led da850_evm_tl_leds[] = {
' ]4 f0 U: J0 b2 {: p. k: p {, f* Y O9 L! n
.active_low = 0,& j7 z" N; ]3 W/ |% ?
.gpio = DA850_USER_LED0,
5 j- U5 W" a2 g1 z9 E7 \$ y .name = "user_led0",1 b6 O) {; Z& W+ W: T" J
.default_trigger = "default-on",/ |- Q( i! _, D( ~. L. ~3 I
},
7 M9 L1 i$ O( x {2 q* e, I5 C' a9 C8 @
.active_low = 0,7 M1 ]) j: I7 L
.gpio = DA850_USER_LED1,
/ I: c8 s$ _: P5 t7 v: j .name = "user_led1",
) m# V+ v5 ?7 t+ i$ Y .default_trigger = "default-on",( ]% ]2 Z3 I) k7 {0 y
},5 F/ Q0 S1 f$ |# @3 ]/ j; S
{' k4 _; q/ m4 R) P4 g1 h
.active_low = 0,# Y( k+ l8 H/ }, c# D1 ^
.gpio = DA850_USER_LED2,
$ D6 Z+ k. ]6 ?- u" } .name = "user_led2",
g' ?' p& G, ^% n .default_trigger = "default-on",2 z/ ~* L( [/ x
},
7 E. Y+ \* Z0 K6 @ {* u) P6 [# y$ d2 _
.active_low = 0,
9 a) e; g: G( ?2 W- x .gpio = DA850_USER_LED3,
: A& T$ Z N2 K0 u .name = "user_led3",
; S2 h- e2 J# V5 U9 z Q; I .default_trigger = "default-on",
; r `4 J# H# L; A) n2 s/ M3 a },
) w! s/ h2 a4 @/ B2 c4 G$ Q/ ^};5 |: p# \0 F% I
# }0 G" s" ~2 F$ J" Sstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {3 O& T+ T4 j7 n; _1 g4 A
.leds = da850_evm_tl_leds,
% v( I$ ]3 j; ~. r0 X& P .num_leds = ARRAY_SIZE(da850_evm_tl_leds),2 h" D* V7 o6 s' c1 A+ F
};
, F, N% j- H& |3 d3 D$ K& C+ Q) q }
: r+ e$ s( Y6 d8 _5 W2 J+ istatic void led_dev_release(struct device *dev)3 i$ ?& H; X1 S" p$ A3 E+ o
{
6 i$ v7 R# g1 z! p" `% [};
$ n& W/ M& ^1 o6 A8 b4 a
9 J0 A) J! s3 P5 I, ?static struct platform_device da850_evm_tl_leds_device = {. M: o- w& h( G# h7 \4 ^4 W
.name = "leds-gpio",
2 z( d' Y) T, i- D .id = 1,6 L- K- P0 t' f. n
.dev = {9 S9 E5 W5 @* ?: ^, W o6 T5 v7 m' B
.platform_data = &da850_evm_tl_leds_pdata,
) T/ W/ J/ t) v5 b1 {( | .release = led_dev_release,; p" o/ d; C- q( z
}
+ M) I( e4 |' `1 [: x};
! [1 C L0 B/ s7 m5 m
8 R) h' N* [- `, b$ U8 Q" p# ^0 A' `static int __init led_platform_init(void)
: K. `3 b/ c- a/ d, g{! s5 Y9 ^) T' R' _6 b7 v
int ret;
3 |: v7 \) u$ X) E: s' G2 U#if 0 B, p; o* Y' l/ I* q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
- T' x( [7 u, X2 {: Q5 d if (ret)
# x/ `2 a6 Y7 B ~ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"6 U/ Q' d( y: M- E- f& Z
"%d\n", ret);" G; K% `4 V( M0 V! a
#endif
4 L2 V' O1 X7 v% q5 c$ S' V7 Y ret = platform_device_register(&da850_evm_tl_leds_device);( i/ w3 G# z9 r8 f! p+ z
if (ret)
& }( A$ S1 A \ pr_warning("Could not register som GPIO expander LEDS");
9 |" D" K; @% M$ n B; B' A else( f4 V0 a* K# e. `+ v# S! R
printk(KERN_INFO "LED register sucessful!\n");
& q/ A; N; M" s6 J5 C- F6 [( j$ e$ c: S' n5 R
return ret;
1 R: l* Q+ }7 \: ]' M}
! |6 A; @* z( A0 e6 q7 {% y1 R/ ?5 i2 ?% R: j0 x
static void __exit led_platform_exit(void) y3 O5 k( C0 j; H% {
{
. V4 K* Z; v' b: w; K platform_device_unregister(&da850_evm_tl_leds_device);
4 p' H1 c4 d, b" G6 F, ~" f) N- n/ B, N5 `! A4 E2 t% b1 j3 C# ]6 F
printk(KERN_INFO "LED unregister!\n");
3 j5 s5 m7 u9 m( U9 d% x; {}
" X8 E$ }+ u4 @) ~0 q
+ x; Z: w( @; i3 ]4 N4 o1 Ymodule_init(led_platform_init);2 ^& k5 r" M7 r
module_exit(led_platform_exit);+ h7 _" w' X6 B! A- d
% x3 X3 S2 A& g/ K9 E# Y: [
MODULE_DESCRIPTION("Led platform driver");
( R7 j* @3 o/ X# lMODULE_AUTHOR("Tronlong");
6 P( ?4 L1 r- i% [* h! f- \$ VMODULE_LICENSE("GPL");# ~4 t9 W. I% u/ y5 B# w, p
1 |# |+ x- t9 Q* b& @6 L- I8 g/ h |
|