|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
7 A8 P3 l, S9 Q5 \#include <linux/init.h>$ d' M+ ~: b0 }8 v
#include <linux/module.h>3 C+ J3 Z( J' n: O' s
#include <linux/kernel.h>; |& c3 n+ m% J( a4 E
#include <linux/types.h>% w7 z8 @. d5 f& d1 M8 k( r
#include <linux/gpio.h>( ^2 C; v# E0 ~$ a F g
#include <linux/leds.h>5 q7 [* }8 f1 \0 |5 c$ Y* U" f
#include <linux/platform_device.h>
: a/ n& [$ S5 D! m; P P/ v, B" ]3 X h" N
#include <asm/mach-types.h> d, y8 K% @& v0 C' L
#include <asm/mach/arch.h>7 H% e, F$ \2 @- |+ c7 e$ x
#include <mach/da8xx.h>
; j2 p; r. K! [' d3 |4 W( a#include <mach/mux.h>6 E3 k! `% M3 w2 y, E- c; s. [ \
& |) A; g3 y' W D#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
1 q" g$ g, }& B#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)% ^' a5 `" }& O
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: `4 C& ~" o2 l- t#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) _ N; u( `, J7 t- c( j
4 L* K8 k5 G# h& ^1 I4 l
/* assign the tl som board LED-GPIOs*/# ?4 l `) j, X2 v
static const short da850_evm_tl_user_led_pins[] = {! ? S7 A3 B; N2 G2 }
/* These pins are definition at <mach/mux.h> file */
9 a5 Q5 Q5 |6 K4 ]- {1 W DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
7 v( |) t; u$ m, ^. A -1
+ s! C U) Y+ S6 C};$ L+ f! ~- h! l/ K8 h: y1 ]! ]
- M. r) z' Y/ J% B, h3 [
static struct gpio_led da850_evm_tl_leds[] = {9 L+ x& c( P G" r: D) i
{
5 x, Q* R% j3 } .active_low = 0,3 u2 ]; ]3 J( A; x) N
.gpio = DA850_USER_LED0,
3 v. `* r$ @8 y4 } .name = "user_led0",4 f2 g% |/ i$ _/ o6 n, t- [* J( w
.default_trigger = "default-on",
# l; f ^/ a2 c( n. |. l },
3 R8 T: m0 [ j {
! E- B# @% \/ a .active_low = 0,
/ b m1 ~9 D% ?! K .gpio = DA850_USER_LED1,
! ~8 Z* ]# ]5 C4 M .name = "user_led1",
Q2 D9 l8 B4 [, r. W( @ .default_trigger = "default-on",
# O" K$ x: V9 b% l X },* v9 `. d- y( |7 I( l+ D
{$ K' `- e1 h( F5 {2 r( P
.active_low = 0,% f" r! ?* |( L
.gpio = DA850_USER_LED2,3 Q6 {; M; B5 h+ j
.name = "user_led2",. B+ K1 l6 l9 F5 M. S. @
.default_trigger = "default-on",
- p5 Z, I' E& [7 t* d# H },- _( w5 V- t$ \* f# t- m0 X
{
& O% a Q/ H8 u. o5 x0 j# P: E .active_low = 0,% l4 ^7 E1 x/ U, s
.gpio = DA850_USER_LED3,
8 f8 O T; z) g: s J- H. N .name = "user_led3",
7 p# O9 w5 w: }3 Y( j( V% _ .default_trigger = "default-on",; C6 ?# b8 D$ j8 s: v& `, U6 _
},4 O- g9 \% q) J1 r* h
};4 H. P9 ^4 i! a: H+ }
% u$ [2 I8 s( p1 G+ estatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* Z+ k5 c' \3 E: ^) S .leds = da850_evm_tl_leds,
5 x- H9 a( A+ o2 m% q; {/ R .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
1 F* ?9 W; B7 S! B5 y/ n};3 p- e! n$ R' `( ~! h
+ H( L, I4 H3 z# \1 k/ I$ Ystatic void led_dev_release(struct device *dev)$ C& {9 n! Q+ V% _
{
1 V+ B6 L; _7 c, N( U; [};
- r8 J9 _3 f# Z9 F5 r! e8 U1 e! \! H7 F0 \8 j: \' j5 R) k! [8 e) y1 S
static struct platform_device da850_evm_tl_leds_device = {' {* \8 { @6 N2 {
.name = "leds-gpio",
# o) ?, J5 ]+ F" U0 z* \1 d9 ` .id = 1,9 E, b$ ~. S; r
.dev = { y! D3 B% _( `8 b: s% q" {2 {
.platform_data = &da850_evm_tl_leds_pdata,3 D" K( h4 h/ o, o0 p
.release = led_dev_release,
# I2 |. v: a' [/ f L }/ M& n: l/ X5 v
};( z0 m: u0 d. G/ M! O4 I
) N9 v1 z* J9 a7 _static int __init led_platform_init(void)( q/ M. i1 d: a5 F3 s1 r
{# X6 Z% E; u. L- ^+ i4 L' r
int ret;
, k& m% ^& o9 d+ Z. `6 J/ a#if 0
. D1 m8 k& L" q ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);; L, Y- J- \6 g2 z
if (ret)+ A2 T. _. S- S0 W: s
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ J+ }2 W8 j* `& c% _
"%d\n", ret);
/ z" d7 D4 y7 x( |! K- L) m#endif
/ G! ]# R8 M/ O ret = platform_device_register(&da850_evm_tl_leds_device);2 O" `: s- _" K: Q) C/ R
if (ret). U4 p) D- Y) p. W; {8 t4 i
pr_warning("Could not register som GPIO expander LEDS");
& A% p9 [) t* a7 F3 B' Z x A else
- e0 ]7 P3 i: p- ?1 [ printk(KERN_INFO "LED register sucessful!\n");
% g+ |5 s; p" j. \- f8 Z5 I- F3 ~ N1 P7 G" R$ }
return ret;2 \* A9 f5 ^; m) d7 h: W4 J
}
) G/ z% k2 ~ F3 w, Z& n# i1 X' H1 B, U6 z- U
static void __exit led_platform_exit(void)
9 r; g, E1 N- x' T1 b7 ]! D& T3 T{
1 X& k8 O* q$ G% E8 K. P platform_device_unregister(&da850_evm_tl_leds_device);; a/ B& g8 E& t6 V% v
: r( A- L7 F% E4 L: V% v/ C
printk(KERN_INFO "LED unregister!\n");
& q6 Y) T/ C* V& V}
: Z9 j7 l- y% b( `* { Y. s: J! V" W0 U, I# C2 c6 W2 I0 b
module_init(led_platform_init);
9 u/ M+ a d( W) O9 e1 Qmodule_exit(led_platform_exit);" @6 F6 f% O2 a* R! v
7 t/ \) X7 t: M( k/ XMODULE_DESCRIPTION("Led platform driver");
, G% T7 }1 m& y- H! h3 eMODULE_AUTHOR("Tronlong");
2 y) Z6 h4 @ J- d8 w0 EMODULE_LICENSE("GPL");0 G, M) y+ A! t5 \2 K; k# Q+ v
! o2 i! l6 ^! r; ~5 O7 f9 j0 a |
|