|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
& M6 W$ l2 \6 p" x/ d#include <linux/init.h>4 o* g& V" J& w- T7 p. W. b V& q
#include <linux/module.h>
7 V1 n6 n8 g- B! C* \#include <linux/kernel.h>2 K2 l9 d; f" ~* e
#include <linux/types.h>3 O! c. o# }( N% r8 ^7 l
#include <linux/gpio.h>$ X% i7 q* v1 v U- N* C/ `- E+ x
#include <linux/leds.h>) b8 Y0 k) q4 U# d( @2 @# k
#include <linux/platform_device.h>
! N0 m$ E0 q; `/ k g1 H: n
7 p2 G+ \8 E# L' A% e5 x% ^#include <asm/mach-types.h>
6 b: ~7 z0 E: u#include <asm/mach/arch.h> m4 W9 }5 L3 H& S
#include <mach/da8xx.h>5 _1 [5 G( `( S# Y
#include <mach/mux.h>
! g5 E2 s- d. A! g3 a
! b1 r( v. ^ y1 O; h#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
2 n9 v }: ~/ H! t. J#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' S$ ]# F8 _0 D
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
$ U" S7 _# P% l7 F( B( v#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) o4 S- {+ P& i4 d5 L
4 ?1 |# i* T% i+ p8 F/* assign the tl som board LED-GPIOs*/ I+ X) J( {4 \4 `& o
static const short da850_evm_tl_user_led_pins[] = {% ~; k3 l' p( P& ]
/* These pins are definition at <mach/mux.h> file */. [% ]* t4 B. ` [, V) n9 P
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,* ?7 n2 r0 _& Z. q+ B! C
-19 h) K) V/ ^6 ~. W
};% t3 `$ @- P; E! J$ ~9 q
0 \8 S! @2 s0 q5 ?8 p6 x
static struct gpio_led da850_evm_tl_leds[] = {
% x4 e6 A* g+ q# V$ r' T" d {
3 a: ]: B- q8 Z .active_low = 0,
$ d4 _3 f/ w7 C& A6 x; c .gpio = DA850_USER_LED0,$ m: I8 r7 u2 b, F; q B
.name = "user_led0",
# q- A2 R2 O7 _) }; w1 A .default_trigger = "default-on",
# y3 n5 b" x$ u5 B },
: D2 a& J: K8 T6 _9 Q9 w2 H1 b3 l {$ w: L6 C5 a0 |; L
.active_low = 0,* w8 N* j- p, Y# F8 ~3 w: _
.gpio = DA850_USER_LED1,
! Z. @' ], V! H% t+ i .name = "user_led1",1 a3 h" V1 E1 `2 I' d3 j- _
.default_trigger = "default-on",, F7 [* g5 x; M
},
+ x1 X# i9 G- [4 i {
$ Q( f# l' ~& V* @& y+ K .active_low = 0,
" u" q- Q2 L( I: G/ [1 E .gpio = DA850_USER_LED2,8 \3 b% V& m5 I9 K
.name = "user_led2",# i3 h0 C3 b$ M% ?! U8 D& _
.default_trigger = "default-on",1 j% E$ J6 k% P' W Y- u9 T
},' L. I$ A5 H+ Q3 y
{
' c; h' }0 h+ w" z7 C! w; s8 o& q/ U .active_low = 0,
6 q1 I1 s+ W: H$ G( i .gpio = DA850_USER_LED3,5 i: [3 f( j* z# f }
.name = "user_led3",/ V0 E* E. e D ]( W9 y1 l. A
.default_trigger = "default-on",
# M, T. n5 ?) \( |- J }," W: T" _) v) Q2 ?! `9 I) |
};
# m( c8 }6 E; L, G/ X, `. w, Y- [/ b N
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% e* y* s% q) I8 e .leds = da850_evm_tl_leds,
* |7 c6 `( e2 v6 |0 { \9 S2 V( [ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 I5 z6 t* f. u Z/ I( `
};
* @% F7 H; ?6 Z+ ^1 d: |
1 R# I$ @3 l y! Q9 O/ e4 Ostatic void led_dev_release(struct device *dev)
. B4 t4 i3 o* ?; ]4 \* P{- H9 R. P9 F- {: B
};" b8 K; F( I) z) n' S) ^6 L
4 D2 f9 P! k S8 r7 L q+ @
static struct platform_device da850_evm_tl_leds_device = {# N0 @+ I! V+ N* r' T8 }
.name = "leds-gpio",
& R' x- `" O7 H .id = 1,5 O6 Q. \8 z. g( c# `
.dev = {
9 H5 @) G4 C9 S" v1 v0 z s* |3 P3 K .platform_data = &da850_evm_tl_leds_pdata,
5 d$ |1 M1 Q/ U0 e .release = led_dev_release,
% Y# v/ x: l6 \9 K1 Q- \7 W; U: ` }! L0 ?9 e" M8 z
};
, m; ]! ~, @ Q; g# _( X
8 |2 w' e( m5 ?% }7 e: p- wstatic int __init led_platform_init(void)$ N0 `# i$ A( K4 H; n: z) f1 y2 y! p
{" G- w4 b2 u0 |. {; G0 S! `) Y! }
int ret;
5 o1 u" W7 O8 d. j z, i/ L3 z#if 0
0 ~7 B7 x5 H3 v7 L ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);5 z, H* \- f, S
if (ret)( W" ^' }9 Q. V6 C* |
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
7 N+ U. U G7 s0 F/ h+ j7 D "%d\n", ret);
" e( R: Y B p! R#endif
c- T5 K4 y* d; \ ret = platform_device_register(&da850_evm_tl_leds_device);" ]* `3 s. a# X0 o3 A+ g
if (ret)
6 A! S3 z( {& |* x! J7 Q8 j pr_warning("Could not register som GPIO expander LEDS");
8 f. z% b$ u4 M; G6 l: | else. s2 }8 w* z+ ~# |# d. i" ]
printk(KERN_INFO "LED register sucessful!\n");
0 w6 _- l% {/ G3 J
/ g$ l8 O2 L U; W/ T# s% b# x! l return ret;1 Z( E: T- v) x$ \
}
5 d4 ?/ O/ P6 D/ r
5 |1 w+ ]. A p9 q6 G dstatic void __exit led_platform_exit(void)/ b& n; ^$ H m+ m
{
1 n- R3 C* m& m5 I: c platform_device_unregister(&da850_evm_tl_leds_device);' C4 _5 a2 S/ x# [' \2 E
; h! k; D$ V8 Z- m X) q7 H1 e( c7 _
printk(KERN_INFO "LED unregister!\n");
# ]' Z7 ?$ N9 u& r& p}* G/ [# a! c1 v# } ^
5 L0 [& `( d) Y# s( ]6 I
module_init(led_platform_init);
4 K! A5 V/ m' pmodule_exit(led_platform_exit);! J4 N% M% {3 N* F
6 N9 J" ?& Y6 `" B% [
MODULE_DESCRIPTION("Led platform driver");
' I! i+ G% c' w: u+ |6 H. i9 Z; ~MODULE_AUTHOR("Tronlong");
5 A6 B* P6 b3 V( _MODULE_LICENSE("GPL");; \% _; V; [$ G8 q
4 e( `/ R8 _2 I# k- y( B* a" V |
|