|
|
求大神给下面的程序做注解,请稍详细些,谢谢。/ V2 J" g0 o- e1 p* [& h% L
#include <linux/init.h>1 |% [, }5 Y0 O2 i# c
#include <linux/module.h>
8 T4 |6 C+ n1 Y) c8 I#include <linux/kernel.h>
2 R: a6 b( v( _#include <linux/types.h>. \( y" b7 Y0 O( H9 N& B
#include <linux/gpio.h> I; m; l% C1 o i- f
#include <linux/leds.h>* G3 o$ V, m4 p
#include <linux/platform_device.h>
8 P5 D# L9 u6 G& P$ E" C4 W. N9 z9 a( c2 D) E6 }
#include <asm/mach-types.h>9 ~) X1 G: x) e! _0 f2 q
#include <asm/mach/arch.h>" E8 ?% ]( I! [ E
#include <mach/da8xx.h>& V+ ~9 U2 T! \1 g
#include <mach/mux.h>4 h% H8 O3 q% B% X( {5 \
, W$ X& T4 t# w& F. D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
! O* ~9 w. e$ l/ I+ B6 L#define DA850_USER_LED1 GPIO_TO_PIN(0, 5); o( T6 h2 Z6 A$ `" |) _' u' @, a
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
; |3 P1 q1 R0 ~2 c#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)6 ~' \: X2 v7 g
. B. B& g( W0 V% |( ?' V
/* assign the tl som board LED-GPIOs*/
) c. o" I. E; M2 t3 dstatic const short da850_evm_tl_user_led_pins[] = {3 i8 c9 ]9 d# }% H. s+ Z% K5 P
/* These pins are definition at <mach/mux.h> file */
9 n* g d5 W ? DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ [$ x/ P x, H6 W% @+ s: C5 u
-1
% m1 k' }( i) K. j};/ E7 c9 A0 f) ^; x0 N2 H/ o& h
9 @8 n" {" e U, S( B1 O% M9 istatic struct gpio_led da850_evm_tl_leds[] = {' g- P2 v$ ]8 C7 d3 n
{
* \- p, H: z5 n/ @5 }( {4 y .active_low = 0,0 c1 H' I3 Y" l: v5 r1 S7 z
.gpio = DA850_USER_LED0,
' q. t5 I2 v) R* l .name = "user_led0",0 Z+ }% g& P0 z8 c
.default_trigger = "default-on",, O& Y- ^ B' N# P- n7 {4 n3 z* _
},
: d. g; N/ l! l% C; l% ] {, a: S- B5 ^) h7 s7 ~
.active_low = 0,
: S, G) O6 n3 h# Z .gpio = DA850_USER_LED1,
) C, l5 v' d3 j .name = "user_led1",
- x3 d/ P, d; c. R2 u, o& f- H .default_trigger = "default-on",
% d% Z/ B: N6 d( V2 K, u- D' C# o },
! Q; q9 b& Y7 ` W; _; Y& ~6 \. m! P- F {
7 w0 b. i0 J$ x .active_low = 0,
8 r, a2 v# A1 t; j .gpio = DA850_USER_LED2,
0 S0 i1 w- @( W2 i .name = "user_led2",
' {, b5 L7 W% V2 q0 T0 p w .default_trigger = "default-on",5 ?$ c- H3 J; ]
},
9 U( B: W' u J* z" G& i0 m( d {
& { p) D5 |0 f% V .active_low = 0,
- y/ k2 e9 Z/ m9 V3 U5 O, H .gpio = DA850_USER_LED3,. W9 B. [1 H0 V( \
.name = "user_led3",
6 D' R. p7 d1 r' j .default_trigger = "default-on",
9 B6 P1 X- t, w },
8 b2 o# V6 q+ m! m- k$ q" H};
! x; M0 e; {) Q$ E! Z5 _5 I' E5 Y& g, e
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
# e3 k4 e" X+ j& o+ V4 W9 g .leds = da850_evm_tl_leds,
, @. @/ B3 \1 k .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 p' J2 a. n' y7 a};
; w7 H }) h! P4 ?4 j+ B, x6 k
5 x" s ~# `- Y- qstatic void led_dev_release(struct device *dev)
3 r( e- Z+ L" @) l' ~{1 u5 o" ]7 ]$ ^0 b1 I7 c1 Z% c
};
% B- w1 y% @6 f! Y' E$ B
9 v0 C: h: X# Xstatic struct platform_device da850_evm_tl_leds_device = {1 A" l' f* F* N* f$ a* Z; V
.name = "leds-gpio",
9 Z. x2 A q* R7 {# n7 }$ c .id = 1,2 {7 e2 k/ d* }% V, x* J
.dev = {% H) |# C$ v3 }& t6 i: N. }: _
.platform_data = &da850_evm_tl_leds_pdata,
% b! p* p0 L. E: z0 H .release = led_dev_release,( F8 t( s1 s- I8 n6 ^( t# F& ]
}
0 W3 P% m& F1 a/ {7 k+ K$ n};
; c0 {4 p0 `: H" V; P" u3 A- p* I9 {* B' \! L
static int __init led_platform_init(void), C$ A1 H5 p5 |1 y. @8 i7 p
{
4 g$ l+ j+ ^) e6 i( W7 z int ret;6 G8 d- U$ n$ ?4 E- G
#if 0
- U2 f8 s8 a1 w5 G ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
; w6 k8 @! W s2 o, z( Y if (ret)
( a! f* }' Y* z1 n8 d; D0 F1 W pr_warning("da850_evm_tl_leds_init : User LED mux failed :"9 c3 \/ m8 G4 L5 i( k- W: r4 A
"%d\n", ret);! e, N1 v3 n9 C3 p4 u2 v8 l: M& u
#endif
]3 t$ I. `5 t ret = platform_device_register(&da850_evm_tl_leds_device);
3 f2 u! B7 C8 U6 n _ if (ret)- z# @. z5 x" s) Q1 {
pr_warning("Could not register som GPIO expander LEDS");
9 c$ {( ]3 E1 V: g' {8 c/ y else
( w0 m( e1 s5 U. | printk(KERN_INFO "LED register sucessful!\n");
3 h2 f+ q7 k) V
- t/ L: F! g) R) K# Q, N return ret;
1 g6 J. q0 l) z( ]& h8 m( [}
" x2 p& {% E2 z w/ N
7 y8 n8 X8 z* e2 e& A) m$ qstatic void __exit led_platform_exit(void)
! ?, t9 q/ o/ W. h5 ~{
: n* ~4 Q& c a' w/ V9 q0 j platform_device_unregister(&da850_evm_tl_leds_device);$ w' ~# Z1 ^: q; o/ A/ w% H N8 d
2 ?/ k$ m( w+ {- d h) ?3 f
printk(KERN_INFO "LED unregister!\n");
: C6 y# B6 @: @+ z# K6 K}
5 D+ \2 i* y8 V) q! T
" V9 o1 I3 m; tmodule_init(led_platform_init);
0 {7 m5 l: }4 ?0 G. M4 m5 M0 R- bmodule_exit(led_platform_exit);3 Y6 ^5 ^( K( N4 q3 J% b
) D q# C6 y9 {/ { K
MODULE_DESCRIPTION("Led platform driver");
- }4 J4 `0 p: O7 u5 t- j$ GMODULE_AUTHOR("Tronlong");/ C+ }) j% b F
MODULE_LICENSE("GPL");
# C) e7 Q& U- C' y+ ?
: z+ J. ^6 }. F7 d |
|