|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% L! `( D8 v h- v) e, V" h; s4 `#include <linux/init.h>$ b0 \0 T- o. [; W P, F; j
#include <linux/module.h>
Q- i1 Q& R7 E5 t#include <linux/kernel.h>
$ x7 e6 S% t8 ^. a! g#include <linux/types.h>8 i% }0 u( C! y1 m% a- c
#include <linux/gpio.h>
- C2 ?! R" E- U J6 Y* K1 B+ G; O1 \#include <linux/leds.h>9 @8 ^% G; X, f5 G
#include <linux/platform_device.h>
6 X3 m: _( [6 P) p1 z8 O0 {6 k+ ?$ E
#include <asm/mach-types.h>
. V4 j7 ^' u7 ^7 H$ r: }* B#include <asm/mach/arch.h>
/ S3 q6 F" `$ z#include <mach/da8xx.h>
1 f9 P/ u+ u/ o4 m#include <mach/mux.h>
! n/ ^% r$ f) d5 o a, A: ^' I: |$ E7 x
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ A# d6 p4 V( c) s
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)0 Z8 v7 u8 [0 T- q. ?
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
7 A5 W# j5 _7 k1 X#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)$ x8 C( r* v* z' b6 A# G3 n
) b s6 |7 g6 \* w0 \7 f1 b+ p8 X- E/* assign the tl som board LED-GPIOs*/. ?* p. k9 p3 l2 l7 j+ u/ z9 ?
static const short da850_evm_tl_user_led_pins[] = {
5 Y4 b! _$ P' N# Z+ E3 s9 o /* These pins are definition at <mach/mux.h> file */
0 U! C: t6 h; a* c DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" R. F5 ` ^: V% b6 W$ q& G) B0 r -1
J! a7 T! D4 S J};
: z q& @, f8 w6 T) Z8 M3 ~% I
5 k; _; Q4 u) u( d7 D' p5 S& [static struct gpio_led da850_evm_tl_leds[] = {" [( e4 S$ k6 c& k
{
0 b# w! O& n# d2 w .active_low = 0, v$ V+ U3 t8 E
.gpio = DA850_USER_LED0,7 u7 [& H* z# X* w0 U( t9 u8 v
.name = "user_led0",
\% W u8 u( d$ V .default_trigger = "default-on",
$ Y0 Y+ p9 p5 x- X6 x7 B },
+ P- u3 L0 Y1 U0 g* R {
- z' v i0 {" r& k .active_low = 0, w. U0 @; e) H, r
.gpio = DA850_USER_LED1,9 \1 Q( y+ i8 B+ G4 u# o8 H
.name = "user_led1",
3 ]8 I: y* A( J* [# o0 D7 _. s .default_trigger = "default-on",$ v, }% Q0 R @5 Q4 [( {
},+ }# s% B6 c0 X q( h; D
{8 ?1 P: a2 M: ]: s
.active_low = 0,
" g3 t% @' v5 K6 E+ M7 e( u .gpio = DA850_USER_LED2, i& u" H& R3 [
.name = "user_led2",
$ `3 [. _: d3 h; z( Q .default_trigger = "default-on",
# }3 D& |( `9 ]# S1 f1 e6 J },. T3 x- v! \# Y$ m5 M
{. t. m1 ^4 e+ d% o
.active_low = 0,; v- ~' }4 l" x0 r& ?
.gpio = DA850_USER_LED3,6 B H8 Y1 e2 F( d1 n5 M2 t6 w( P/ F; k
.name = "user_led3",% y# x4 w0 J. `0 f
.default_trigger = "default-on",
2 d5 G2 _8 d& e) L& g) \ },
; E# Z1 i- y; `2 u* T2 _};
+ e1 c+ M p2 a8 w4 x3 w
3 G. P! n3 N* f6 A4 Lstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {3 x% N; _& L% G! q5 M! d3 `9 i1 ^
.leds = da850_evm_tl_leds,
" E- |: W- Y w! l6 Y .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 L7 d+ L! E3 |1 i P
};8 B) F- E$ F! e5 X C Q- ]
6 s: \' }, B# U7 N' U' v
static void led_dev_release(struct device *dev)
& q& q: N5 N: h, `/ u{
) z- t, Y) ~3 k% ?};3 |0 F7 Q3 l6 ]; l8 R* m6 ?* M
1 ^) K5 p; ~& ~1 o: h2 s+ Zstatic struct platform_device da850_evm_tl_leds_device = {+ U% R$ _- o7 Z/ O! A/ A m5 `3 h
.name = "leds-gpio",
+ [: h/ k8 K( G3 M .id = 1,
+ [) s1 c% w: r- O, h+ C5 G3 d8 @ .dev = {" @; P5 k( d( F( `* s4 Z
.platform_data = &da850_evm_tl_leds_pdata,8 j3 |/ s0 k' |; z$ ^
.release = led_dev_release,/ L& u& A2 }" I# o6 ?6 H
}: t5 f4 ?5 @7 F" \
};
& h# x! h* |$ U4 p! S3 B5 |0 n$ d+ g
static int __init led_platform_init(void)
! v2 U5 T0 S1 }{7 o& h! V/ I' e3 m, L
int ret;
' z! O, t& ?8 ~4 Y9 M#if 02 D2 C) _+ }3 e9 P) c0 D" E _
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
+ f w) J- P/ x if (ret)
8 L! b6 n6 H w; `0 S) z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 |4 K. Q+ b: v/ p; h, z0 f
"%d\n", ret);
2 \5 n' h" b! y3 Y! \" c#endif
8 y0 o7 h/ Y2 K+ b6 S1 ~ ret = platform_device_register(&da850_evm_tl_leds_device);# Y N- S5 h8 D7 q9 @ p3 T& y
if (ret)
9 P2 ~" X. V$ x, X pr_warning("Could not register som GPIO expander LEDS");2 }/ \% w, [7 c4 o H/ S/ G
else
4 U5 e. X+ W2 c1 e# M; y' q: c0 Z printk(KERN_INFO "LED register sucessful!\n");, M x% }4 X: M7 x
, Y* J4 Y/ y7 M5 s) l
return ret;
8 B: M- ~7 ^8 g}% e5 c; d1 N6 a2 {2 }0 i* X& O
7 c/ ~0 O% i3 v; q9 c5 Nstatic void __exit led_platform_exit(void)
" j0 j0 n, l( ~+ I" a: _{, x$ N1 s+ Y7 u# h
platform_device_unregister(&da850_evm_tl_leds_device);
" M5 N& r4 { q P0 s" S' P/ f6 C% d& ~2 V
printk(KERN_INFO "LED unregister!\n");
$ f# ~* q' g6 U% k3 e$ p/ d: n# k" r}! g6 N/ {% o# ?! n/ p: O9 i
2 {( p6 G) i. K: t6 f( tmodule_init(led_platform_init);2 W+ I# e+ X1 h4 z' Y& \ x) ] G
module_exit(led_platform_exit);
$ x% Z0 s! B& v9 x% j! {$ ]3 [- A3 b
5 p: k1 c+ g( z( a2 Z) y2 TMODULE_DESCRIPTION("Led platform driver");: g: c* q4 n8 j; p/ [- W
MODULE_AUTHOR("Tronlong");9 @5 `, b$ g8 v) q Q$ Y: K( T- R
MODULE_LICENSE("GPL");. E7 |% n8 W: K' m. {4 h3 y9 I
2 Z- v4 h/ |, R h5 U2 D0 L! v8 D
|
|