|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
, P! J4 p8 j, e5 `; c" u#include <linux/init.h>8 U$ z4 Z2 Y7 n
#include <linux/module.h>
6 r% B3 S: c. S$ P" t) n! R#include <linux/kernel.h>) [, S9 Z4 a: k& l7 ^
#include <linux/types.h>
" {* M6 {0 h* A$ h0 Y8 q m#include <linux/gpio.h>) q1 s- r' S) [9 J6 c
#include <linux/leds.h>
% h, w$ Z3 `4 l% I$ k2 |3 c; e% w#include <linux/platform_device.h>
8 X% S& R- C2 |
/ U+ L1 H9 v5 _$ Z7 h1 e6 g3 {#include <asm/mach-types.h>$ W% G' u, Y9 G
#include <asm/mach/arch.h>: G+ J+ a+ B; Y* D! j. r: P6 s
#include <mach/da8xx.h>9 h. N/ ~8 p4 A9 i
#include <mach/mux.h>& b: k: P [. y, I
- h& ]; ?; Y& U& J; l& }( r# B#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% L7 [+ U6 A) q
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
* [. v( R9 I8 t# f#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)) p9 e4 Q: y0 b3 M* s( v% g0 { t
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)/ k* e; K* h! D# e
$ m5 L8 J7 u8 F8 T5 c ]
/* assign the tl som board LED-GPIOs*/
6 e0 L$ t, e# ]- y" istatic const short da850_evm_tl_user_led_pins[] = {8 n! i( B C' n4 O
/* These pins are definition at <mach/mux.h> file */6 A; e# N, V$ i" w; j& o; U6 [
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
0 D" M2 k `3 q" O% P% V; L7 b -1
/ y v) q P. D};# J+ P8 @8 ~- O+ C5 A1 S
7 Y2 K5 w- M- Istatic struct gpio_led da850_evm_tl_leds[] = {
! R9 E/ M8 u' d7 x2 h {3 ]# Q& e) ^5 z2 P$ M& [
.active_low = 0,
, L1 g% B0 l3 Z3 N8 [ .gpio = DA850_USER_LED0,
) k# t. I0 J% m- P4 G6 C% o6 m .name = "user_led0",' B J. f. m/ g ]
.default_trigger = "default-on",
$ i$ w/ s$ Q' P* ?! |; a },
7 S, V* `$ }5 o ]+ y, V K2 ^2 _ Y {
0 t5 G! A% `5 A .active_low = 0, D9 o8 G4 f. k1 Y- v4 @
.gpio = DA850_USER_LED1,
4 o3 ~5 E/ T/ X, m .name = "user_led1",
, t5 V7 C1 l, h& u .default_trigger = "default-on",# e+ d/ R; c4 p6 ]
},
8 x$ F" n* T2 U {$ ?4 C9 S. r* Y2 q! ?
.active_low = 0,
% k1 Z8 \$ T0 w4 ?8 ?( H .gpio = DA850_USER_LED2,
+ y- \( c' S9 [5 _ A .name = "user_led2",
I$ Z) } E+ \+ R- h, x .default_trigger = "default-on",# Y9 V5 O$ g W
}, x: j, [0 @$ O4 m
{9 Y1 W8 J6 |& d# z; z+ P8 S
.active_low = 0,/ L6 y4 N% o/ R9 c' h& F% q2 P% N
.gpio = DA850_USER_LED3,
3 r: F* r$ p+ r# D# d: d! I( C .name = "user_led3",' c# _5 s a# w
.default_trigger = "default-on",
9 q2 Q/ w' N% M- {4 V },: f# Q) d7 b: ?3 U
};
# C8 L: u. R1 x; R a/ E& U- _( [9 s6 ]- d* I( @* m5 N
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {5 |$ n8 A( l( U. c5 R5 f
.leds = da850_evm_tl_leds,) I9 q' _' C' `0 v9 _0 V
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
( l# W/ ]* X& J1 Y8 |7 J& I, P};2 d( Q' c* G/ X
7 \2 N: k3 D! u! r2 }( Rstatic void led_dev_release(struct device *dev)
8 ?5 ` c/ ^- V+ i3 x9 G{
: v! k8 w* I/ R};
9 L6 _9 a: U( f, {
6 p* q8 C2 H, ]4 A' ]$ j+ e) `$ Gstatic struct platform_device da850_evm_tl_leds_device = {
4 u6 n( a( ^) W5 v8 l0 n .name = "leds-gpio",; b3 n* e- D% c2 B( ], ?5 y# u
.id = 1,5 _6 F$ v; L; i' n% u
.dev = {& r4 y6 V' x# |4 B
.platform_data = &da850_evm_tl_leds_pdata,6 Q: ?3 z, O' b( w& f" z
.release = led_dev_release,
# r7 a( a7 ?; d7 H }% N$ H3 |1 ~+ I w0 t% W6 p
};
* E! G! D% u1 n3 `2 ?7 X. F( z$ p0 Y( | k$ g* @% ?/ @
static int __init led_platform_init(void)) _& j4 T7 O2 N9 T% K% o2 X; {; O
{
3 n' m8 W }% I$ y int ret;( l0 o9 ^: U$ U3 b. `; Z
#if 0
4 g+ A* }# ~' [* T ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 _+ z$ Y \3 I$ V6 _/ k: C( Y if (ret)" }6 g9 X7 d5 Q0 Q) k( {8 M
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" M& l6 _3 g( y. T; H9 u
"%d\n", ret);! c7 Y! R a- r# P0 s
#endif
3 j' b8 y$ H8 H# k ret = platform_device_register(&da850_evm_tl_leds_device);
7 z0 X$ a1 b% i if (ret)5 ?/ f' o; }7 q9 M2 ~' @8 W
pr_warning("Could not register som GPIO expander LEDS");4 z6 t* `& m& j
else+ I- L, d7 k5 }( W4 F$ d& l
printk(KERN_INFO "LED register sucessful!\n");+ _6 J# U9 l/ R' l
1 W3 r4 I( ^1 c* U! f return ret; C& U4 E6 e( T8 V
}5 s% ~7 s" K1 [. l* q5 m
$ H$ K, h0 x! T5 Zstatic void __exit led_platform_exit(void); q+ d/ L* v. N% s0 P
{0 I4 `: K, U z/ K
platform_device_unregister(&da850_evm_tl_leds_device);8 K* e$ v, p: c- D0 M
$ e! O; c; F7 ]& i7 O. }, a) ?
printk(KERN_INFO "LED unregister!\n");. b# d% ^, Z. ~6 U# V
}) c7 k6 b6 {9 G# c, [- C# t6 r
, `( F! k) P5 b& p7 k% w: J: {
module_init(led_platform_init);8 ^# |. k- I) T) Y; Y
module_exit(led_platform_exit);
! Y- i! a3 \' k, U/ `$ I7 w% e5 s: y: x4 F3 I
MODULE_DESCRIPTION("Led platform driver");
' L2 D1 @& k1 LMODULE_AUTHOR("Tronlong");
8 n3 C3 r3 @" ^. \/ RMODULE_LICENSE("GPL");$ D% w0 [/ S: U3 E
* s* B& }, A/ A n; j. r
|
|