|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 h7 o# w2 e( x* Q' X$ Z8 z
#include <linux/init.h>
$ m% p1 g7 x" v* [6 k* a#include <linux/module.h>* a7 B2 g! N) Q4 k
#include <linux/kernel.h>
9 U5 |2 o2 ?3 v+ ~9 s#include <linux/types.h>
/ T" |, _+ ` C M) c T" d#include <linux/gpio.h>
$ i- t9 ^( k, r7 @8 v; T- c0 w#include <linux/leds.h>0 d1 n8 \3 @. P& L% t' u
#include <linux/platform_device.h>
. V6 |. H* A: e8 L8 O* J
1 I7 h& Z8 j- x! f' b ?#include <asm/mach-types.h>
$ p- o( S6 o( h; c$ K* h M#include <asm/mach/arch.h>
8 k5 @3 F/ h, Z- k3 s# }#include <mach/da8xx.h>
1 t& @. D* O) x0 c#include <mach/mux.h>
^% k+ p8 g) t8 N2 x- H
/ g6 b5 ^- n- M- n6 N+ h( C#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ h1 s1 {2 u) n% p
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' `* V) `0 x7 P
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 W6 F# O' @, S* v7 w/ Z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# j3 |, D7 K3 T3 l4 [, z2 U
1 R' e* i+ _. {7 _7 f F2 H/* assign the tl som board LED-GPIOs*/( \" @8 n% I9 H7 ?& Q
static const short da850_evm_tl_user_led_pins[] = {
6 m" z' H1 j* f /* These pins are definition at <mach/mux.h> file */8 u( S$ z: W a: \* w W( }0 V2 q
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,: f# c; x/ I) ~/ ^4 q) U/ t% `& v
-1/ K, u/ Z1 C9 w* o: a0 k. ?+ f
};" w* ]5 w9 W2 N1 n& Y, x' q" i
+ [& r6 D0 \1 I1 X2 y
static struct gpio_led da850_evm_tl_leds[] = {- s9 |) k y- W3 ~6 v- c# |
{
$ k+ m$ `/ t3 i( \1 l .active_low = 0,/ |/ J; h* |0 V8 C$ }
.gpio = DA850_USER_LED0,9 l4 m7 t: t1 T* d8 L" e9 c+ B" ?9 \
.name = "user_led0",; r$ o3 r4 d2 U8 ?
.default_trigger = "default-on",
9 P; H* U4 |) y! ^ },
0 h8 }7 `! [9 r {
1 I7 y5 s, F# z) _! S: j: X .active_low = 0,( W8 u0 l' r/ T4 J! p+ S
.gpio = DA850_USER_LED1,
8 O/ Y- z- {1 L H& G .name = "user_led1",
) L( p2 y2 K) f/ m, L) X, l& I5 g .default_trigger = "default-on",* i2 a# d1 \; D- k$ n! j
},. c; {; f* v; t$ A3 x7 t- \9 X$ R
{! ~6 [$ `' m8 U+ x7 D, K! D
.active_low = 0,+ h- M8 x5 }7 G7 R2 n9 V
.gpio = DA850_USER_LED2,
, p+ t3 k& [: Q+ B/ ` .name = "user_led2", _4 l5 _' I6 A1 H& P) ?
.default_trigger = "default-on", p# ~0 c M( R& J8 ?3 a( k
},
I1 C7 w3 L7 [; ?, j% { {. E! S/ z6 P9 Z5 t
.active_low = 0,. M* ]! l6 e! H2 d
.gpio = DA850_USER_LED3,1 l3 J" p% R3 j; R( T6 \
.name = "user_led3",4 q- P8 y( m Y$ Z( P6 X# G
.default_trigger = "default-on",
( k* I; }+ ~- k6 V- G },- o1 b" T; z2 i' X: i7 ?8 `
};
% d& l0 a7 y; }2 |4 \0 d8 q* e$ |7 q1 z
5 J; t. U! h V5 Wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = { F* ?) L0 C4 n8 G3 X
.leds = da850_evm_tl_leds,7 R$ j, Q" Y9 b1 L& P
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* F& {- U9 u: u};
- f6 \. R! ?# D: Z% A; ]# a$ H! W& @: p5 H
static void led_dev_release(struct device *dev)3 ?# S2 [5 \" i# b
{. f) [( @7 f9 v
};. z. _* X q, \ w
' @& C% R9 F2 J8 P* z! d3 tstatic struct platform_device da850_evm_tl_leds_device = {" m" Y% B' a# I/ |4 \
.name = "leds-gpio",
+ R8 n) h J, ?, B" D q .id = 1,* [ H( Q3 W. W. S
.dev = {
$ F0 Y* a+ |. [5 W# y0 y8 v .platform_data = &da850_evm_tl_leds_pdata,
$ l* s, n, Y& V, k; j: } .release = led_dev_release,3 \& f" f+ b- h, z
}+ e: ?7 A) ]$ N& g- d- x
};
/ J: W5 a6 B3 w3 R' f' B
" E$ k0 z9 Y" R5 P" X) p7 m% L: V1 sstatic int __init led_platform_init(void)3 F2 N/ V6 X) }5 U. H
{
& }6 Y c p/ K# Y int ret;- l5 \; T+ V p6 a; ~
#if 0
! u0 D; P! s4 @% L; A ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);( V( }- k: m7 O g
if (ret)4 o/ R* C$ L: X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"+ N- \/ a& S: A# v) q6 X" S2 |
"%d\n", ret);
* q. f, Q5 a$ I6 G#endif; v; G; p E9 ]: z: ^1 {( h8 H8 C
ret = platform_device_register(&da850_evm_tl_leds_device);! j. g c7 Y6 N' Z1 [
if (ret)
) w0 S2 c; @7 X1 M; q pr_warning("Could not register som GPIO expander LEDS");
. F A: l: ~( B9 H1 j. f else
y% Q& X! T3 _) a+ u* c! W printk(KERN_INFO "LED register sucessful!\n");
) E6 Y h0 l0 q2 x4 R2 r: |+ }8 x) U- c$ l9 A
return ret;3 [: m, |6 p+ {! V* y# t
}' O7 `% Z& u2 Z
7 Y1 I! _+ S9 J& Ystatic void __exit led_platform_exit(void)$ K& S3 O* v3 u1 B- W' d" ?& \% i
{
, v6 ^8 y! ~# l& G# c& B1 k2 O+ i platform_device_unregister(&da850_evm_tl_leds_device);
* K5 p4 a5 }: |7 Y4 q5 c* V" }: I! v3 F$ P+ ]) r+ Q% F
printk(KERN_INFO "LED unregister!\n");: H2 r1 T( f3 [9 k0 J
}
8 ` z9 P: k. V/ V% @: j& r
, y* ]! N/ q# H: N" Mmodule_init(led_platform_init);; e6 O/ B( r' M/ S$ C
module_exit(led_platform_exit);
/ I1 _ x' \% v& f% L0 O: n- z$ Y( X4 K o7 R F
MODULE_DESCRIPTION("Led platform driver");, @6 S6 c/ n3 J# u/ q9 v9 v8 h* V
MODULE_AUTHOR("Tronlong");
4 u( `$ U0 T+ s8 N. w6 @- @MODULE_LICENSE("GPL");
, Y' D0 M! {- Q* b7 L8 a8 W! |( S) f }8 r
|
|