|
|
求大神给下面的程序做注解,请稍详细些,谢谢。3 F# z* B" U% X
#include <linux/init.h>0 j7 P6 K- @6 {' f$ s
#include <linux/module.h>) k$ a9 }, K1 d% {+ h7 W
#include <linux/kernel.h>
. o& D2 z8 A' V" J#include <linux/types.h>
& }4 F4 H& E( H0 K1 V L# l#include <linux/gpio.h>" o( t! G+ M5 d+ z
#include <linux/leds.h>9 l3 p) k" n% w" j
#include <linux/platform_device.h>
$ s& z) s+ k' M+ x, N) _# i
( s0 N# F) W4 s+ B- {7 K W, X#include <asm/mach-types.h>5 N( b" c6 g+ ~
#include <asm/mach/arch.h>4 [6 I! v- M, s6 r( E
#include <mach/da8xx.h>
, R# `" h. \" }+ B#include <mach/mux.h>
" n0 K( W$ @5 f* I5 f1 ?0 t% V b. K' g( T
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 N* Y0 v, }: v+ V& r$ j0 v#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
: y$ G- e2 p. X& p#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 ]& d) ]# ?* x: ]( q0 Z: @. v
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
9 \8 y# g8 F @' T( \
( J. j) T" E* A6 I/ \' F+ U/* assign the tl som board LED-GPIOs*/
$ N+ U& l; D1 s- T1 K `! jstatic const short da850_evm_tl_user_led_pins[] = {
/ ]0 U! `. L. Q% t8 g% X0 w /* These pins are definition at <mach/mux.h> file */: S) A# `! w" h+ N0 K3 P
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
' d I. D4 N( y: n' v -1% |& s, L6 d) H0 }
};# k3 m9 [) w+ ]: K$ B L$ G) g
2 H6 Z+ G, u( ?4 Fstatic struct gpio_led da850_evm_tl_leds[] = {
: [ z6 w2 d! w9 x {
; Y9 _2 F. X. x: C0 b8 f2 K: F .active_low = 0,
% @8 [. N0 L& _, S( V .gpio = DA850_USER_LED0,$ Z9 S2 f2 L7 X( Q6 D' T/ K" \
.name = "user_led0",
$ `( n2 a' m P* p$ X* ] .default_trigger = "default-on",
. F$ O1 S3 L; W) X& Q },
/ M. \' z* g8 X, b) x! Q' t {
- ?# h2 ~+ o8 Y .active_low = 0,
! \, B0 g8 _( H3 @+ z' A0 b6 q .gpio = DA850_USER_LED1,
+ B" V# ~, a! C R .name = "user_led1",6 R+ D: Z5 y7 b3 `% V' h$ h
.default_trigger = "default-on",! V4 K% X! n! i3 n N* @
}," b! x& @; y1 z3 C7 H! m
{$ p0 s! A, `+ @, ]8 ^% W5 G
.active_low = 0,
0 O2 H& n( m. G1 c0 B3 k .gpio = DA850_USER_LED2,
4 w7 a- N- C9 ^8 d .name = "user_led2",% Y% t! R6 ^- Z0 E. }! L
.default_trigger = "default-on",$ z+ z1 L0 P7 [/ B# _
},
* Z* v% H& H4 p- S+ a: S {
7 r3 T* i* M% W4 s0 P, X .active_low = 0,' w0 C K, _: p7 ^, Q2 j
.gpio = DA850_USER_LED3,
" x9 l# k: L# X: B- z5 B .name = "user_led3",$ v- u" j# }( w9 X5 [
.default_trigger = "default-on",
/ l" j% Y% j: P7 q$ ^, u },
0 r6 M V1 _) c5 h7 V};+ F* G5 C+ s$ }5 H3 ?$ k7 ~
) G5 [0 d9 c' G$ K6 W% ?static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 Q: X$ Q; B [ .leds = da850_evm_tl_leds,5 j3 D. C! ^- B1 f Z3 O7 c! G' u
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
3 y0 S5 P8 m! V/ P% F# f};& {6 x/ n9 e3 \8 F$ Z
* F6 |1 m7 C# A" ^. bstatic void led_dev_release(struct device *dev)7 I3 u- x6 v8 F! ?9 q0 J( h* Z
{. l( S2 ] @& |) Z; d- V& o2 c
};- }6 |- {- ]$ v7 v, m1 Y
; r: Q& c7 |. h# w/ p
static struct platform_device da850_evm_tl_leds_device = {
9 q5 _4 _7 M* q( f5 ] .name = "leds-gpio",
, {/ _2 ]- ]% y .id = 1,
: H% Y* [' P7 E0 s6 R# w .dev = {
7 t+ r6 [% T9 B .platform_data = &da850_evm_tl_leds_pdata,
$ f+ w) J5 b, \* n/ B8 u, ]' I .release = led_dev_release,
) K% E. V! r! c, {8 H% m9 d& S }
% F3 A/ a- J) f) g# U, l8 M3 o( H};- t" M3 P4 s$ k9 V3 u, r! v
" i$ F1 y$ S1 _static int __init led_platform_init(void)
7 [- K" L( ? f. p{+ ?; a: Y- y K. x9 K" Z; c
int ret; @5 ]4 N* R3 {; ^$ D/ k: q
#if 0( ]& q& d' Q; ~9 D& G
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
2 ^8 n. L$ H3 F5 i+ Y5 A3 I- N; P if (ret)
" B$ m# B5 T2 w6 Y4 \+ S0 | pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; _( d9 x) }$ G) \5 N1 l ^" |
"%d\n", ret);/ a q4 y8 ?; f) o! H1 ?8 f8 A# w
#endif3 |/ o4 U/ r2 z6 e8 ^
ret = platform_device_register(&da850_evm_tl_leds_device);! l3 I4 m0 f+ V8 a) o$ s
if (ret)
! s9 `9 t. {3 z6 `5 M7 V2 v pr_warning("Could not register som GPIO expander LEDS");
$ G$ Z& g. W8 x else
( V& u5 j( f, t, _; W+ q1 i printk(KERN_INFO "LED register sucessful!\n");8 V7 ^/ v/ C4 l7 h$ S, w! ~6 Q
7 `8 K5 Q$ D+ _5 J/ u! _ return ret;/ {0 k) n1 c, c% y5 Y& v! R
}( Z; U( R" O) j9 n; a+ Z! |8 E
5 ]) L0 z8 w3 w3 f# {static void __exit led_platform_exit(void)0 M+ k: d# ]9 [* f7 j
{6 @6 w2 Q: {. c$ c* g
platform_device_unregister(&da850_evm_tl_leds_device);# ^* D6 g" E% }: g( t
% f1 q' D. I. h0 T
printk(KERN_INFO "LED unregister!\n");
; F* q1 F/ R4 w: Q4 W} h8 Q, r5 t8 r) J) A. u6 p# w
1 D7 ]/ _) A9 z- C t) S- Bmodule_init(led_platform_init);
% |* P; ?8 o' z6 o) n+ }. c! Qmodule_exit(led_platform_exit);
1 I \7 M4 G) f) |' B+ f- i
+ G% l7 p1 J; Z0 |5 V1 NMODULE_DESCRIPTION("Led platform driver");. M) A _6 P. O, Z1 U
MODULE_AUTHOR("Tronlong");
, X% P8 J5 E6 Z' MMODULE_LICENSE("GPL");+ v' G6 ]6 Y" x# {! {+ Y
' z7 n4 O7 P' g# M9 p5 ^
|
|