|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
# s' Y0 a- e6 G# [3 U! }, ^#include <linux/init.h>
/ W3 A, a; S: s# B) }9 w#include <linux/module.h>9 i2 {% ], @9 _; e8 i: l6 G7 {
#include <linux/kernel.h>
' K5 O0 \2 T' O4 C" n8 }#include <linux/types.h># {$ D' k4 `; r( d" y2 _9 u6 O( i; B
#include <linux/gpio.h>/ P9 F) J5 |5 H/ o, |' k
#include <linux/leds.h>
# ?( [! C: `9 r6 i6 C) O. U#include <linux/platform_device.h>% v7 Z7 ^5 x9 L7 M- M
% u& C$ N; S- j2 K#include <asm/mach-types.h>7 M1 D% r N" o5 }( s8 u
#include <asm/mach/arch.h>
3 |# W( z" c8 [! O7 `* N/ q#include <mach/da8xx.h>
7 L8 r" `8 ]: h' R' A#include <mach/mux.h>; j' V2 o; }0 v6 n$ D- l% R( ^
- U$ ~* m) D; |) C1 N4 q#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
: k2 r0 Y$ F( n5 r4 q( j#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
: P, C3 O* e, B#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
9 S3 p+ t' E! x) F& b9 g; {* j#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) g$ z" j- Q; I" N5 ~1 |0 n1 {
# R- n" z7 R, l9 }; G2 l
/* assign the tl som board LED-GPIOs*/* { p! c! g! H7 x" s! C4 ^# l
static const short da850_evm_tl_user_led_pins[] = {6 x1 y4 |$ V% Q* X& z
/* These pins are definition at <mach/mux.h> file */, R* \7 G3 n- D6 Y' ^) B) Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
; i! Y8 B1 j: U1 x# E. y) } -1
/ w }6 H; L. ~/ J4 o. \};
" P* V+ [) N' \. P
7 _$ B0 u5 j9 [static struct gpio_led da850_evm_tl_leds[] = {
+ t! @! v/ X' H) o {8 T" R, L2 ]: x, I( f' Z& ~) U
.active_low = 0,
6 b. F# h2 L3 G: }% h .gpio = DA850_USER_LED0,' W$ z1 x* m, _9 u' g5 e0 \
.name = "user_led0",; _; @5 F7 j+ k+ }! l. S' a
.default_trigger = "default-on",
! _* `( }6 G$ m9 D },8 X% e" {8 o8 K3 J! C! m, _( Z3 R
{
. D, j# m% g' R5 w, x& [ .active_low = 0,8 f; h, s- } N+ e( U8 m' M, o
.gpio = DA850_USER_LED1,
. @, M0 {4 D) ^- Q$ q I8 b. } .name = "user_led1",
$ ^8 I; h# H# ]1 ~! u .default_trigger = "default-on",4 z. f) u3 A' q
},
: S2 x8 W5 o& N4 `) Z9 J {
" i, _5 B% V- `1 X$ j- F- t9 T$ l" m/ Y .active_low = 0,
4 g3 u) G! _& H4 B$ a, P- X2 C9 ? .gpio = DA850_USER_LED2,9 e! m6 w. d: h& ~ }4 Q$ B3 N4 z
.name = "user_led2",
1 W0 a- V1 N1 E, d- z6 Y, {3 k0 n .default_trigger = "default-on",; X; B( M. o5 z' n9 z3 w$ z- f
},
, z& u' a7 h4 V2 }& V {
, E2 b. [, X' U* f/ L+ ^2 ^ .active_low = 0,
0 ?6 @: H! B. b .gpio = DA850_USER_LED3,
' T: z' o( ?, g# f$ v# N! ?9 y! d .name = "user_led3",* Z6 M8 |; ~2 {' U' F; R* d
.default_trigger = "default-on",. a3 \) u2 H* l8 V
},
0 v. p: \+ Q9 W};+ F9 }4 {2 m0 T; j) Z
- h2 M6 i8 s1 Z* v8 b/ x7 L
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 O1 Z% A+ T' B3 ~ .leds = da850_evm_tl_leds,
' e/ Z9 {, X- @( r3 G .num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 C. Z& t- Y% u7 ^" i* _
};
3 |1 i0 C& g4 X
$ G" F7 ?5 \8 Y: r; jstatic void led_dev_release(struct device *dev)8 g) y" Y# B- v9 `7 Y# w0 c
{! D; Z F C) u, k. }. S4 K9 ]
};
4 g' s- i& n! K7 J& }1 [8 u
7 k+ E* a+ @0 `7 S9 hstatic struct platform_device da850_evm_tl_leds_device = {
& @" L9 W$ k9 F& t( { .name = "leds-gpio",
2 l. B( J. B( t; C& }* T" _5 j% C .id = 1,0 X; R% M: O; s/ G- i) F' @. |" b, p. x
.dev = {
0 W7 k. x; [! J0 x/ K .platform_data = &da850_evm_tl_leds_pdata,
: v5 {9 N. s2 p5 D% f6 B+ R .release = led_dev_release,
- y0 k: U4 {7 Z0 Y% l# t% \+ c }+ D8 B; }$ l) _+ V
};
* A2 m; N# M& K+ Z# {. P- g4 @% ]& O; n9 \
static int __init led_platform_init(void)3 Q3 ^1 g1 _9 N: {5 E5 A' t3 Z' t
{; y3 K% ~; B" p: J/ u9 `
int ret; ]8 W1 x a. P$ `" u/ @% x
#if 0 j& }6 h9 |4 h$ G( `3 Z
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);% a: s: I8 M, e: O; n
if (ret)
3 M: H: v0 }* _, t5 a* q pr_warning("da850_evm_tl_leds_init : User LED mux failed :": ~4 ~3 d/ f' V) c2 {
"%d\n", ret);3 B2 x& w! p$ g: R
#endif( ^8 {2 ~3 N' m l- n7 O
ret = platform_device_register(&da850_evm_tl_leds_device);
% I; j) z# X# j7 X& B if (ret)" b4 g/ D" f6 i
pr_warning("Could not register som GPIO expander LEDS");
; C$ q! T# ] T else
' _) \3 R8 z) K2 M. W' }; o- c printk(KERN_INFO "LED register sucessful!\n");, x# }! I; k, Y: \
+ d5 E3 t8 t* u+ e return ret;: P4 Q6 C( k7 p) ?/ h' n4 k
}) X- F; u$ [* t. ~
8 Q# v. o. i; L c6 V
static void __exit led_platform_exit(void)
: ?8 j9 n! w+ \' s{0 h" ]; ?3 U9 `3 Z$ V# E
platform_device_unregister(&da850_evm_tl_leds_device);6 A& x- R+ @3 J2 K* j& h
6 P6 e7 S7 `7 H; [' }. ?9 D: C printk(KERN_INFO "LED unregister!\n");
4 Y! d4 }* \! x" V! f- p# I}
6 `, }! c: P6 d5 d7 ]' X: y4 }. B) T% _, b1 X
module_init(led_platform_init);
$ E1 l; e0 [5 p- R- n2 Zmodule_exit(led_platform_exit);
6 @& _/ d2 r$ ?! o9 ~( s: L/ a! ^) N' }
MODULE_DESCRIPTION("Led platform driver");/ x! O9 s/ D, U: O3 C
MODULE_AUTHOR("Tronlong");
& I( O! [- t; g2 T% M' vMODULE_LICENSE("GPL");
& O0 }& L* J3 I \6 m" a1 N" H! O
" z: `$ g3 ]) N! ^$ Y |
|