|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
# @- b, X4 i' B! Q#include <linux/init.h>
r8 U8 t# Q+ |1 ~" p- U#include <linux/module.h>
9 T$ W* m+ y: i3 [#include <linux/kernel.h>
) d! l/ J3 Y# D3 Q: Y$ B#include <linux/types.h>: O( f- k {0 P8 A8 H* f
#include <linux/gpio.h>
8 A. `* _& e/ ^1 \#include <linux/leds.h>
' U; ]- A; p* B4 M9 L#include <linux/platform_device.h>
3 i6 b" ~4 H! y
) E0 P. l- @( N& g#include <asm/mach-types.h>* F& ^8 E; m: t y
#include <asm/mach/arch.h>; G" C8 O1 r5 `
#include <mach/da8xx.h>9 e% M4 E9 d9 l+ |
#include <mach/mux.h>1 i8 p, |3 `& C; w; H% A
# f; c" u2 f Q/ O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 b6 r+ k1 N+ C) |
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 k W; n: e9 i
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)" p; t. d; }. w% P( _8 h
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)0 [; ~. Z% w0 j( n0 g
+ v2 Y$ s1 \& D9 G, ]; @/* assign the tl som board LED-GPIOs*/5 @5 F. U( m. j2 {" q
static const short da850_evm_tl_user_led_pins[] = {1 F3 ? M) D! }
/* These pins are definition at <mach/mux.h> file */
1 c! n* H$ W# n0 I$ Y DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,. ~# O/ ^$ E1 W
-1
4 x1 a. X3 Y/ H d: \};
1 F" r% i5 O8 v2 S* ?- _" w5 q- F9 H( Z
static struct gpio_led da850_evm_tl_leds[] = {
! j C' \2 V- K* u& e5 R# h- ] {$ H' r9 I8 Z7 n2 n
.active_low = 0,
! V1 s: s0 B9 w0 O1 R .gpio = DA850_USER_LED0,* t6 C8 \/ {( e: M' V
.name = "user_led0",* f- L' g; H ~# J' k" o7 [. T
.default_trigger = "default-on",) h: ]! Z q5 O1 G; b0 @1 Y+ m- i+ r
},* J/ |! D& {: v6 Q1 `2 r, p
{0 j8 ~* Y$ \0 q) @5 d7 o. N
.active_low = 0,
% Y, R1 g5 f( f# T) f: ^ .gpio = DA850_USER_LED1,, J2 {$ x7 {1 O* ~; g. z3 J6 Z
.name = "user_led1",. _/ s- A5 E% r- S, M
.default_trigger = "default-on",+ }$ Y O4 Z% I# ^
},
5 U& G' M. }7 x( k2 O/ O {" k2 G( D3 s6 Q1 w1 C6 g, k
.active_low = 0,! ]- y, [" d! t, q
.gpio = DA850_USER_LED2, i% k# y/ @. B6 u
.name = "user_led2",
1 b! [* J6 M6 D5 h7 p- y .default_trigger = "default-on",- o6 H2 e( \+ [' h# C
},5 q! m1 L# _: _% I& J1 i
{
; o- \6 C9 l# B, \4 f: o2 l .active_low = 0,! q! t) h4 n1 ~. C0 y' y+ s+ n
.gpio = DA850_USER_LED3,
" h; n: n9 H2 n/ S: Q. X .name = "user_led3",
0 m5 r# C9 D% f0 @$ _$ D .default_trigger = "default-on",5 F# d2 r2 A+ f2 V
},$ L9 J: b; ~3 O
};
& R& z6 h" e. z% a6 Y( b) ^8 d" R- g6 u' u1 l
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' i7 T8 B' C9 e4 K4 `
.leds = da850_evm_tl_leds,
. D4 R" h- s8 ?" N2 K( p .num_leds = ARRAY_SIZE(da850_evm_tl_leds),' o% e) w. O+ ]5 {! j7 V
};
. r' G- y+ m4 \5 L# O) N! V; J! m$ F4 }8 C+ M, m
static void led_dev_release(struct device *dev)
5 \% _+ k8 [. J: D{
( p+ D5 C' W! C! n};
2 ~, g) G; i0 m8 x: V
6 p3 u, j0 Z, o5 u8 R, r5 Pstatic struct platform_device da850_evm_tl_leds_device = {9 k0 x9 q5 \ r @
.name = "leds-gpio",7 t8 w: q4 X- T' z
.id = 1,& Y$ r/ ~6 `( ~1 Q" t
.dev = {
' U# @& I; e# E& K5 M+ t .platform_data = &da850_evm_tl_leds_pdata,
! I" | v% y) e" E: { .release = led_dev_release,
" x Z/ |9 @$ Y2 @ }
9 g5 ]7 l" r, b3 f0 u};7 {5 @7 ?. z8 M2 @0 j$ U
9 C7 U" K3 }! M* a: O! v9 kstatic int __init led_platform_init(void)
- r' [$ ^8 ]- e{) g+ C" Q Z5 ^+ k; U% | X
int ret;$ k4 W( {4 F: `8 q
#if 0
5 _8 k; l3 h8 q" | ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 w% J$ _: o( D, t# M+ ~ if (ret)
. [" @ o5 a1 u$ g pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 e6 R0 t0 K# P/ @) F& l1 E
"%d\n", ret);% {2 K. u# |/ Y9 w
#endif+ U0 r) Q. L8 i
ret = platform_device_register(&da850_evm_tl_leds_device);
! A0 j# N C4 c0 y) {# w if (ret)! Q8 p' T* W4 k4 k- G" c- o
pr_warning("Could not register som GPIO expander LEDS");% P3 G* h2 {# c1 Z( O$ C
else
8 l) q6 R1 f; u printk(KERN_INFO "LED register sucessful!\n");
- F' \. u R4 Q6 Z! q3 A# H& m0 O( D) { e4 t+ j2 |9 ~1 o: L
return ret;
& b: }4 g" D8 b A2 F}/ e8 ~( q$ f6 T. N C
/ v! _& |& c8 Y7 |" c+ }static void __exit led_platform_exit(void)
' r8 K( H" B3 ` ^; _+ ~{" J. q: Z% D1 u
platform_device_unregister(&da850_evm_tl_leds_device);
! Y8 i4 F7 f7 X8 n( d
/ E9 }2 A- L/ a9 }% q" X/ R printk(KERN_INFO "LED unregister!\n");. D* F2 D; F& l' |
}
1 ]* }0 w3 Q [" i- A. T" c# u7 `
8 p! U" ^+ G/ f s% {: o0 e E4 fmodule_init(led_platform_init);8 [! G; N; u7 u) d
module_exit(led_platform_exit);
) z* b; m+ W1 a" O2 D* s& ~( s' P
MODULE_DESCRIPTION("Led platform driver");! b' n+ N6 H) T/ V# z
MODULE_AUTHOR("Tronlong");/ ~, E' o. K9 H1 M6 j: K
MODULE_LICENSE("GPL");
2 E. |% B% ?- K! |' C3 c, I$ ?6 Q: p: H, B6 ~
|
|