|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 o7 {& h7 p) m+ ]9 Y+ _
#include <linux/init.h>$ C! h( Z& U* K' D" L- b
#include <linux/module.h>
9 ~' O5 N; O3 _: Y* J7 I8 S! A6 L) Q#include <linux/kernel.h>1 ~+ O2 p" c( K- ^$ y0 f
#include <linux/types.h>/ k! G0 a8 B! w: h- a
#include <linux/gpio.h>
( |# {1 W( Q& y. C; K7 A X#include <linux/leds.h>( K0 {; O5 c, E$ M- l! o7 F
#include <linux/platform_device.h>
$ B) x n8 y0 g- Z" C1 m7 K1 J0 g
; a) O' ]+ _& X1 R: ]" R#include <asm/mach-types.h>5 @: l' P: w0 r. g: _
#include <asm/mach/arch.h>. c3 |9 b3 _9 b1 k' b' I# m
#include <mach/da8xx.h>
: t" a& ]; k* v( Y#include <mach/mux.h>
! v2 d2 P7 ?+ T) J3 i& m* M( V) }2 A) x! x. W9 B% b
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( t5 J& g9 w! J; U% I#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)% B, X) k" ~/ l* m: R7 ?% S3 F
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
2 @/ n' v, O. ^, {6 h" B#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 m8 g C4 |1 C- @$ d. J7 f; x/ c8 i* f, a! @& z# T: W$ ^
/* assign the tl som board LED-GPIOs*/
7 [! K0 a" }3 @7 S* u7 Nstatic const short da850_evm_tl_user_led_pins[] = {
, [. z# k" _! y9 T& F- K, C2 p$ g$ l) Y /* These pins are definition at <mach/mux.h> file */7 n6 ~( f. j' h. M" g- `7 u
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,. v1 P3 v0 l2 \2 E' s' k2 Z8 I% I
-1
1 g+ G! |8 p; W: L: a, ]: R3 [};2 ^" N+ G2 r/ O1 W) b4 `- P
. a7 X& G5 L3 J' s. Cstatic struct gpio_led da850_evm_tl_leds[] = {
) s/ p9 r4 U6 M- R' R {
: M% G0 l/ ~+ h3 Q( J ~ .active_low = 0,
4 E1 h& N" O' r+ k .gpio = DA850_USER_LED0,& h: `5 [+ ^- A* O b, l! h
.name = "user_led0",
/ x7 H; J* c9 h' W, f0 p( X .default_trigger = "default-on",( f* D8 S- `; h1 \% X+ x
},4 O8 S& `: R4 ^) e
{
1 I/ [ s) |8 f& r .active_low = 0,9 R* y2 {4 N/ P+ g' B, q/ k
.gpio = DA850_USER_LED1,* b* U0 A7 j4 `# {5 z
.name = "user_led1",' K) ]- ~6 h* H$ W/ s+ L9 e
.default_trigger = "default-on",+ ?" H& r) r6 C. B/ D" i
},' _6 M+ D! E8 N" {6 o9 A
{
9 E# R8 E/ |5 ]; n .active_low = 0,
* S/ x, R; t% Z .gpio = DA850_USER_LED2,, }" q7 p# \ H; u
.name = "user_led2",' P6 D! }. e M3 S6 T
.default_trigger = "default-on",
1 o" Y3 ?* f% M1 F- F+ y/ B, p },
4 n+ d e4 _( n4 R" x {2 o, g3 n) c0 I/ X
.active_low = 0,: u3 j2 u( W! R( w! W) Q- k
.gpio = DA850_USER_LED3,! H9 U* R; s8 j; O. x* i8 k; O
.name = "user_led3",# S$ n3 F2 ^: \( S* a A
.default_trigger = "default-on",% b. ]2 Y; O2 M* B# U
},
* W" I& j1 H( P};1 g0 `+ n/ L/ G& `1 u7 @
+ U1 B1 _8 N# i- G5 l/ U4 F
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {, y5 Q* i% Y/ ?: E- f& h2 }
.leds = da850_evm_tl_leds,
8 v) H, b$ ^) P2 P9 b& ^& }" { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
! J' Q% M7 n; m: g/ ^- @% Y};2 j/ E( `5 O8 `
+ d# d6 ?/ J' f. l8 astatic void led_dev_release(struct device *dev)
. s# k: x! f2 |3 ~5 H% V{
9 E4 O7 e5 f% x};6 F$ a2 Z1 z$ ^; R' j' W
3 W% h! F8 d# r/ U0 m! `static struct platform_device da850_evm_tl_leds_device = {( W% w( q) E! s
.name = "leds-gpio",
, r& f# h& [2 n+ { e+ X .id = 1,
& J3 }0 G6 X& K2 U, _ .dev = {
6 U; i% b- Q" j, u' Y4 | .platform_data = &da850_evm_tl_leds_pdata,
, p3 ]2 E) f& G! E .release = led_dev_release,) |, w+ Y% A3 B+ |& p2 R$ [
}
5 H+ B2 g* Y$ Y1 ?7 D, d8 k" ?; o};
8 C+ a R& q* ^' w& Q7 ?( ~4 H6 W5 z- t" h9 G& j7 W
static int __init led_platform_init(void)
4 W2 \$ P% ~4 C4 e; k{
% T, e6 [% ~) l, c int ret;
0 u# u1 c3 `5 {1 f) h#if 02 O$ H( H$ `* g' }; y6 P4 a
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
* S9 S8 o( P3 i6 O4 r& c5 t. D if (ret), Y1 _- O- h- A' {/ q& n
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"8 S% \, f7 @3 ^4 C# B& Y8 N+ @
"%d\n", ret);% N( D' ^ G% V& V5 s! o( Y
#endif: k- S7 V j. N* c6 B" X
ret = platform_device_register(&da850_evm_tl_leds_device);/ j0 ]: I. c j6 w. F' F! I
if (ret)
5 d- J" P7 |4 e! T pr_warning("Could not register som GPIO expander LEDS");
% Y( B, w! j' w else9 H$ M) Q: o3 D
printk(KERN_INFO "LED register sucessful!\n");
$ \! }1 N; h# m$ x& r
. u3 I6 a+ `% q G. D2 u return ret;
( g( Q0 X1 y% @: D. }}
e% B2 G1 X! E
0 {8 y7 t7 F( U- U7 W9 ?2 Lstatic void __exit led_platform_exit(void); j5 E4 j! _' p1 g
{6 w8 C Z* Y+ @2 v
platform_device_unregister(&da850_evm_tl_leds_device);. E3 l8 ?7 Z4 e7 g1 I% a% h& I
]4 \' ]* e2 l0 y printk(KERN_INFO "LED unregister!\n");+ T7 r& c K% f) j
}2 f4 {- Y d+ K
* R5 P( ~1 K( ?% Y
module_init(led_platform_init); k+ A0 s" ]: J' m
module_exit(led_platform_exit);
8 U3 C- B9 d D/ ?! L0 W
8 a8 q G2 U, U8 AMODULE_DESCRIPTION("Led platform driver");
' y( q9 g7 r3 N9 M4 `, P4 cMODULE_AUTHOR("Tronlong");) K* q4 y. e) j7 Q6 B* J8 ~- T; h8 |7 r
MODULE_LICENSE("GPL");
l( [# ^1 t x$ h( B1 |9 z) n3 f; D
|
|