|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
- z* | Z; p, H$ Q6 d#include <linux/init.h>
/ T8 X5 n- K6 i3 a5 A#include <linux/module.h>* `2 `4 a1 T# J' P7 v
#include <linux/kernel.h>: u9 e. O7 h1 H+ r4 \' `& m
#include <linux/types.h>2 B c6 z. D9 s* M$ n" n& d6 P. `
#include <linux/gpio.h>
) }* P" }. b I4 Y#include <linux/leds.h>
- Q2 c9 U( g; x#include <linux/platform_device.h>8 ^+ e; u- G" W4 L
% ]" R; g9 s" o) F#include <asm/mach-types.h>
% p/ }1 E. Q7 v. k2 S#include <asm/mach/arch.h>
5 O, E# z+ m5 t7 m#include <mach/da8xx.h>4 f9 P) O/ M- o- s' u6 ]
#include <mach/mux.h>* e! k: @8 s& z' i \
- P1 k, \, p0 j% e#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
3 w9 H( N0 n8 c( k+ E' S/ `* U#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)" G4 M# w) E, H
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ q2 }$ r1 t8 W5 e. X#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)4 X, p8 w6 z# i3 M
8 b5 m) X% i( t* F+ A1 a, X
/* assign the tl som board LED-GPIOs*/& E$ ? Y, x: @1 M
static const short da850_evm_tl_user_led_pins[] = {
3 G5 |; }, I' |. p( A% H4 p% y/ y /* These pins are definition at <mach/mux.h> file */' t: r: j1 e5 z0 n0 r* n
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
A0 ]* x1 d2 j -1! m/ V; E2 [" [
};) G1 P4 t) ~ f' B* s+ G/ @1 h
( J4 I1 T( v& ?$ h: D2 Rstatic struct gpio_led da850_evm_tl_leds[] = {% o0 Y0 u0 ~& K; ^
{
4 y$ p- n6 z: u .active_low = 0,. m) ]7 q& \- z2 Y$ w7 U
.gpio = DA850_USER_LED0,
0 n$ Z( f- h6 R8 D .name = "user_led0",
; T; y7 ?* K3 O3 P6 X1 h: C .default_trigger = "default-on",
G" O* t& P9 ^- n- c( }, m3 @2 J },, Z( x0 }3 o3 J7 M& W _
{
' _$ P" u% |2 I* k$ U .active_low = 0,, ]7 N1 z' G! g8 C; |2 k/ m5 B, f
.gpio = DA850_USER_LED1,
0 U2 o8 z, F1 m! o .name = "user_led1",
) n0 P" M$ Y% {# P3 w .default_trigger = "default-on"," B' V$ S# w. A) [$ h) M
},
8 q) V6 j* a' [: \# G+ D {( D4 K& L; q0 M5 x. a1 m
.active_low = 0,
1 T* o7 R3 W' z .gpio = DA850_USER_LED2,8 n1 q! s/ P8 o! `& \% _+ w" e t
.name = "user_led2",
/ x n4 g" H8 I% I! @ .default_trigger = "default-on",- l( u" n$ J. Z- w# i( i
},
4 ]( v% j& L P* j) q1 t7 J {
/ d+ r/ p' p0 } `" c9 v ?3 G .active_low = 0,
' g$ ]2 b7 S' i4 A! @( ^( k .gpio = DA850_USER_LED3,
2 r* N# O0 L7 M: p m8 N/ C .name = "user_led3",/ x1 `3 |2 g3 B$ P) N
.default_trigger = "default-on",6 A" X, M, K! w; f$ r# r
},+ A7 k C( r$ j8 d( s! q
};: _4 X* `- |' o7 u! R
/ L1 ]9 |8 k! l1 A+ U0 m# @4 Rstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% J: D! c i" j) Y [8 y .leds = da850_evm_tl_leds,1 m+ M0 P% B+ a" l
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),$ N1 E: |, _ U/ q8 U, ~
};
2 v$ T0 `1 Q8 Y1 B4 f
, O, j! I. x; V8 c" F5 l$ l0 Cstatic void led_dev_release(struct device *dev)5 q/ R0 ] A0 y/ d0 }: X5 g# Z
{
~# ]$ ^: s. C5 B$ t9 N};" a; c4 }0 ?& M$ o" ?
- G) p" `# Y' g& sstatic struct platform_device da850_evm_tl_leds_device = {
* W% w9 r: R. ?* N: L" d8 N .name = "leds-gpio",) p. a7 |3 P8 t6 |
.id = 1,
$ f6 Q; u# G$ Q& b' |1 D/ p .dev = {2 S: A. Z) _- @6 \& x2 c. W: z
.platform_data = &da850_evm_tl_leds_pdata,
& e% o- b6 z6 x$ W1 f9 j .release = led_dev_release,7 ^- l9 _3 Q0 A2 o2 F
}( |2 ^/ n# t9 s2 g. U- u
};
3 o. {! i8 i( \ |- x
) P7 O, S+ Z' Z. Lstatic int __init led_platform_init(void)
; Y! T9 k! m0 }, j7 D/ b+ a" {{
$ q8 T) s5 a" Z- U1 `: d* S int ret;
5 E9 A+ {! b4 }# n4 G G; W! O6 y) V#if 0/ J4 T- n! z: k! }, W
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
% Z& u/ G$ c) o* u; O if (ret)
( G/ n7 D* Q6 D% | pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ s" [8 D3 T. D) h) h& _# }
"%d\n", ret);3 S2 ?4 T ?& g( l+ s; [8 e9 o
#endif
7 t0 h' o: K/ \ L1 U* y ret = platform_device_register(&da850_evm_tl_leds_device);* t2 _6 O8 p* z; t! a
if (ret)+ U6 O& z. x7 U5 Q4 K' \
pr_warning("Could not register som GPIO expander LEDS");
# a! L) R) \ B0 x) D else' R/ D# O, ~( w4 |) G( i
printk(KERN_INFO "LED register sucessful!\n");5 \1 o1 r2 _- B, F, w: w4 g; I
+ c1 V E9 I9 c
return ret;! V9 o' t( Q1 u* x4 P" `( y
}" D& \4 Z+ X( q4 `
7 ^) \1 F n( N3 v+ A( ?. `static void __exit led_platform_exit(void)0 r4 X3 R. }2 K
{
& K+ l1 R2 l0 P! [2 X platform_device_unregister(&da850_evm_tl_leds_device);, e. g0 H) ]: b. q! w, g* p
6 @/ \4 W) g1 P/ G+ L printk(KERN_INFO "LED unregister!\n");5 ~0 B! N0 ^) \+ K
}+ t( q% y# i# s) H/ Y5 ~' m% a5 J, H
- ]. X# b- l( f: A- T: P) y$ ~) K
module_init(led_platform_init);
: P! Z+ P& q2 n. T' m# v8 n. pmodule_exit(led_platform_exit);; V/ \* V p3 d: V$ a8 u
! L' t! m) ]$ [) R; ~MODULE_DESCRIPTION("Led platform driver");
8 _+ j5 h6 i% F3 oMODULE_AUTHOR("Tronlong");
3 c; u- {9 @0 G( r+ MMODULE_LICENSE("GPL");9 N3 R2 ~5 r5 r
; s* ~" r/ V4 K0 w# v) M |
|