|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
" x) f7 l9 d& D7 q* {; p#include <linux/init.h>* O: ^% t; K& R) @# c0 D
#include <linux/module.h>/ y! S9 p& N9 h; R, g5 i
#include <linux/kernel.h># p3 N/ [% J$ a. \* P
#include <linux/types.h>7 ]' S- a, ~3 X+ S% F0 O" u) V, }/ [
#include <linux/gpio.h>
, Y4 h' |' W: z8 e#include <linux/leds.h>
& `# G8 C* I7 u* w#include <linux/platform_device.h># Y, b+ ?* l9 ^) e4 e6 p8 U' s
" i- t5 b3 D+ p1 H1 V, k3 y/ E6 f
#include <asm/mach-types.h>
% S. C* n8 j- N r$ f# ~& j#include <asm/mach/arch.h>
) Q3 D: ]! \- J& V/ n( X4 Q, _1 C#include <mach/da8xx.h>2 \1 m9 T. R* C' T
#include <mach/mux.h>6 L1 d/ X4 ^% ^/ U8 X9 u. l. z
- z: M' @7 b6 Y) t5 y
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" Z9 w& K2 E0 z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
1 G3 f0 ^* q- i$ |7 P8 i#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 u. ~. b4 a. P; _$ r5 c
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)0 j& S0 e$ y0 v8 M$ G$ T2 u
& I( j7 O3 P0 M2 | _+ s: [; K- D
/* assign the tl som board LED-GPIOs*/. _" _$ b+ |4 O6 O* O' d
static const short da850_evm_tl_user_led_pins[] = {
8 _5 W+ h9 a# {5 e- Z /* These pins are definition at <mach/mux.h> file */
, R# K& ^3 h+ A P8 I3 { DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 O1 c- d: \- K
-1
& G/ ^/ W2 G2 E/ M( n I};
8 Q, c m, N( l& W6 P- L* Y6 c E3 }
static struct gpio_led da850_evm_tl_leds[] = {
3 a5 X o J" T# H# W- S {; T) d$ p. h0 L) W$ a
.active_low = 0,4 T# Z# |" Z6 M4 |! S
.gpio = DA850_USER_LED0,
5 d2 Q8 Q3 w+ U% `+ \! f, w: e3 x3 o .name = "user_led0",
0 Q. d! F, k9 c" m4 }1 _; T8 s .default_trigger = "default-on",- G7 `9 f3 _+ i6 S6 K" v# k
},
( H" ?7 a' ~1 H! o8 P% f {
' L5 W0 n# d. n: P! S) b, H .active_low = 0,
0 \/ X5 r v( f .gpio = DA850_USER_LED1,
0 H0 e. q( n2 ^' w5 f .name = "user_led1",5 Q) T4 B4 \! y- J5 d
.default_trigger = "default-on", B) D, P' ]" g4 m9 o0 t4 m2 z
},
8 H* A. v% S- U {
; K. ?% Z; d+ ?% ~5 K# _/ G) i .active_low = 0,
- x6 C- Q8 U) P7 T; T3 T .gpio = DA850_USER_LED2,
x6 |$ q2 v" t, S% Y .name = "user_led2",( `" z: E1 D& l( Y N, A
.default_trigger = "default-on",
) {8 h5 ?" U6 }- ~% B& V( b },
! E4 S3 r* D1 I8 ?3 [ {
V+ e8 p, w- w* X- Z .active_low = 0,
9 _( q. W3 Y0 t) P' J .gpio = DA850_USER_LED3,
8 N- u" R& k4 o% Z .name = "user_led3",
. H; _$ p# f9 i9 _ .default_trigger = "default-on",% b$ ~5 L0 j; L$ v; p
},
! G" V) o, Y/ `};
0 p1 ~# T! U* s9 H) W. T0 t# R8 Q9 j8 ?. I/ w: l- K
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
) J$ d! A: u, K4 [# H: G0 f# o+ ` .leds = da850_evm_tl_leds,1 v9 K6 n% E/ J6 J5 x/ l
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),( ]$ G1 `* W) i" D2 k H5 v
};
; v) P% P! n) ~! r. O
* F" `0 M5 a& s7 Q, s7 J7 Ystatic void led_dev_release(struct device *dev)3 h* k( b5 O" e; h" E9 w
{" E" U; c3 {* F% O, v
};
, B$ X+ O; [8 B& C& X) b+ i0 x4 W2 x: q3 \! `
static struct platform_device da850_evm_tl_leds_device = {- d5 M I. h3 v$ C
.name = "leds-gpio",
9 K3 p2 I- ^- \; L& T7 `- w9 F2 ? .id = 1,, }1 }3 P2 r! u. x! l6 n
.dev = {% z" @; u8 Z9 ]5 B; r
.platform_data = &da850_evm_tl_leds_pdata,
_0 _6 U7 C& ?" X! z5 D .release = led_dev_release,
5 I" f& J# K# O$ U }0 v* x' w; p# X, `6 I& H( K
}; G3 C' Y* t8 P
3 [6 h& D5 t P
static int __init led_platform_init(void)
# ] @! v @0 k. f$ ^# J7 l2 k{# u1 W. u J) c) I* P; e
int ret;
" e" K0 w- N7 z7 w W6 t#if 0
$ }* j* N& ~/ S8 I ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);( G7 P( v! H& x# F; I
if (ret). l* ^$ q3 l% {* L
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; }- ^3 b# {* n) c4 w
"%d\n", ret);
/ q% V9 T3 B! L; }: \* Y" [#endif% v8 v7 s ~# }$ r
ret = platform_device_register(&da850_evm_tl_leds_device);+ b- y4 c/ g' Q
if (ret)# m& ~' {- G. Q- d! v
pr_warning("Could not register som GPIO expander LEDS");
% w4 e& P) Q) ~- K- Q1 _ else$ w5 S) {( @3 c0 s
printk(KERN_INFO "LED register sucessful!\n");
+ I- v U7 L( a; U% Y3 l ?, t4 }: C, W/ H& y/ [9 L
return ret;2 x1 d; G: |7 D# P3 T' j
}
0 T, \ d! D7 A) R+ l B; K( T8 w5 p& s- u
static void __exit led_platform_exit(void)% L; f$ O! ~$ ^9 O
{
5 r }4 Y$ _5 T7 p6 v6 z0 f* F platform_device_unregister(&da850_evm_tl_leds_device);
6 C. g, L0 c& C" I3 x6 t3 {* n1 G" f8 Y1 o& ]- ]! m
printk(KERN_INFO "LED unregister!\n");* {+ K+ |6 k: l! o: r
}
6 H% @% \: h4 O) t8 O
+ A/ Z4 S2 H. V. Cmodule_init(led_platform_init);
# {! c( S' p- Jmodule_exit(led_platform_exit);
8 |6 J7 ]5 N+ G7 ?) N. q5 p/ Y; ` h6 R4 H$ `6 ?+ {# h
MODULE_DESCRIPTION("Led platform driver");
* O9 k& D; @0 q9 |1 y' Y7 TMODULE_AUTHOR("Tronlong");
3 d& x6 K v( x( H E* ~# SMODULE_LICENSE("GPL");
# {$ E9 K$ `- P l4 G( D' [) B; r) s3 A
|
|