|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
3 j) l6 v+ }0 V4 ]: H- `#include <linux/init.h>
& f8 [& t2 W# ?0 h# c7 U% _#include <linux/module.h>
& l3 Q' E0 ^, F- L# ?- C#include <linux/kernel.h>; D9 d6 Z8 N) e$ [8 m
#include <linux/types.h>
( A. @5 O3 T- F- `#include <linux/gpio.h>
, @; n5 j7 u4 @5 w3 K( {: L- X#include <linux/leds.h>
/ S* }& E3 d! F8 M- ~5 t#include <linux/platform_device.h>
) I8 a/ P3 F% u3 h8 y, T. D+ ]: L
#include <asm/mach-types.h>
6 [. g( @, U' _- p#include <asm/mach/arch.h>
/ n0 T1 Y: f0 C/ d! N#include <mach/da8xx.h>& u$ a, T4 C8 I7 g+ G
#include <mach/mux.h>9 }9 G5 K2 v1 _6 H" ?
8 H- L/ K2 h; h& Y4 {#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)/ N |. D; O: u. C
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
5 C) E$ u- e) Y* a3 m#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% D4 a! Q! T% Q#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
" i% p4 p! N! l6 z
$ Q9 U9 }6 r5 u. Y: Y5 W/* assign the tl som board LED-GPIOs*/# G8 n8 c" s Y9 n! c( L
static const short da850_evm_tl_user_led_pins[] = {1 F! Z4 o; Z. G$ X6 x
/* These pins are definition at <mach/mux.h> file */
% M4 ~& Q* z# ^7 ?3 b DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,( `" n7 _, p5 T" \, {1 P1 o+ \
-1+ s0 j1 m/ J4 I. B# F
};
v z! i: l3 n0 P1 c/ o0 M7 N, r; C. Q' I' r( U
static struct gpio_led da850_evm_tl_leds[] = {
. q t# u& P {1 k) m- p; O {
6 j* v% o0 w9 d% N6 P. [1 W .active_low = 0,5 q1 K% L, p+ X
.gpio = DA850_USER_LED0,
5 @6 v& _, b; v1 {: ? .name = "user_led0",- Z: K" u) O2 j& P0 U" r0 U
.default_trigger = "default-on",( @) i& o6 d& m1 R
},4 S$ f: r; `7 e, k
{+ h- {1 d) @8 P, W1 p1 ]) O
.active_low = 0,( v( A& u: c& I. {3 G/ r- ~
.gpio = DA850_USER_LED1,
3 H+ ?6 {) S9 X$ |" P' w .name = "user_led1",% N. K2 }/ e, N
.default_trigger = "default-on",: Z' f+ ?3 Y# r" A
},6 l8 [- E- p4 D
{
, o. D6 t a/ q. t' g+ I .active_low = 0,
- {1 @& S, e! c' S .gpio = DA850_USER_LED2,7 C0 S! j8 ~8 L0 ?/ j9 X! k$ Z
.name = "user_led2",8 B: }* u5 c4 ?6 F6 `" N
.default_trigger = "default-on",
& X0 P0 @% r+ H# l7 R( _% ^ },
" T0 i' y! W4 s {5 w( V: a5 c+ l0 ]' f, U. D9 J
.active_low = 0,' \: ~; h4 T4 d" w& m& j
.gpio = DA850_USER_LED3,$ c& m' c& z; i( K2 R: D
.name = "user_led3",# Q% @& l+ n; G) T# S8 b. j
.default_trigger = "default-on",# _/ I7 k& b) F: V9 [+ G
},
, N8 X2 Z1 g. [! }" w4 F3 S};
# x E' H: i) l' z' h/ `
' T5 o8 ~2 T/ S: s1 M1 Ostatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 |3 M) ^0 S8 d; J- X7 O% x9 B .leds = da850_evm_tl_leds,
2 j" [( N& g" q8 m7 B5 M: c .num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ g" d% P3 Q) M5 i
};' G4 N& C* J0 U, c- g) K
" C. O) P1 s) R. z" k0 i0 Gstatic void led_dev_release(struct device *dev)
) E. O3 ^6 x- C4 K4 v1 U{$ T+ [2 B: I; ~! y% {+ M; u
};5 e# Q0 P& L, [# o2 \0 I$ }% Z7 P
9 l% T% j) p7 _: s9 Q: y; h! mstatic struct platform_device da850_evm_tl_leds_device = {! g |& F! ^ y
.name = "leds-gpio",
9 z- r' k$ ]. { .id = 1,
, s/ ?' F Z& c! b .dev = {) T* d* T$ ]' k
.platform_data = &da850_evm_tl_leds_pdata,
9 x7 \/ g2 Q1 h3 J9 g/ V1 U+ n7 S .release = led_dev_release,
: O' Q6 n- o0 R2 E% X2 W7 _ }
# k, G: ?- u3 v1 E};2 Z1 ?% m( z5 M& u7 E! l2 M4 ?* e6 ]
' Y+ c- ~8 g$ Z( y
static int __init led_platform_init(void)
& Q% h4 X- U8 K6 x" ^{
3 B' c" ^+ D7 X6 u! b' f( _ int ret;
8 R2 T" I4 e2 r7 T#if 0
- c* o; F* W) c9 F! m9 [ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);- }" b0 d; y% L/ x! \
if (ret)4 W7 Q! L4 B$ b- g8 _7 \6 Y8 X8 N9 Z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
& p3 d9 m1 B& G! M% B "%d\n", ret);, [7 y' \! m, y+ J
#endif
. [. h/ V+ x( [ ret = platform_device_register(&da850_evm_tl_leds_device);
# C' V% E* t) ^: K! M. R: Z L if (ret)
7 m" A* G5 v& @3 i x/ C pr_warning("Could not register som GPIO expander LEDS");
6 S: B! w% I# ^3 c else
. Q4 Y! j, s: c6 M3 G7 c7 P printk(KERN_INFO "LED register sucessful!\n");
! K& Y1 P+ J- n6 p8 h9 p
- T7 ~; g& u2 a7 K5 | return ret;
$ N. w/ ~3 r g0 s}
; R' X' K7 h7 x) I/ z$ R, X. n8 y% j% B5 N! S
static void __exit led_platform_exit(void)) Z/ Q; N( I8 \& G
{
3 {; j3 s6 w' u- E, [, |/ [: d platform_device_unregister(&da850_evm_tl_leds_device);
! I* K0 [6 T; Y9 j: l d8 g
- y) {8 d# _' W2 b, U3 v" o4 s# H printk(KERN_INFO "LED unregister!\n");! x2 G1 ]* ^9 [
} t) h: ~# t5 H* `% {
$ X( n$ V1 A/ v$ y7 B' C% w# q- ]
module_init(led_platform_init);
. m/ D7 U g; ]& x* _: F# L6 Omodule_exit(led_platform_exit); \. z! F5 A& N: g$ W5 C' T; j
7 u, s- R4 s/ _! R( }
MODULE_DESCRIPTION("Led platform driver");. S$ C* _$ _, B3 t! ~4 ` F8 X
MODULE_AUTHOR("Tronlong");/ o+ n: L/ b8 g' Z4 t
MODULE_LICENSE("GPL");0 D0 p: h( W5 O5 {2 o5 V; e; l s
) C1 B n1 U) {: y3 N
|
|