|
求大神给下面的程序做注解,请稍详细些,谢谢。
; d" T7 ?8 [! J) n#include <linux/init.h>8 U! H$ D! l8 e8 E$ r
#include <linux/module.h>& W! {1 z m" |0 V- x% z
#include <linux/kernel.h>+ {/ ?& ?/ `% M& i4 h+ ?
#include <linux/types.h>2 @! _1 E$ S" F5 S3 m( R O0 u- m
#include <linux/gpio.h>) d8 P5 L* z7 c. o3 g
#include <linux/leds.h>; ?! F, @. U# ~4 T$ k; v! D9 }
#include <linux/platform_device.h>* ]. A F. t/ U* ~6 z% |
k/ n1 t& L+ u2 I4 m#include <asm/mach-types.h> }- W) b7 z3 @' n9 M9 e; q3 O
#include <asm/mach/arch.h>4 O8 K$ @9 W9 }
#include <mach/da8xx.h>
: Q) g, k0 V9 i& j. b#include <mach/mux.h>; U: r2 B) _% F
: o5 O2 z I4 W+ t: s. E#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* j) M9 y! S0 M6 S+ o# X
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- v/ C2 s) y6 C; b9 i2 ? Q#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 q0 q, p8 E3 J- B/ Z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- j" B. q" \$ E* O
: T& M% d/ y( J7 a/* assign the tl som board LED-GPIOs*/& B9 x$ R6 V5 p+ L5 W/ K; ~; K
static const short da850_evm_tl_user_led_pins[] = {
7 l' k; }9 l+ c& d; @# L8 Y( [ /* These pins are definition at <mach/mux.h> file *// ?% a+ Z2 Y+ T
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
, R2 j0 \) O' v; U -1
3 P% j# ]0 J* b' _8 O};
- ~7 q2 F; H; A& G+ Z( R: V( v: W1 ]$ S6 n+ l
static struct gpio_led da850_evm_tl_leds[] = {+ V/ f4 w! Y0 F: o- o
{7 Y( _4 e4 R7 B$ _& U3 `6 p
.active_low = 0,* `( q, {! L" i: L* _8 c
.gpio = DA850_USER_LED0,7 B% D& _- x/ j0 @+ X
.name = "user_led0",9 X' Y! J' ~* ~( v8 {# ?
.default_trigger = "default-on"," g( C7 ~' F7 q" U
},
1 a1 k% b/ \- R {
% k1 { R0 q9 `# q1 M% X7 j$ X* y .active_low = 0,; q% E; k- n. y
.gpio = DA850_USER_LED1,1 K; B: \# W. ]! c- ^
.name = "user_led1",5 l2 {% U) T7 R# Q5 t
.default_trigger = "default-on",3 w' e0 @+ p3 b$ `; |# V
},
( N8 K" H" N6 R! P/ h {
6 o$ x# r$ ?) Q2 k1 P .active_low = 0,
' Q6 e3 v: T7 S i L. A5 |; O& c .gpio = DA850_USER_LED2,
- s+ }7 H1 y+ Y .name = "user_led2",+ u) L: F5 c4 B+ z ^9 a% O
.default_trigger = "default-on",, m# P! f/ v' d4 m' n# m# @% D; j7 {
},! O' e- P" [' }$ H0 ~4 b- h
{6 L3 Z. M, d. B2 F S0 k% H
.active_low = 0,
! k* K. K1 {6 T+ m, ~, i4 x) X .gpio = DA850_USER_LED3,, s5 t1 w9 o* p4 j* a
.name = "user_led3",2 f+ @1 }- a; r, C2 E
.default_trigger = "default-on",
$ S/ i) s1 E0 r6 ~0 j* { },& w# S' O+ L/ a" T+ _, l
};
3 F, M/ S2 \" m2 Q& F' R R4 s q9 x, O
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
2 \: H% H8 ~8 C" q .leds = da850_evm_tl_leds,
2 N! k! J* ^) H5 k4 ? .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' _# h( R6 _) O: W1 W$ M) [ I};/ v3 @2 J# @+ F# `# }. |6 S
: S' o: \- U/ ~/ K; W/ Pstatic void led_dev_release(struct device *dev)
" G. I$ Z, x4 q( l! k{2 o9 @8 G+ p; b9 L1 f5 ~
};
3 `0 e; L3 r1 f( ^, J0 C, ^+ M6 `" |4 g4 P8 C. n" [
static struct platform_device da850_evm_tl_leds_device = {6 n1 A; [ \; n) x% F5 j9 B
.name = "leds-gpio",
4 f4 h# Y! k+ o% z1 I; j .id = 1,
% a7 V& F, G# G+ `2 a .dev = {$ m. _& @. R! U( _. B
.platform_data = &da850_evm_tl_leds_pdata,
+ u* g# \, h& A- J+ O* K- P .release = led_dev_release,# s; w6 F) G$ D4 G+ X+ n( p& n n
} Q4 @/ S* v) M; T* }. ?
};
* |3 D8 r. v2 z- h6 e
# x9 {& y7 m! Y6 M, Cstatic int __init led_platform_init(void)' x/ P i& s- L8 a
{
. @7 L3 M1 O( s( _( M' @ int ret;
R) _! V. f6 s) l7 m- r, @#if 0; \$ w9 O8 ?& Q* {5 {" j5 r3 x
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
! M8 }, F; k. ^% a7 s if (ret)" X% s: l) J9 E! L2 p! X4 O7 _
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"8 P* k, C3 |. \+ `
"%d\n", ret);
& |. O# r5 e& Y: {% F#endif$ T+ ~ s0 D9 h& J4 _
ret = platform_device_register(&da850_evm_tl_leds_device);
3 v7 o0 L; B$ D0 A. A9 ^ if (ret)
! ~3 e! X7 Q7 D7 h5 v pr_warning("Could not register som GPIO expander LEDS");
; y# w1 @2 Q4 z' Z else+ t8 ]* w! V0 f
printk(KERN_INFO "LED register sucessful!\n"); D/ X0 G9 U) X; k
2 y. m4 `% M7 i$ S( t8 Q
return ret;) R+ a8 o7 C6 T4 f- Q9 U1 i
}
: o R+ d, x% P( B8 u: {/ z. |; }% }+ n3 M& t( \2 S
static void __exit led_platform_exit(void)
R+ B3 a$ e F: ?{
4 v* m z+ S+ |2 h; D" e4 G platform_device_unregister(&da850_evm_tl_leds_device);$ {# ]: U& d* b0 d) V1 y
6 b% N; O! p& L3 _" w printk(KERN_INFO "LED unregister!\n");
8 E1 ?% C; u2 H" o/ p4 b}" u7 N# w$ M0 k S
1 n! q. o! ?9 y$ v g9 W3 [module_init(led_platform_init);; }7 t5 b* D' q1 Z- X: K* ]0 q
module_exit(led_platform_exit);& K; [- s$ H4 M, V- Y; ], D
! ^ h' O, q1 C
MODULE_DESCRIPTION("Led platform driver");: B; F7 O4 @( h' Z; A* P
MODULE_AUTHOR("Tronlong");+ s$ y* g o3 \( ]6 q% J
MODULE_LICENSE("GPL");) \. L: w+ O4 V
2 f( s5 m1 ] N( B: }% J- w1 U
|
|