|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
9 @% _: y8 _* T8 l/ `#include <linux/init.h>
8 o0 u: E, ]8 e$ i p#include <linux/module.h>. Q- V$ q- K1 m& |' Y. C
#include <linux/kernel.h>
( h1 v) T7 `: {& J+ i+ J#include <linux/types.h>* L0 X: c1 T% H. v# {1 W% j6 {
#include <linux/gpio.h>
( s, H5 e# s7 F: S1 ]. \#include <linux/leds.h>: T0 q9 M7 N' i F- h2 O
#include <linux/platform_device.h>
/ L2 _: [% W0 w9 S7 a, f; y
$ e9 ?; O5 f! h#include <asm/mach-types.h>
Q6 J. a6 k% Z5 H g#include <asm/mach/arch.h>; q7 u, x. g0 ^3 X0 N3 ]: d9 ]7 N
#include <mach/da8xx.h>6 k- N( \" F4 x) n' n8 I
#include <mach/mux.h>2 o. H9 H2 M+ }: M: K( ~$ ~. A
( m5 R. F: m+ n1 s' N4 O+ n& F#define DA850_USER_LED0 GPIO_TO_PIN(0, 0). x8 t4 [* }/ p- h4 j. c% P$ t
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
+ {/ z1 M+ L1 z! h% w#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). i! j Y3 | a$ V) @
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
r' p: @% e! U% P# F; Y: s' h" v7 y' \2 ? _
/* assign the tl som board LED-GPIOs*/. \- N& ~$ W5 r
static const short da850_evm_tl_user_led_pins[] = {+ [5 e( a6 K# p u0 e& U8 Y
/* These pins are definition at <mach/mux.h> file */0 V5 X- c" X* J7 p+ J
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,1 C5 Z; k9 y# C- j/ g- c$ t( F
-1
! r) C4 M% D z( C};
}) J- ~# M% v- L! ]/ M8 Y' i8 Z- w, f7 T3 m
static struct gpio_led da850_evm_tl_leds[] = {6 K- o2 K; ~4 ], t g# P- t
{
7 }* S# \8 k ?9 d .active_low = 0,
' m# N( R/ a& D( r$ L .gpio = DA850_USER_LED0,
' p* u9 u; V3 p( y .name = "user_led0",, S" [ _$ g- B% W1 v
.default_trigger = "default-on",) i: v) c. l* }- K
},! `' B9 ^2 k8 N: Y0 g, N
{; p; o0 x0 V6 V( O
.active_low = 0,% I( T. O0 O0 m. E; H$ t
.gpio = DA850_USER_LED1,$ X! _ ^$ I3 m- h7 F, u$ `
.name = "user_led1",
5 s$ T6 E" d' U0 m3 h$ p .default_trigger = "default-on",0 S1 X% S, i4 }
},! B+ [6 j& D% c
{
2 Y0 {* J0 T( F .active_low = 0,1 u8 x) |& c# Q
.gpio = DA850_USER_LED2,
7 i2 ]) |/ p7 B6 Q7 X; K- e9 A' v& _9 d .name = "user_led2",+ `! t# X3 Q I
.default_trigger = "default-on",
& F2 Q3 \0 L4 i( _& i+ j9 @- P- D },- k5 e3 B" @! s7 v
{0 f# B5 N) l# s4 a- G& }
.active_low = 0,
. V1 u3 D/ q5 a2 V: H c3 I2 H5 g .gpio = DA850_USER_LED3,
0 @. { g2 j2 w+ q! E+ q/ g X& y .name = "user_led3",& ]+ i8 Y& y: R- T9 j% I n' K
.default_trigger = "default-on",
; o/ N5 r$ u) K! h% _: g },# Q A2 O1 X$ u
};- R0 e9 ~5 U# t T
! k$ u$ o! l2 Z7 \3 v# fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ A& {1 P K- r2 C l ^
.leds = da850_evm_tl_leds,
& e9 [- t6 l$ ^ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 U9 u& G! ?. W, `* k; z
};
' [/ ?; u8 l4 [2 R/ R" l
1 \" w/ L& q5 ?; K& `, Jstatic void led_dev_release(struct device *dev)+ p: o5 ]8 A& a
{1 T+ Y$ v; y6 D6 |! P# V
};
4 h- @& Y1 a4 j G% H1 @5 U- R% {
9 p6 ~& s; `( t9 Nstatic struct platform_device da850_evm_tl_leds_device = {, v: A- ^4 E% S5 g) j
.name = "leds-gpio",* `" [3 P) C. e3 m( F* _
.id = 1,) }4 K9 ?( M# ]' J6 ~
.dev = {5 o- w# B2 Y! G5 [4 N0 ?
.platform_data = &da850_evm_tl_leds_pdata,& d5 L2 H/ r- W
.release = led_dev_release,
# _1 K' q5 z' v& ]4 r( P }9 o, E9 Y: ]" s: B, Q4 g
};
7 w+ `5 \$ l. ?/ {) @, k& B5 u: {. q( p6 w ~
static int __init led_platform_init(void)
8 C& P w( T8 u3 Q! }{
p' ]2 g- I& T2 e. A int ret;: l4 t9 e1 F3 L. ]# o0 z
#if 0
2 Q- X, a+ V! p ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
2 Z& Z7 X' o; s; S( m* i9 \! J6 G* j if (ret) `3 F( o" h- {5 C% U3 j5 c( a
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 I( b1 I6 r: n% Z* R "%d\n", ret);6 P2 J! G! m. @0 h( O8 Y
#endif
9 Y2 N% z5 w: W+ o1 Z* f y8 q ret = platform_device_register(&da850_evm_tl_leds_device);
) w- {! w/ b+ H9 b4 U" m o if (ret)
6 u& G, y' x: ?: @/ n- y. T pr_warning("Could not register som GPIO expander LEDS");
. F) I. _2 {3 Y0 W/ X3 ?! f ~ else
. {9 w, k9 ], L' t9 x k- [6 w printk(KERN_INFO "LED register sucessful!\n");
) J$ x/ y* @6 ~+ t+ e% q5 H6 G2 j; s5 o
return ret;
2 H3 N" `& B0 N}
2 t4 U4 V& u- N/ i, j) U4 j+ w# W6 N1 i) ` m9 y$ N% M; j
static void __exit led_platform_exit(void)
$ N* j! S% C; @- R% e2 \( v{
( d- O2 c: N6 f6 i" h platform_device_unregister(&da850_evm_tl_leds_device);
# d3 Z) @/ U7 y+ v* h& R' W( u$ e2 X0 W: ^! y3 X2 T
printk(KERN_INFO "LED unregister!\n");, ?, S3 H. \2 r+ D9 I' C& L3 h
}1 l" Q8 H2 l: t G- ]* p
- ^6 I8 P8 [$ P* W% ?7 `2 Y1 }module_init(led_platform_init);" J9 j5 R% c! o. Q; F
module_exit(led_platform_exit);
, I, [/ R- c' n% w2 z: S0 p( \+ B0 D+ G. c9 ~( ~
MODULE_DESCRIPTION("Led platform driver");/ E/ \9 g/ R/ ~2 A
MODULE_AUTHOR("Tronlong");
: r1 B' V' t. n$ p- t" pMODULE_LICENSE("GPL");* l7 b R0 T0 ?- A; y4 G" h8 Z& H
# M! ?) x/ v* ~& ?" J! v+ G
|
|