|
|
求大神给下面的程序做注解,请稍详细些,谢谢。! Z: ~; n4 Z0 N ]
#include <linux/init.h>
. A) e* v/ G* F4 X' q9 h#include <linux/module.h>
1 e* _6 ~0 h3 J: V; J' T8 }#include <linux/kernel.h>9 B; W0 \# z" Z) J
#include <linux/types.h>
7 F! R8 H1 e; B$ f4 z#include <linux/gpio.h>
. z# Z& `* Q& f+ C7 r#include <linux/leds.h>
& j1 ?; y, E; p6 f6 O9 y#include <linux/platform_device.h>
: w6 k# k2 [2 |0 I* e' l4 K8 n
7 w! `8 }1 A, C4 @#include <asm/mach-types.h>
' K7 r) C6 b, [) T#include <asm/mach/arch.h>$ m5 U# C/ k9 z! d* M6 B3 [
#include <mach/da8xx.h>7 e% O# A* w, u' R% ~4 Y
#include <mach/mux.h>
) O: s9 S8 M+ n0 r
, T7 v9 ~7 T3 E" T, G' ]2 i#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
C& g8 b! A) f4 w* a- X% {#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)1 x' C/ p" `$ ?" G0 q+ @- j6 f
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% F' `; D5 M( G7 k#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
! P% o% D3 ?- G" g. |- m6 t$ d5 _9 q9 L/ X; T4 i1 m9 `3 l
/* assign the tl som board LED-GPIOs*/
; K. ~1 V; l' Gstatic const short da850_evm_tl_user_led_pins[] = {" c- i$ a9 B, {+ h' \
/* These pins are definition at <mach/mux.h> file */! h$ l( \1 v5 i, {" t; C0 k1 C% f
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) t+ z" p- L# c: Y0 a
-1 m! M! T& E* i6 x
};7 s7 O, r. I1 ^1 k
7 Y. z1 Y2 w# R4 {+ [( astatic struct gpio_led da850_evm_tl_leds[] = {
+ m1 o3 ^8 {4 j( N) o/ ]2 S {; [6 I1 K; ]) M% r* \$ v+ M
.active_low = 0," S5 S0 T; t6 m$ ^0 d- d# H
.gpio = DA850_USER_LED0,
8 c* S$ J: s8 C& e& J+ t .name = "user_led0",9 X" Q4 u" z/ _- t) K! F7 o
.default_trigger = "default-on",
+ g9 A# W5 m" F- T7 w },
: Z, }5 N% @& G& l/ @! }' I {: |8 a; e, M3 W: G( D5 ?* w
.active_low = 0,$ ^5 m. a* L* I6 I$ N* C
.gpio = DA850_USER_LED1,
+ E! V5 O1 A6 ?0 N1 U .name = "user_led1",0 c: `+ N+ \, L' R) Z# L$ o
.default_trigger = "default-on",
( G. y( C$ v; s# m3 | },2 Y" v1 k: k5 Z! A: P& J
{7 B" e8 k! w) d: o) j' Q
.active_low = 0,. B4 J$ b0 Y. W5 a' z H
.gpio = DA850_USER_LED2,
" g0 }+ P% _( f7 X+ j0 m3 ` .name = "user_led2",
1 ~! [/ b# ?5 z7 n+ E' l1 x .default_trigger = "default-on",
/ Y( P% t' ]# N. n& c0 t/ u },
: T0 L' X7 m# w% Y/ D5 n1 k7 H {
) v7 Z b: L" q4 @4 j .active_low = 0,+ L+ H& \8 @- `$ _5 E1 _* L
.gpio = DA850_USER_LED3,4 j& }7 t: A9 h
.name = "user_led3",5 u1 }8 H1 R' K3 m$ y; {$ ^
.default_trigger = "default-on",8 F* W0 z4 D0 [% _, g
},
$ a9 l6 m# z1 M: S; A0 F" n- w};3 n5 h0 o4 {$ @" c5 O- z C" W5 m9 \# S
) Y' ]8 r. e4 ~) Z8 y8 dstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
! @, A- {" |( E B! {3 G& C% G .leds = da850_evm_tl_leds,) Z3 t* {# L2 b: o1 b( _; c; Z
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ k: Z3 L) _- V# Y s
};
7 G7 d/ G2 f. j# A* s2 H
2 k) o5 W# `) a6 ~static void led_dev_release(struct device *dev)
: n5 c1 E; S" e% ?{; `3 Q+ ?8 S( y) l% h+ _
};
# {! J1 o( U* k5 c, e+ h+ l6 c
- u6 r" u: @1 J. m; Hstatic struct platform_device da850_evm_tl_leds_device = {
. ?0 Y; e! E- u& i# ^8 U8 ` .name = "leds-gpio",. l2 e; r. F- [: w& r
.id = 1,9 S, Y+ v/ ^ |' G) J2 |
.dev = {+ o3 Q k ]. H |
.platform_data = &da850_evm_tl_leds_pdata,0 m! q f5 t( H
.release = led_dev_release,
% r6 V- c4 I) k- w, E3 S; E' m# }" u }
; @ C( F7 K: H" @% T/ \};
$ U( I6 Z7 D3 Y% V% S% t( `+ l! q9 {+ O! }, V& I# I
static int __init led_platform_init(void)
) p0 O$ d; d( v& R& p5 g) ^2 d3 H{
; T# W' [' L! r int ret;3 H/ O5 v: x# A* B1 d2 x$ M+ j
#if 0. k; \9 m/ L4 z3 @) X
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ ^) [4 q: m# E; t5 `3 T: s3 A if (ret)! [1 Q5 G; `* ?3 A* u, M/ C# J6 z/ X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
w. v, T5 H/ b! c* ?; C "%d\n", ret);1 F, p2 d/ F: D( R& n- C' U
#endif
0 t3 z/ y# Y+ \3 t ret = platform_device_register(&da850_evm_tl_leds_device);
* A! r& `/ b; T( L if (ret)
( e) L% s9 D4 Z& _ pr_warning("Could not register som GPIO expander LEDS");
& F7 d( a w# p9 X4 N4 M else, S; y( T8 L' }1 z; F% N$ t
printk(KERN_INFO "LED register sucessful!\n");
+ A/ ~5 g. z3 I3 _, K9 D: r0 N, W8 k7 D! T! L: m
return ret;8 d/ Y+ t+ {( y+ j6 \/ j
}
4 Q) p9 D# m1 C' K8 l; i
9 K5 |6 }7 b, ^! C. e) ~( ]3 ?8 q- Ostatic void __exit led_platform_exit(void)+ U* t6 k1 b& z3 n+ W4 V' ?) R
{
1 M, t7 W$ D- `" u platform_device_unregister(&da850_evm_tl_leds_device);' Y/ n% E; `0 C2 i! j
# D/ B0 W' ~5 b% W: @4 A8 S printk(KERN_INFO "LED unregister!\n");9 X ]$ w6 d3 s4 W0 `; @
}
; U" G9 X- k, c. `* @% D6 s, b0 U5 ~4 c8 m
module_init(led_platform_init);
/ Q) j# S" t+ G: N% wmodule_exit(led_platform_exit);
' L& s8 B6 k3 v0 p# t& r# D/ Y$ |1 @; B; v+ S
MODULE_DESCRIPTION("Led platform driver");- F" h0 Y9 ^7 G9 C; J0 T3 q
MODULE_AUTHOR("Tronlong");
& A7 T/ h- l, O& d/ | oMODULE_LICENSE("GPL");
7 E- a1 q2 ?. \! Q& m/ T7 s4 D' m; h8 i. ?9 L! J
|
|