|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 W) V: i9 f, b' y n
#include <linux/init.h>
; A1 p; f; p9 U3 J#include <linux/module.h>% M& |! n; }# a% _/ Z! A+ h( _' \
#include <linux/kernel.h>
N) b, l. l+ b; Y6 _3 ~) x% `. y#include <linux/types.h>$ s* L6 g$ B6 i3 v/ o
#include <linux/gpio.h>4 d+ c' P8 Q a7 J/ ]3 Q0 t& e
#include <linux/leds.h>" ~ {( P+ v0 S
#include <linux/platform_device.h>
5 `" f6 A' t# z4 \& a; K
2 N: a+ E# k* o1 U/ S0 F6 S$ ^0 n#include <asm/mach-types.h>
9 T2 }! S% F( \& ]! W#include <asm/mach/arch.h>* N. r- ]3 ^! w* x& R8 k- f
#include <mach/da8xx.h>
- W$ E% d a, p/ B0 [#include <mach/mux.h>
, A5 W7 o; r1 P. Q& U; d3 j" F
) o2 R! `6 ?: J" V6 {/ ~" k- `#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' z# f' M0 Z7 T0 U+ N8 d& a, Y! g j9 W! o: M
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
1 Z% S- Z/ R+ L3 E#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: Y3 `/ @: \- a5 e6 [#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 u0 F! o) u" a9 _! B, v; Y7 C$ h' ~& E; d9 R
/* assign the tl som board LED-GPIOs*/* r6 X' @$ E/ @# z* X
static const short da850_evm_tl_user_led_pins[] = {
! Y/ b. V, n, i5 n' A8 I /* These pins are definition at <mach/mux.h> file */
; D% V; v e; C. R& A6 P8 f- v/ p DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
4 L& \* V1 c, o+ c% d) ~* Q( v; [ -17 i6 m* o* n1 H. F
};' y# w& U& f* B7 G$ p3 l
) E, `: @3 N+ ~' s' s2 a: wstatic struct gpio_led da850_evm_tl_leds[] = {' E. O- z) P, s
{, @) Q# V2 \+ N0 C( V' g5 [3 \
.active_low = 0,
' z( G8 w5 j$ e4 _1 Q* j .gpio = DA850_USER_LED0,8 w7 P* g- ?5 C1 ~3 i
.name = "user_led0",- `2 U% \1 k1 \& m. D. n
.default_trigger = "default-on",( R& T, \6 B! Y
},( a' J, C! Q4 L: \% |3 H; R2 g
{% [. f/ I( z2 a& [6 J+ k7 g, k
.active_low = 0,( @( U/ o* j& N" C& j0 l
.gpio = DA850_USER_LED1,
: H0 T4 k0 H; J+ l% a .name = "user_led1",
; p- R- Y9 t: i% F& U6 y- J7 _ .default_trigger = "default-on",6 J9 P. i6 }# D0 N+ g& E
},; K( u& ]: j4 P, w7 F$ H" q
{
8 E( @$ o+ o( C y6 I: o .active_low = 0,/ i: k+ E- q3 T6 z& x
.gpio = DA850_USER_LED2,
; l! ]) z" d% b( \ .name = "user_led2",
( U( |4 `& y) _ .default_trigger = "default-on",! M1 B/ Q! T, ]' X
},
# [8 I7 {" h1 v, r! U/ g4 o {
! d: i& W+ w! G" E; i .active_low = 0,
5 \, z8 F* S8 e .gpio = DA850_USER_LED3,
W( Z( L5 E# e+ q& Q, t .name = "user_led3",6 V9 E$ T4 r) v D
.default_trigger = "default-on",
' s* s! b/ ?3 A1 G$ x! r0 b6 B },: w! H3 Z) F6 }" M2 x- L
}; z' O5 l+ C! X3 w0 T% C7 y8 {- d; s
# P* Q5 J$ |5 I' P; g" q9 p
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
! I! \3 }9 F$ v' h, z2 n3 I9 x7 k+ T .leds = da850_evm_tl_leds,9 ?- L1 B! F( O7 Y2 I. E0 k" ?
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 g1 v6 c! `+ X; K! N" X) c
};/ c ]- p& {6 [. H. \
( y e( w/ \8 J/ s- hstatic void led_dev_release(struct device *dev)
5 W$ A0 x6 E) x/ t3 z& X+ p1 A{
! l; ~) g" [' {! O0 A: P$ M};
U0 I% _; B q/ G- |7 E/ l2 S$ ^9 q6 }/ a# h& M7 H2 q9 E
static struct platform_device da850_evm_tl_leds_device = {
) v, X+ U" p9 |! {7 L .name = "leds-gpio", D: ]) K/ A3 i7 j( H
.id = 1,! O$ A4 R, j, ~) t
.dev = {9 I# h2 N8 Y9 U9 n. ]
.platform_data = &da850_evm_tl_leds_pdata,
/ X1 @7 r. |, r9 q7 i( b6 l .release = led_dev_release,$ ~4 g \/ b6 P5 F* _) b! Z
}
2 x& b3 ^7 Q" Q% Z};0 D; [. G. B/ T, Z2 @4 J q
O1 n5 n2 v! `7 _
static int __init led_platform_init(void)
8 U! J8 O8 c" o5 o: c$ V5 w{& S) ~$ h$ \1 _+ _; f7 a( @& }
int ret;
0 \9 F* @ H) W* T! }#if 0# w! s0 Y( c# H. y+ O
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);% C E/ I2 v& I/ O, T# M" T8 f
if (ret)0 {# v6 x. L* T6 l" t, O
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
X" {+ ?1 k: W" b. f# D/ K3 W "%d\n", ret);4 W- A8 d$ y6 E3 P5 l- q
#endif3 f' z0 A/ _: o# q/ z7 L& H
ret = platform_device_register(&da850_evm_tl_leds_device);$ @, l# B) d; R2 L
if (ret)
) r l+ i) q6 H8 ?0 i( \ pr_warning("Could not register som GPIO expander LEDS");# q3 X: X7 X( I
else1 F# k6 w* j$ ~$ Z! }* Q- `
printk(KERN_INFO "LED register sucessful!\n");: v+ ?& e4 w; [. q* J) \
4 U( x, @5 V+ v Z return ret;% X+ ^/ a- L3 M8 K% E( S
}
* K. o2 _& F) w
" O; [9 B6 b6 `: {- D. d+ Xstatic void __exit led_platform_exit(void)* ~' M( x0 _, g2 t3 ^
{
, F L% ` m! [* q platform_device_unregister(&da850_evm_tl_leds_device);
2 i4 u& V$ X4 Y4 F8 o1 g) T7 ^
% K5 ~$ s' x3 u; G) h8 j, m printk(KERN_INFO "LED unregister!\n");7 r2 [) ]2 m i7 A( p* x
}
P7 U8 E2 `- y3 U5 F& }, Y2 Q
. S) B4 Z& h% Emodule_init(led_platform_init);
7 Q: ~2 O" a6 y! R% E. Dmodule_exit(led_platform_exit);+ T1 B1 A7 M/ i6 N
u$ ?1 w" W6 U) v- n( L5 ]MODULE_DESCRIPTION("Led platform driver");) x& S( A3 X& t+ z1 U
MODULE_AUTHOR("Tronlong");# t- N+ H: } _
MODULE_LICENSE("GPL");: {1 b: ^* c$ K; j( [8 }! N
8 `( ?: j0 i1 M& M0 x |
|