|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
- U& L8 C' u; t5 M9 c+ g, k#include <linux/init.h>3 c$ v" ]7 A8 @& c
#include <linux/module.h>
: c2 K' t( s) k' X#include <linux/kernel.h>
# T* P. k& K2 a#include <linux/types.h>
# N: X8 ^% t5 x#include <linux/gpio.h>
* d8 j; |, \0 M4 v#include <linux/leds.h>9 i- F# k+ _; }$ m( R8 }. a
#include <linux/platform_device.h>
% X0 y. @# N7 {' U0 v5 ]* {3 |
. o' ?/ V$ j3 c" C* H% o& A: H#include <asm/mach-types.h>& Z# @3 ?6 C3 {! C- x& F
#include <asm/mach/arch.h> o& o# n4 O h2 I+ H
#include <mach/da8xx.h>
; u+ ]6 v" r( Z0 W#include <mach/mux.h>1 P$ o& E! x u6 Y$ W X
- [# t v6 |$ \; T. V/ Y( V6 K#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
y5 r' V. x! K7 \" v' s" G3 D#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 {% ?: ]8 S2 ~* C: b
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)6 _7 N, B8 ]0 e8 i; U; j% L
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ A2 N, I! r4 l& W/ [! f4 D3 K7 I7 F ]: Z7 {7 x9 ?
/* assign the tl som board LED-GPIOs*/
( t$ t2 e, `* Q# V0 _0 gstatic const short da850_evm_tl_user_led_pins[] = {
' s. e3 `/ M' w+ y1 B- ` /* These pins are definition at <mach/mux.h> file */
( ?/ j3 c* `5 d, h3 t8 b DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
* r. n" s7 V$ ^4 z! f! F -1# r+ I' n$ p* e1 n+ E
};
9 T) d+ x* z% N7 V' o; Q" l5 x7 b
static struct gpio_led da850_evm_tl_leds[] = {: ]6 N4 ]; [8 W7 Q- s8 I m; U5 o @% q
{
) m. t5 x5 h0 `; k' H .active_low = 0,7 k, b8 v, {) @
.gpio = DA850_USER_LED0,1 l: F$ V8 ^' d. D
.name = "user_led0",( ^* E' P( r; s( C; L# l5 P, G
.default_trigger = "default-on",& S' z8 d2 K' e0 n! o
},5 B4 ~* e( Q, y+ G" X; }4 k0 s
{
! e2 f: `1 k, O .active_low = 0,
0 @% }3 t7 ]3 |: u$ c .gpio = DA850_USER_LED1,
# |! z d6 _& D! z2 h5 T) m .name = "user_led1",( r& a: D% i( b) r+ [
.default_trigger = "default-on",6 ~7 j5 S' H4 J! h6 \
},# F( _+ F: o4 C8 S# n* W
{' C( }+ `$ k) a
.active_low = 0,
3 @: s) ^+ Y& T, \ .gpio = DA850_USER_LED2,) J9 G' b( O( q; }( v2 }1 e6 Y6 Q
.name = "user_led2",8 ~+ W$ q( t2 n0 Y& e5 }3 Z* [1 J
.default_trigger = "default-on",
) }, n4 v" ^ C },5 X4 v; N+ k+ f' T7 K- }& Q# R
{
7 `3 E. q$ F( r; m: t .active_low = 0,7 w' |6 a; J: p; s4 y# |
.gpio = DA850_USER_LED3,
j# y/ O e; V2 ` .name = "user_led3",
: y6 X5 Z- c8 r7 r* Z& _ .default_trigger = "default-on",' M, r& a$ e- U
},) Z7 N, l$ ^: C7 D2 ?4 G3 R
};
! H8 C# n' a$ k" B6 i3 B- P! w) ^) j
# n. [8 S( Q) O6 ?: M5 jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ `% Q/ |5 L7 b) R. a* g
.leds = da850_evm_tl_leds,: E9 J$ L( C' |( Q
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),2 a$ {1 @" b4 H+ H% W9 h' m& c) m' h
};
; D* i0 R: J, [; q
$ o* C7 a# m& H* u$ K7 Mstatic void led_dev_release(struct device *dev)6 g0 \! T: E( q* X' d0 {1 y
{8 B0 p4 E$ @4 Y3 r! K# B: g I7 y/ s, I
};1 m# p$ {( v9 Q
9 X3 h1 M- _1 w. E
static struct platform_device da850_evm_tl_leds_device = {) _* r, M! V) e! ?" g
.name = "leds-gpio",
4 N. f- s# T3 R# h& J .id = 1,
' K; |: ^$ X1 p4 K1 E% g' Y .dev = {
# x' B) I! r" K( u7 N0 o+ x8 {" V) i .platform_data = &da850_evm_tl_leds_pdata,
/ ? O- ~( s) `9 J .release = led_dev_release,
) E. w8 r+ H7 m5 ]( _1 b+ `5 { }8 C! l7 x, l+ h& P @& V( t" C- i
};
+ E# M: Q8 q* j$ r% X# x( R, `' [7 H( X* c; q, @9 n
static int __init led_platform_init(void)
8 b% ]/ U3 v& b" H; m8 t{
5 [# e9 ]0 @% p7 T/ r+ C0 n# W int ret;. f; r* ~" x' j9 Y' C6 x
#if 05 p3 X/ ^0 q) L; @
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
* ^% \" _0 N% z( g: d1 a' Q9 w if (ret)6 m; R6 N! W( k* t# ?
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
. y: f- W, Y' Y. F4 t8 \ "%d\n", ret);- A! c* S9 l" O6 @
#endif
- q1 O, |( l" l. p- }' C9 y; v) Q ret = platform_device_register(&da850_evm_tl_leds_device);
- O0 e" a9 T" |+ m5 s2 R U9 f if (ret)8 s7 o, C3 m5 _6 _; ~; _" M
pr_warning("Could not register som GPIO expander LEDS");
4 }+ A9 N+ O* u# {* }& M! g" p else+ N% u3 d4 K# `
printk(KERN_INFO "LED register sucessful!\n");
; D' `# M( F/ f& J8 R! u9 [) @
: l M. A* s# t0 }3 D3 ~! v return ret;
4 A( s. B- K& n6 h/ B2 i: o" T3 V}
) s! s) f2 l' D R
1 Q5 N" E8 e) P2 B- Tstatic void __exit led_platform_exit(void)
2 i a5 R3 N/ @: w5 i2 H% e{4 b) h* k" f. N; S6 v5 u; ~( e4 ?
platform_device_unregister(&da850_evm_tl_leds_device);
# L; w/ K% ^$ F7 h/ v8 \, H
6 o0 r6 M { h1 o& ~& W4 t printk(KERN_INFO "LED unregister!\n");
: [/ d. t$ {! Z# a3 Y}( O& \# f9 L1 h. ^0 P: [
5 M0 f! q2 L. Y2 f6 wmodule_init(led_platform_init);
( [2 @0 z/ w1 [' R* U7 p. cmodule_exit(led_platform_exit);( I ?5 ], L5 \0 Q
. m: K5 M& E H
MODULE_DESCRIPTION("Led platform driver");- @: i& A" x" x3 T, g/ q
MODULE_AUTHOR("Tronlong");3 T3 b% _" w: \2 i: ^" K f, p* x% J: D
MODULE_LICENSE("GPL");9 Z5 y. `9 H9 q9 {, @
1 r$ G) X$ ?: ^' E5 d+ P |
|