|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% j) j$ {9 @6 ^% n0 n#include <linux/init.h>
$ c3 A- z+ p: W3 s" @#include <linux/module.h>
% L5 s' `# }8 u- q! {. z* f#include <linux/kernel.h>8 w* n' _6 t. B7 V$ K& A$ B; N; x3 o
#include <linux/types.h>) q3 O8 H% N& g/ z7 ~
#include <linux/gpio.h>/ N; a( W% z4 `# L( u4 }5 X; Z# ~! g4 `
#include <linux/leds.h>, w, N$ Y1 C( m; l
#include <linux/platform_device.h> U7 x# {: I' S- w
/ i& K- f( ?0 y9 {4 Z#include <asm/mach-types.h>* R9 A% ?0 v+ z5 M' m( B9 @9 B4 @0 F( `
#include <asm/mach/arch.h>
2 T& `( O% K4 ]7 E#include <mach/da8xx.h>0 L7 G1 e$ s3 b- I) A3 P- w4 S
#include <mach/mux.h>
& d, _8 X& j% x% J- F1 w7 c) X
) M: Z v. k( Q5 q2 n+ V5 y& R#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 p: Y. p, \+ e( f2 y
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
% M2 ~0 W% I, U#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 [7 r3 |/ }$ C6 c
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
" n. Z: y) G- q/ q2 ~8 z% T1 C& J' H8 g
/* assign the tl som board LED-GPIOs*/
+ e* k; Q* }2 g" Z% y6 c8 |$ e! u, kstatic const short da850_evm_tl_user_led_pins[] = {; [; ?0 I+ m) |- n* _; A$ \
/* These pins are definition at <mach/mux.h> file */6 w6 \3 Z7 f s v
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: I$ ?1 ?" o# ` x4 Q -1
! t* E( \ y. z};
% L4 S9 v4 }3 |$ T ]1 I, n. [' q/ V% R! T
static struct gpio_led da850_evm_tl_leds[] = {5 d: r. k- C. h% m
{
* _2 O) P% T! ?" R8 m+ t. i .active_low = 0,2 e+ m! K7 m9 j# m
.gpio = DA850_USER_LED0,
/ c9 |! E, u* B1 Y" G6 ~6 D .name = "user_led0",
$ e6 U/ s, _( r4 r! | .default_trigger = "default-on",* D% V0 P. u/ U! `
},8 V* u8 @5 Q' L
{
, i8 d% K6 G" u+ H$ c9 u: B+ w( _: @$ o: y, J .active_low = 0,( R! B2 d0 V, D* v# \" M1 h
.gpio = DA850_USER_LED1,
# ]% K6 Q s( |3 b .name = "user_led1",
6 ~% M$ {; a4 _( F .default_trigger = "default-on",
0 R" e+ Y, V. S0 Z; z3 Z. D# a },
" g% N! ?# Q& K& Q5 s3 N {% o0 h8 {* h/ q- I
.active_low = 0,9 a+ |- T7 |8 E. B
.gpio = DA850_USER_LED2,
+ U% A" ?! ^8 \. X .name = "user_led2",. p0 {, S e" J3 j
.default_trigger = "default-on",
5 i5 ^; i8 q, r" |! L },; q8 w0 \) V" Y3 b+ N' v4 Y! H
{
! d8 S9 H. D$ q, B+ P/ Z* N+ R1 _ .active_low = 0,( }. ]' S1 M$ G. K2 C6 \- l
.gpio = DA850_USER_LED3,
3 h; N& a' l- X: p; ^9 ] .name = "user_led3",, M% B% o/ P+ J, M( `: I
.default_trigger = "default-on",
& r+ n! M' e( J6 F% p },; M' ?& O) K5 d5 E6 }- Q! I. @/ N* a
};- c: g$ q _, Z2 Q1 C/ z5 I+ r
; }2 o1 W) x5 X# x9 Vstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
K. n2 a O* c; L4 l0 V .leds = da850_evm_tl_leds,
3 F0 s# U* L1 g4 G* m) p .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
9 N2 X( n7 g2 @/ M2 b- e0 g3 H};, F0 u3 r* z( F3 @
( ?% c$ z+ a0 L
static void led_dev_release(struct device *dev)
2 t0 U" B5 V0 u* M% }5 v{8 t$ u- z+ ?7 U9 H- z7 Z
};, ?+ Q" E; Q+ D: @
6 m5 P# t; A* {) n3 Estatic struct platform_device da850_evm_tl_leds_device = {- L6 I, o% G. w
.name = "leds-gpio",8 c% m: ~* s" a, O6 |
.id = 1,; M& U$ z# |9 `9 A
.dev = {3 H ^4 q. x- W) c5 R, }
.platform_data = &da850_evm_tl_leds_pdata,
% G. S( a0 U+ u9 p4 N7 q q .release = led_dev_release,2 G0 C% a: U2 g
}
9 B* h+ `1 N3 b, b};
; \3 p/ a( F2 n7 g- R
' H% X& o2 ^+ g9 y" Estatic int __init led_platform_init(void)
' Y# U* y9 z5 |: Z' \7 o9 g/ D* x{
, @3 s3 B& y T7 O: d int ret;
* k7 O" G, g7 ?! E- K$ W' X#if 0, e" U( b' t9 A+ T3 n/ Q3 F
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 C* W1 |) q' m$ H if (ret)7 u* H% B# F3 R8 t( y
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
* Y+ W2 K" k) S3 U "%d\n", ret);
4 _8 t0 q' ? _0 C#endif
) r3 R) N! l" x2 ^/ Y& h ret = platform_device_register(&da850_evm_tl_leds_device);
* p& B( t$ w* U2 J3 o } if (ret)
+ {6 H4 X$ ]# J7 b pr_warning("Could not register som GPIO expander LEDS");
$ F* h. c/ v9 [ else
! e8 ~8 N, m& h4 i printk(KERN_INFO "LED register sucessful!\n");
0 |0 G$ Z. T' L2 k% r6 N/ [( G+ ^& C+ ^
return ret;
6 E! K5 P5 I; X}
}7 }; T" z8 h1 ]1 R' o' f" n
+ N S' U8 G% w- Cstatic void __exit led_platform_exit(void)" P0 f6 z9 W% j, f& N% o8 L
{
9 I: |1 G3 C6 {1 r; f% G' m) Z/ \ platform_device_unregister(&da850_evm_tl_leds_device);
9 ^3 O/ ], A, P% `" c& b' ^
" e/ Y1 T/ }. R& Y printk(KERN_INFO "LED unregister!\n");4 E8 L0 z6 Q* f$ Q2 N9 ^& v' |
}# |" D2 o* y7 x0 k* J
: Z2 T( \' [7 d% x" \! r
module_init(led_platform_init);7 Z# W3 h) m' _
module_exit(led_platform_exit);0 F" T v' S! u2 {4 O
" b8 v- I& _7 G4 e! lMODULE_DESCRIPTION("Led platform driver");
8 E2 H0 {! n6 g9 f6 }5 ?/ uMODULE_AUTHOR("Tronlong");- d" t4 }' p8 u I0 S0 v' v: u9 d
MODULE_LICENSE("GPL");
4 p- f. |& z* o) K
5 M$ G, `4 f9 t! z8 F: J3 I9 R% Y |
|