|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; c- a* P8 w6 B: |9 y5 b8 D
#include <linux/init.h>
8 @2 |% k& w ?$ q#include <linux/module.h>- C: _; R( k% s8 p/ _, |7 V) o P
#include <linux/kernel.h>
& V# [( _, X6 h; x$ Z#include <linux/types.h>9 W- n i. |! j q; p; Z
#include <linux/gpio.h>7 A0 E8 d) `6 i2 N
#include <linux/leds.h>
2 \- w+ m; v6 p" x8 ]+ ^' n. O#include <linux/platform_device.h>
& r6 R r; |) n
( F, a. v/ n3 ]' ^" g* f* ^#include <asm/mach-types.h>0 {: \& y: y5 p, e
#include <asm/mach/arch.h>+ k! q% Q- p. M4 S
#include <mach/da8xx.h>
% Z# ?! M' G, u5 K( V2 S/ k#include <mach/mux.h>
1 B* U# ]8 o- D6 ]9 \' C
# X5 C: r! N3 w4 S2 o) K2 T) m#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
: ^) h. V5 B3 r/ }#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)4 \2 r. d+ Y6 Y: @, u$ { u- C+ r3 Z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% w \% P9 O/ @9 {# i0 F#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 A/ ?5 @+ v0 x( e$ i
8 W) ?& I6 h' X' L' ]' a/* assign the tl som board LED-GPIOs*/6 y- ?( H; W2 r: r1 k g
static const short da850_evm_tl_user_led_pins[] = {
" h' Q0 B8 E; L' [9 [: d3 n8 O /* These pins are definition at <mach/mux.h> file */! _; t/ F7 }, D( v: e$ l8 Q, Y. H- O& [
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
- p" [. `+ g# }( F! C -1+ s1 d8 {8 k6 o3 {
};/ t- m3 g9 f/ V: B; @) h
4 T5 ~# E: k" b+ H/ l
static struct gpio_led da850_evm_tl_leds[] = {
7 D4 U* R6 f! l8 H" H0 f9 e {
3 ?: d+ j( y: f3 j- Y9 X2 c .active_low = 0,
5 \5 _ Y+ ~6 f8 u$ m .gpio = DA850_USER_LED0,
! ^7 B* B9 l1 X8 t .name = "user_led0",
; l+ N2 [' m, r/ e .default_trigger = "default-on",
4 g8 X$ y7 Z, s/ e) i' R4 ^( ]$ V },1 \, X( X' Y2 L9 g9 c
{( [6 Q: k+ m! ?7 P* i$ p
.active_low = 0,/ p- ]5 C. C' V4 E* o) G1 N
.gpio = DA850_USER_LED1,
$ R' ^# r: J/ a+ ^7 l0 W& T4 b .name = "user_led1",0 N4 S6 H+ E& B4 n
.default_trigger = "default-on",
' W# k; ~" j! U5 s1 R' A: I+ O' @ },
% O# z2 o3 n* K% T {
3 }0 m6 }! w! ?' j1 |. u! |; o9 N .active_low = 0, S! |# h3 t; D/ t5 e3 w: x0 `
.gpio = DA850_USER_LED2,2 m( }. f1 A5 j' ]2 i: q; _. O
.name = "user_led2",) K9 S7 ] W6 D6 ?! D% t' v
.default_trigger = "default-on",
4 Z c( Q' ?$ R& o },2 |7 g$ [/ P5 ?9 F, }
{3 H! q- }, }: Q
.active_low = 0,- z& B8 e' M: U4 Z
.gpio = DA850_USER_LED3,
1 x) U! A1 l3 ` .name = "user_led3",9 \0 l$ `) G2 k- q( U
.default_trigger = "default-on",* c* k" y# H4 n& C8 ~
},$ ?1 {* W+ M! ]5 q2 m/ ~' x4 ~$ S3 X" `
};0 |, w' y; x! h+ S) @+ Z. i
" N6 H9 v- B% e" H3 J1 _% D1 b
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {9 P( r7 k7 F r0 h3 ^8 k
.leds = da850_evm_tl_leds,) t6 A5 f9 s3 F
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),7 J6 e ~) n' h0 x! y( s
};) u4 ^* A: x5 Q" s2 c. Z z
) ?( H' F4 h H' u
static void led_dev_release(struct device *dev)0 I! a4 k8 S4 _* N
{. I& |( v" |/ B( j. ~/ k. S
};
) K0 T9 P S3 K$ Y; ~( K; y( g1 o) i9 i) O, |7 g# ~
static struct platform_device da850_evm_tl_leds_device = { Z Q6 r1 \) a/ S) K9 w) y
.name = "leds-gpio",0 U$ B m. A3 x; a, s0 E/ U
.id = 1,
6 h3 ]! }) R2 u/ x8 p .dev = {
" s* o& Y& i0 @- e- a .platform_data = &da850_evm_tl_leds_pdata, \- u3 r9 n( k: H2 A
.release = led_dev_release,+ n7 P$ B# S! r) D0 S
}
1 ~; H3 e+ r3 Q+ r$ R};
, d1 `2 Q6 E3 S# k8 s/ X! [% h9 S5 [
static int __init led_platform_init(void)
! l: N. c* e3 D* u) Y( n4 Y' _{
6 W% E0 ^' m/ T int ret;) H) ^% S: @6 }; _
#if 0- `: t- d/ T* v$ u
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);' P1 T$ k% p8 h
if (ret)
/ X; g5 ~- \. v" Q- x7 `9 H |- ]( g pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
: u a' V. ^0 K. N }( S" C/ k) ~( f% k "%d\n", ret);4 n% f! W6 d+ Y; @7 i. @
#endif6 [% F3 o0 k4 v8 [$ P F
ret = platform_device_register(&da850_evm_tl_leds_device);. |4 D8 f9 u( {" k e5 `
if (ret)* Q6 G6 r- M. E6 N9 y+ W
pr_warning("Could not register som GPIO expander LEDS");
* P$ Z3 _9 i1 z } else
( i, A& [5 u8 x% ?5 u2 P printk(KERN_INFO "LED register sucessful!\n");7 v0 X) I, ]! q- v, q9 i8 n2 v, F$ a+ I2 e
+ \. c5 l* @1 l6 Y+ a# } return ret;
% q/ _- l6 `* I6 k4 B4 I}7 S$ v8 l2 S; {& U { f n1 y0 q+ n
' P4 a. K& _7 K+ q8 X6 ]; f
static void __exit led_platform_exit(void)
" m* y. X/ V( ~, k{
/ j! O7 v7 l" F6 n5 E2 N2 ` platform_device_unregister(&da850_evm_tl_leds_device);6 X2 X$ Z$ D4 D: q! P. E
- `( d; ? z6 n6 m
printk(KERN_INFO "LED unregister!\n");- B5 h9 K1 y, R: X; ]& D
}. @# A% M1 B% a# |5 x% r
' @1 c; k: r7 R6 }: R9 p4 qmodule_init(led_platform_init);( @, R' Q: ^& _% A
module_exit(led_platform_exit);
* ^4 |6 d% c' `& u7 E
6 L. C7 T% p7 @! oMODULE_DESCRIPTION("Led platform driver");
# A. h# `& ?$ ]5 T! hMODULE_AUTHOR("Tronlong");" W# ~) T) s6 J I1 [4 s; _) ~3 q
MODULE_LICENSE("GPL");
+ O/ A/ f! U \2 t/ b7 a% w8 F
9 [/ E- n3 I3 j) P |
|