|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" F3 x& ~8 {6 p' Z5 @& @9 h J
#include <linux/init.h>
. v! |9 d- \) N#include <linux/module.h>6 y( p6 ]6 H; D3 {
#include <linux/kernel.h>4 {" r8 L' U1 B
#include <linux/types.h>
3 @0 \4 @: m4 t. _3 d5 ?#include <linux/gpio.h>5 c7 u& @% s% {& Z* N) ^9 y
#include <linux/leds.h>
% L0 J9 T1 u n1 x2 E#include <linux/platform_device.h>% i% a& N$ s6 A+ v! W" k7 ]0 J
. n( k- b0 m) W# ?! L
#include <asm/mach-types.h>' L' h0 H7 h3 B) K9 X6 {- z: k6 _
#include <asm/mach/arch.h>
% K4 J* g4 b" n#include <mach/da8xx.h>
r: k. P* z; \2 Y1 D#include <mach/mux.h>
9 B' M( X6 G0 i! Z* N0 A# f/ n
# g5 U* f: _ u3 ^& Z#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" s2 U- c7 S9 y; j" T" M% B
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)8 O, w1 `8 u3 r: p' i0 u9 z7 g5 b5 x( I
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 ~) R7 F( s0 X2 F# F! X
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
* X& N+ R, x# W- b
% l" b( v1 E6 Q0 S; D8 N& b/* assign the tl som board LED-GPIOs*/. M5 u+ B+ ?6 C- i3 |3 ~
static const short da850_evm_tl_user_led_pins[] = {6 A+ f. w8 R% G' m" x" A( A
/* These pins are definition at <mach/mux.h> file */3 v- c) ~ f: a& V& a: @
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,% \# e* M9 f5 m7 ?
-1- f; v! V; J8 x
};
0 B" I2 i V4 p3 Y2 t7 G
1 ?2 u' B- I5 _5 A0 H3 E7 V9 i2 Z; Fstatic struct gpio_led da850_evm_tl_leds[] = {
' L# i5 |/ x( b5 r {! s: a+ a7 e* _% N2 ?4 o+ Q- A
.active_low = 0,3 I7 |3 j4 f; X) X5 I4 W8 r0 t7 H: ^
.gpio = DA850_USER_LED0,
8 e3 `; t" s$ r8 q2 B3 \5 \ .name = "user_led0", ^7 ?+ y- `5 l6 m( d
.default_trigger = "default-on",# J" v# D3 X4 N
},: ~$ d$ B: \ w" G( }/ A
{
) M1 ?9 A' u9 }, A9 C0 P .active_low = 0,/ _* J& a& y- f: @3 z6 e
.gpio = DA850_USER_LED1,
" {" d5 J- X, ]6 B .name = "user_led1",
) N1 T2 Z; ?* B# o .default_trigger = "default-on",. b# k+ a$ K& B7 ]# i, C
},$ B! ^5 {+ z7 X( f
{
3 a6 k, G9 z4 Z, M" D, R3 [ x( { .active_low = 0,
7 \- p8 ~2 o! v- D2 g9 \ .gpio = DA850_USER_LED2,$ ?1 F/ W2 q4 e6 M3 J$ c. [) \
.name = "user_led2"," R; a2 C1 @/ R5 |% W1 Q; ^
.default_trigger = "default-on",- B! ~4 W5 g" x: k# l7 C
},
& w5 k' P3 a; q0 u {. P$ r! ]+ ]& S
.active_low = 0,% Z& ^0 G% F8 L A4 I" }
.gpio = DA850_USER_LED3,2 F' z; l7 }) [8 } D
.name = "user_led3",
& B" w2 T% A. n6 K .default_trigger = "default-on",
9 t0 G3 p0 X/ ?0 d) f! Z7 ? },8 s) d6 S& H( _) q+ k2 z" P. d
};) }- L0 I* m$ d4 V6 D
/ |, i5 _$ ?( t
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( v+ y. [6 [4 [! l! X9 U) J
.leds = da850_evm_tl_leds,
5 @6 _3 d0 A4 K% S) ?+ l' Z; O) f7 J4 p .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
( c9 ~3 C$ P" @};/ Z4 ?5 j( }$ `3 t' N! Q
! m1 y0 ]1 J( z. Cstatic void led_dev_release(struct device *dev)* d6 k+ g0 e: K% I
{. I4 @3 F! U$ T- E: v
};
, r7 m# F( d3 s. C' m& F* i
, X+ q* y1 P- K# i/ ~$ i! ~static struct platform_device da850_evm_tl_leds_device = {7 X& M3 Q6 g& p
.name = "leds-gpio",/ N1 { K/ R7 X. }, j1 A( U
.id = 1,
1 U* Y. k3 d( h; e1 Q* r .dev = {- [2 k. P8 V7 g& Z, E# p& w
.platform_data = &da850_evm_tl_leds_pdata,: [) u6 T$ N+ {( R7 s
.release = led_dev_release," e* f) m2 d1 L* g" q! h) K
}7 s8 |, e) Z! |
};5 A C' e4 G% |
9 P' `" m# {( _ v
static int __init led_platform_init(void)
. L! k, o8 x8 N" {4 ]1 @{0 z1 J% z+ e6 m' x) F/ j
int ret;
. k, G$ b, n, \# u! j: t$ C/ S#if 0+ d( @/ [- X6 ?0 }- N5 i+ q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
- L4 ]% P" a3 q5 f' k4 }+ K if (ret)9 y4 M. c9 o5 M' u w
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
% y: r0 a, w! D "%d\n", ret);" J2 b5 Y$ v7 x' P) M; d. N& E$ y
#endif& ~! r( i; }& Q6 _- F
ret = platform_device_register(&da850_evm_tl_leds_device);- t' ~4 y0 I- _1 P
if (ret)" `4 U1 Z. Y! T' K f& \
pr_warning("Could not register som GPIO expander LEDS");6 L7 G+ ~& v x b6 \
else* R) T7 y+ J+ e2 l8 M& v/ B$ ]
printk(KERN_INFO "LED register sucessful!\n");0 L" ?, d/ f0 O8 Q. s
+ L g& i. d! n0 [- c
return ret;, h7 b1 g2 a& q
}
: z! w! N- S# d7 P x6 w$ n
; M5 w+ ?1 v+ \% f+ _+ ?static void __exit led_platform_exit(void)
/ x: P2 d% P4 v) T# w2 J9 { H9 t d5 {{8 B( c& J1 p, u
platform_device_unregister(&da850_evm_tl_leds_device);) V& C j9 b. M2 [7 ^1 f
: q' N, n: z; M8 s0 w2 X
printk(KERN_INFO "LED unregister!\n");( q1 P# @& R* \, U# c/ b
}% R6 ?/ _7 x+ |$ t/ @, P
% Z! P+ [% ~: M8 s/ Q6 t0 V9 b
module_init(led_platform_init);' M2 X# `" F' K3 t& ^* o% n4 m
module_exit(led_platform_exit);
7 @6 e0 K* C" A7 S) u3 E1 }
& e1 ]. s: k8 M9 y2 f; x4 `MODULE_DESCRIPTION("Led platform driver"); v' [4 U" @3 X' Y
MODULE_AUTHOR("Tronlong");" F; Q' m. V: l. \+ p. T* d
MODULE_LICENSE("GPL");
- q7 {; B* G, D) q. ~% O2 X$ N; `
|
|