|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; A/ D2 ~! O( M0 I, C4 T9 n0 \
#include <linux/init.h>9 a, L# e1 g' C
#include <linux/module.h>
: t/ Z) `- _5 Z; a8 R#include <linux/kernel.h>0 }: l5 H$ |( b( t, J; M. y
#include <linux/types.h>
4 m' o% N% A4 L& S#include <linux/gpio.h>% ]3 m* L, G( ~- G$ `; {/ X5 q
#include <linux/leds.h>! y# i5 m# p/ h, X* o) Y( T* g
#include <linux/platform_device.h>
( b7 X1 y2 n2 m. v6 B6 ~; g5 ]/ S: A
#include <asm/mach-types.h>! B! }( ^( b9 U$ @% c0 l
#include <asm/mach/arch.h>
# {! P& M0 d3 O1 F0 P; Q! [0 E$ ^#include <mach/da8xx.h>
( _" b' G/ d3 Z# e3 L9 }5 h$ j#include <mach/mux.h>1 L* ~$ g; {" l4 O( A H1 k
6 C' B1 _/ p8 y- N6 n4 l
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
+ w4 G' Y% R6 n; x' K9 ~6 I+ R#define DA850_USER_LED1 GPIO_TO_PIN(0, 5); d/ S- |6 P" L; x l( M, h
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
9 Y3 p c' }2 Y; Z& ~$ R s#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): f+ i5 Q5 I& Z- A
( { m( a4 `* ]1 K8 T
/* assign the tl som board LED-GPIOs*/1 W5 f+ t, X) l
static const short da850_evm_tl_user_led_pins[] = {) \: S5 K9 w5 V) W
/* These pins are definition at <mach/mux.h> file */
8 v5 P6 T$ v' ~+ y: H$ k DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) a5 {; ?$ W% S9 b n" m+ H* [6 V/ K
-1/ L4 m7 ^! F, z/ k) s9 B: M8 n
};
9 \4 k; Z! w6 T8 S5 C3 f% E5 }8 v
" n o5 X: {9 N hstatic struct gpio_led da850_evm_tl_leds[] = {7 N, R" ?6 q0 b0 ~( l# h, O
{. {! }" `' u6 u) g3 G0 M; z+ _
.active_low = 0,
' |! d* A$ Y6 d( I$ E0 x& s .gpio = DA850_USER_LED0,. Q$ ] y5 F$ T1 i! z
.name = "user_led0",
8 e% `+ c7 o' H1 F, J3 z .default_trigger = "default-on",% M# @% i/ J6 [* R% F$ h
},
; F* A. k6 h) H; T {
, U: Q( l) Y0 S* K: | .active_low = 0,
$ i: K# R+ H- T/ F+ ?4 U! T5 U .gpio = DA850_USER_LED1,
$ p6 n8 o( ~+ C* j H! B( N .name = "user_led1",
- i8 I# C) i9 ?9 f .default_trigger = "default-on",
4 s! z; a* a# i/ `: _& D },/ P" }; q# h7 N: |( Y9 w( r
{( k6 @- r j1 ?4 z6 D3 n7 Z
.active_low = 0,
/ F9 Y! Q* Q/ t. a S7 ]0 L .gpio = DA850_USER_LED2,
7 @2 A9 ]- [4 M& g .name = "user_led2",* b0 }! O3 E8 [$ K' _8 ]- N6 R
.default_trigger = "default-on",
+ U9 \# d) ~0 Q' J" f },
1 S0 ?; ~( G, U, k" E" F( C! S {6 d% W2 \, ]& @9 j/ N
.active_low = 0,
. t: }4 p; U" y3 A .gpio = DA850_USER_LED3,$ N- P2 F5 T: @1 Q4 y E D
.name = "user_led3",
1 e, N& d, O5 W- a7 B& ?9 W$ p- ^( { .default_trigger = "default-on",
2 e0 U, g: o5 b- s },
# p8 {5 n+ X+ P/ _6 @3 V5 J};
0 I' W4 @5 B. R% }. m8 ~6 p( k' S9 L
# b# D0 ?6 J0 [( b% ^, Q8 I3 {9 O$ Ostatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {: L1 B9 w5 A" m6 W1 W% d! N
.leds = da850_evm_tl_leds,6 h8 F# C+ F$ J9 [+ u/ h# B$ ?
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),- q4 s$ e: ^: O' D6 f! u2 B
};9 ^6 O9 t! m0 ~+ v( q' x, T
0 T/ i: k' `. K- {1 @static void led_dev_release(struct device *dev)0 q4 q' X0 F4 ^6 ?+ r2 q% I
{
/ g' t5 a- s2 C- ]( @8 { a$ A};
* W9 V m" y. d+ k- g" }! ^; {
. w7 p2 C4 I* }5 v8 mstatic struct platform_device da850_evm_tl_leds_device = {
7 G3 z- W% ^& q. q, A& s l [ .name = "leds-gpio",
( A! `3 r' {( C! _8 a. n5 C9 E .id = 1,
' F1 t2 l/ C" j: a/ ]; C .dev = {
4 W+ s/ G( K4 S4 G0 | .platform_data = &da850_evm_tl_leds_pdata,) b/ \) h/ v- C& K
.release = led_dev_release,, K9 v. q) Q+ a# s$ \! W
}% B: @" n" A, J. j
};
9 |, L! _. Q: G+ ?- d2 {( v0 r6 a
# F/ Q' G; c% t! j, j' rstatic int __init led_platform_init(void)! d- r! l* U; Y( N5 a9 z! I$ A9 u
{
! G2 z+ m3 a9 ?9 r1 @) k int ret;/ r6 r9 C% C' p' K" g K" r
#if 0# Z7 Y! G+ c! k) A4 h9 z
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);2 n6 z9 G1 W% d. j# l7 p
if (ret)
% K7 e! x% @: W0 j pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
% b2 R, T/ o5 N3 O: h "%d\n", ret);
( o( Q ~1 w" M0 x3 ]) C' a# v#endif
7 @& q- @* n) N* d" i" p- v ret = platform_device_register(&da850_evm_tl_leds_device);( m6 c0 q2 G& |! {' x
if (ret)
* m5 G0 } O& j7 X pr_warning("Could not register som GPIO expander LEDS");( t- g6 V5 t: w4 @& O- H
else
, X1 A5 _8 S3 Y2 }9 o! l, Y- h printk(KERN_INFO "LED register sucessful!\n");) I. m+ o9 }9 L G% n; {
2 c9 l2 `! U) \4 x; t( }5 Y9 ?& S; ]
return ret;, `) A4 L5 I% \2 B' t. Z6 z
}
+ f' I, C, J( W, x6 J3 h/ ?3 K1 h+ {/ ~2 ~" k+ k) K6 b
static void __exit led_platform_exit(void)8 K5 ?/ T* @8 {4 g$ s( n+ T
{
3 G8 j/ u. N2 h+ K$ Z+ Q! R platform_device_unregister(&da850_evm_tl_leds_device);$ {: d4 E ]3 o2 C1 g7 f! k
& o* b: N% P6 X' l/ u$ c' {( q$ M( P$ s8 G
printk(KERN_INFO "LED unregister!\n");9 a, E7 U2 O4 K# M0 s
} Q: N0 K$ i9 o9 C+ i- B% P
9 I( W( y0 S$ h' v& Pmodule_init(led_platform_init);0 n& v6 K2 p! E0 _0 C4 w% P: F
module_exit(led_platform_exit);
% \+ `1 j8 n- \5 ^
- S( k3 J* s! B5 u, O" m: j5 GMODULE_DESCRIPTION("Led platform driver");) [0 V/ }" e7 F' J y* V
MODULE_AUTHOR("Tronlong");; D+ I2 A; S7 u& r9 v
MODULE_LICENSE("GPL");# a: c9 M2 \" x
2 V2 ] l( ?" ]( V" g8 }1 n6 V |
|