|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
. o# A# P! U7 L$ Q, V) {8 J1 J) J#include <linux/init.h>7 F* \' G4 q! L, b8 j' X9 G
#include <linux/module.h>
' M8 `" P7 e# U& `#include <linux/kernel.h>
+ e; a* v ~) k1 j/ e#include <linux/types.h>: g* H9 y$ Q& `$ O
#include <linux/gpio.h>% F \3 w" | N' V6 b; R
#include <linux/leds.h>4 Y' ~' S: @$ C$ H9 S/ N4 u' @
#include <linux/platform_device.h>
# x7 K( l& `) G- b2 r7 T" ]. N- b8 m% |
#include <asm/mach-types.h>; {' f: v5 M7 p5 q, u
#include <asm/mach/arch.h>4 _5 j8 b7 x4 j# O# p5 s1 \& R3 [% J
#include <mach/da8xx.h>
) `! U/ v( X' t9 F& L c' _#include <mach/mux.h>; [+ }$ P; P+ c& ~# _
9 v. S5 q/ U# @; P, `
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
3 H7 x! L% g) l. K1 O' S#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
/ I7 E* O: S, T1 `4 {#define DA850_USER_LED2 GPIO_TO_PIN(0, 1); k" v2 r) L* E" S( X& H
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)7 H" b0 D! T5 E" G0 W
2 R% i) g2 T0 n! f, a, [& S
/* assign the tl som board LED-GPIOs*/( _1 T$ Z) `, p5 s' A
static const short da850_evm_tl_user_led_pins[] = {
( ~ ]# v: X/ {, K8 F /* These pins are definition at <mach/mux.h> file */4 ~9 ^6 h# ]2 B
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
( F; N* t. z9 Q# ] -1
! e& m; o( L8 Z};3 E9 a, z6 @! E
6 D9 x' S R6 P
static struct gpio_led da850_evm_tl_leds[] = {3 w* u8 t. T- U
{
9 X1 @ O* X# k. B .active_low = 0,
$ O. u0 q; ^5 s+ k3 B9 T .gpio = DA850_USER_LED0,6 ]+ a8 ^! {& i5 ?
.name = "user_led0",
. N" y7 d1 o2 A .default_trigger = "default-on",' m& ]8 i8 t+ R1 b7 \6 ?
},* @1 z8 G- D- E3 i
{+ Y7 H6 z3 v \3 `! T& c1 m" C w
.active_low = 0,$ |6 l3 T" p5 p* Q# k8 b8 W( x
.gpio = DA850_USER_LED1,
9 ~# x. X& V" ^" k; j$ { .name = "user_led1",' b/ w' H h4 ^! C8 m- c
.default_trigger = "default-on",' J5 d4 y* F: T* C
},5 F Q# S0 ]( P! X+ ]2 d
{3 g8 H+ J3 d5 ~2 y* {# P; j* e4 W
.active_low = 0,
% A* X/ Y2 E. H" r6 l; r7 Z .gpio = DA850_USER_LED2,' x! U- L) \8 u9 q
.name = "user_led2",* Y! I7 D. x P. g2 s2 ]2 z$ ^$ @
.default_trigger = "default-on",- @7 l: E+ y( }1 m) k6 X
},. D- }4 z0 e8 m- V) X
{
' X& R$ V) |. V* n& v .active_low = 0,
p, z8 b2 }$ v) {, h5 ?! g/ x .gpio = DA850_USER_LED3,% [6 Q3 h, }6 M4 l7 h# O- q
.name = "user_led3",+ x! X; ?/ y8 u: i7 }! Y. T$ B( R9 l
.default_trigger = "default-on",, Q4 \/ h- T% \3 j1 r! b
},& b; w2 @' A) S: w5 ~
};
( P- U/ t6 y* z; l' c/ j+ n. k8 o( J. F2 x( v
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {7 c' d( R. H" b' p
.leds = da850_evm_tl_leds,
9 G% H; x4 q! B7 U/ m .num_leds = ARRAY_SIZE(da850_evm_tl_leds),, p; x- ?! P1 m1 L3 ]
};% p% P8 V* {. ^$ }( N$ a
2 V& i$ O( W: ]$ D, d c
static void led_dev_release(struct device *dev)
4 h( |$ I( [" T% p+ `{% Z5 D( H8 B- i+ r: y
};
; M3 [8 d$ Z+ `- @& a K7 c3 x
R* {4 y! D/ estatic struct platform_device da850_evm_tl_leds_device = {- w% Q. Y) q- {) }/ P
.name = "leds-gpio",+ c2 Q( E: I- n) i1 V! f
.id = 1,
/ P. J* [9 Z; L" m .dev = {
. t; c0 J P \+ [- w2 W& T .platform_data = &da850_evm_tl_leds_pdata,, @, j! K$ g. _" K6 d+ Q* k6 t' H3 K
.release = led_dev_release,
: m' X2 }3 x+ `# W9 D }
. T8 l+ S% p; L. _};
* n& s, C6 r, E' H1 ~7 o/ v+ e* c' |9 ~+ y p6 V
static int __init led_platform_init(void)5 W* ` {6 y2 L! O& E7 A
{
5 s0 a6 V- l& `' B- a7 j int ret;1 J( i' K- m# @: E
#if 00 I: B9 {7 |; _* |8 a3 `
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ K; h% o( P B7 W }9 G if (ret)
+ W* R o% `% v6 C pr_warning("da850_evm_tl_leds_init : User LED mux failed :"' J4 C; g$ W- B! z
"%d\n", ret);3 b% |1 q8 e/ I2 G. H6 ^
#endif7 k }- U# Y9 `; B! Q) P+ v0 K, K6 A
ret = platform_device_register(&da850_evm_tl_leds_device);
' r& Q% r0 _* Y! p* U if (ret)
; x! Y1 V1 T- w" e: y) T- f4 R pr_warning("Could not register som GPIO expander LEDS");
' D* A1 c d, l& N# X; i3 F else
& x0 ^, q8 L b5 k) Y printk(KERN_INFO "LED register sucessful!\n");
& @6 ^! z- W3 D& @ m+ U2 B$ `7 B5 F" J" o" L' @
return ret;9 m$ [8 h2 v0 f$ K0 N' ]9 |+ L
}
C4 ?$ Q" c9 T! a2 p8 a, N2 O% Q( G$ E
static void __exit led_platform_exit(void)
Y2 _+ i' [' G" ~' r- E: `/ |{; j. g$ C9 v Q5 T% p
platform_device_unregister(&da850_evm_tl_leds_device);" B- m! d/ U( {9 X$ `' r
4 t1 C( b4 L, G printk(KERN_INFO "LED unregister!\n");1 |4 s" C- d4 q0 d. ^9 P$ ?4 a
}
# X( z) k2 e4 O! T ~3 z y9 q2 C1 c( p( G a
module_init(led_platform_init);
' K( i4 t* Q( Z3 Hmodule_exit(led_platform_exit);
, r5 k+ K( m) @8 v& h* b7 ]! o% i/ u9 W! }2 [
MODULE_DESCRIPTION("Led platform driver");0 e& p, F" f5 s
MODULE_AUTHOR("Tronlong");- C! ?3 [. o. x1 b$ g
MODULE_LICENSE("GPL");
' q5 r$ x! H) |! K/ Y& q+ V4 @$ O, G+ ~% ~
|
|