|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" U1 G; c8 O Q; ^4 K
#include <linux/init.h>! X! }; O' Z3 [; q0 ]
#include <linux/module.h>
7 y; J# L2 y2 u0 a4 {, G8 \2 y4 I4 r#include <linux/kernel.h>
3 H& o' _: `5 ?$ |) ]#include <linux/types.h>. A% T9 f, O# t
#include <linux/gpio.h>. Y7 {0 F( S$ v6 y# a. I: s
#include <linux/leds.h>
5 }) K! o1 t2 \3 V#include <linux/platform_device.h>
- a5 ]5 L: A4 t- Y7 L0 y7 P) N
* }$ v! j0 R' W. n& W6 ~#include <asm/mach-types.h>
( N; H* p! e4 e7 L#include <asm/mach/arch.h>
R% |2 ^, w0 e#include <mach/da8xx.h>+ F$ O1 m- D7 o% I
#include <mach/mux.h>7 _0 ?' q8 l: W5 |+ S
5 _0 y8 |& J1 l- g4 K! R
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 z) W. i; d, {: J0 L& _
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
7 w6 }% C- S) b; C' K#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
# W x4 _- X; `# l6 f, F#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 X, i& M( a% \4 t" |6 M$ f( z2 B( Q) S4 h
/* assign the tl som board LED-GPIOs*/5 Z z; ~6 X# i" Z
static const short da850_evm_tl_user_led_pins[] = {
, Q& q8 w+ q" H4 o! e$ e5 F /* These pins are definition at <mach/mux.h> file */
- N2 P* ]+ R" d4 H DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! j m& E O3 O' l* t R$ T- I
-1
3 x1 j4 y5 N/ K. j; |" q. H};
9 m2 x1 U& g2 Y1 h' ]6 r. }
2 y- _8 p7 t2 kstatic struct gpio_led da850_evm_tl_leds[] = {
; J- q0 E% q O; h {
# n4 u7 H+ d' N+ f* O" { .active_low = 0,
! Z3 i! F( C( w6 F0 r( h .gpio = DA850_USER_LED0,( T, q- K6 D! j m+ U d2 D
.name = "user_led0",! I. _$ r) m5 F. e8 z! l; S; t
.default_trigger = "default-on",; Q$ e2 b+ K" \
},
P9 a9 p( O) V- H# g: `+ k/ r {
. E1 A8 a5 j- P .active_low = 0,. W& j; \1 f, M. o! v w
.gpio = DA850_USER_LED1,' X6 @( B: Q# T# B/ N/ n. i
.name = "user_led1",
: \' m) G4 V: u% y6 P .default_trigger = "default-on",
3 H1 K( Z; ^+ R },% p9 n9 S# D2 Y. k* F4 w0 J
{
- F8 H- C# ?/ W1 [7 o2 q" Q9 B! D .active_low = 0,1 N. W" P2 k* w, j# Q
.gpio = DA850_USER_LED2,
6 H- e1 }0 |6 Q( h .name = "user_led2",
4 W6 q& B7 u' ]- n. m7 @4 {8 f .default_trigger = "default-on",
2 ]2 J* A, S; w# s },
, e2 y# S6 K e( J9 \1 a" d {( q) P1 [: m' q$ n5 G" N( j
.active_low = 0,4 j! C7 f9 M6 @4 z
.gpio = DA850_USER_LED3,3 A7 A+ p' w6 ]: c2 C
.name = "user_led3",
( p8 N3 k* M5 v+ r! j% H .default_trigger = "default-on",
- H1 }) k3 q/ ~- p },/ x+ `, H' F ?2 {
};
P5 ~: y4 ~% }9 G0 R! m; ~0 x; @5 g$ [! |
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {" j. E$ j: }& \" o: L. c. q4 {
.leds = da850_evm_tl_leds,2 l. ~9 F+ v: T0 e) A
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
; Y' c# Q( t, b; ~$ C; n+ G# R};* o' Y* l5 y4 T
F, o) S/ k d. x9 `static void led_dev_release(struct device *dev)
: u9 d- d$ w! N. l3 r* `7 x, y{6 M. E+ T& ]1 ~
};0 f# {' C1 ]0 v2 A$ U
4 E( v" t: U* S
static struct platform_device da850_evm_tl_leds_device = {
6 |# R$ C; F* i/ R+ S. d5 _, m- q .name = "leds-gpio",7 N; d x; C5 ^: M$ U# b
.id = 1,
. p% F/ v7 p2 v3 q .dev = {* j. k6 G' j: [: o3 b) N
.platform_data = &da850_evm_tl_leds_pdata,+ l6 E: W! D4 s% K& h: I+ M/ b
.release = led_dev_release,2 u y7 w! V8 `2 A' m+ L9 s
}
" Y7 \' d& }' s5 o2 |7 \4 {2 |( H};
( v4 d1 U& [6 `0 a) e+ D+ r2 J0 g' k
static int __init led_platform_init(void)1 A" Q' I- Q# G; {) b$ o! l
{
/ P+ l2 y6 ^5 o+ R; C# c int ret;
4 J! w2 j* f% {% \#if 0# Z' l7 _1 J; K$ g" L( {
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' n. o9 q5 j" ?9 G/ Q! ~7 W if (ret)
& U% D9 M; Z/ O# f6 d/ D pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; P( \$ Q a, G8 j' ?: _+ Z) T "%d\n", ret);
% \6 v* d- n6 I$ D/ w5 p1 ^2 x#endif$ Q- O8 Z4 q1 z M) _
ret = platform_device_register(&da850_evm_tl_leds_device);* f6 W7 G$ F( H; S7 H; R
if (ret)* L/ s- V7 C' c: X9 h3 W- g
pr_warning("Could not register som GPIO expander LEDS");! H8 N1 S6 ?' p" M. C1 Z
else! m$ Q0 t% A0 k& m2 [8 U
printk(KERN_INFO "LED register sucessful!\n");& d6 I- O7 n) ^1 k8 @5 C
: ^- R9 F4 ?2 Q v2 {9 W9 Y7 E return ret;) l- z3 r @5 }9 i r6 k
}
, J1 ~6 A4 i3 }* F$ Q2 u9 K
1 g: w+ y" E8 q" _0 U' Gstatic void __exit led_platform_exit(void) I/ ^0 y& `4 z. U9 c% W1 f, E
{
5 ~/ q6 O/ @3 E) Z, ?& K0 Y platform_device_unregister(&da850_evm_tl_leds_device);. q1 g }& G: m/ S5 C5 l9 D" E6 c
; ~, l/ `" E- n) A& n! b! t5 K printk(KERN_INFO "LED unregister!\n");
M6 w1 R. W4 V/ V}
0 u8 J* O w' l% h- ]" f( P1 Q3 R- I& O. K( o9 H% J
module_init(led_platform_init);
) z8 p! Z9 j7 smodule_exit(led_platform_exit);
$ L) a* g; Z, Y' H# Y5 N2 K. P- O% {/ s2 U
MODULE_DESCRIPTION("Led platform driver");& N9 p0 o: E9 f/ Q8 S; }& `
MODULE_AUTHOR("Tronlong");2 J$ T. L, T( g/ D1 _
MODULE_LICENSE("GPL");
9 Z$ s, f1 V* l0 V; ^
& r' z$ W; {) U& }7 f |
|