|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 Y2 K$ \% H4 L% [
#include <linux/init.h>
6 @; k+ L9 Q: d7 c7 p#include <linux/module.h>
+ h! o# n' z! s* \# l- v#include <linux/kernel.h>
! ]3 i7 O E( [#include <linux/types.h>
1 ]1 {5 j1 i4 [#include <linux/gpio.h>* p: ?& M( }+ k: [/ L2 k
#include <linux/leds.h>; B# P+ t; R, g/ K, w: C+ x) T
#include <linux/platform_device.h>1 m. _1 d! D! s+ H, m/ K" S: N( f
' F# l) n0 e. r( C, Q J#include <asm/mach-types.h>+ M: W L( K/ u7 n/ D |, S* _
#include <asm/mach/arch.h>
/ ~0 K) G) B# \2 |#include <mach/da8xx.h>/ n) _5 |+ l: [# E( `6 [& R
#include <mach/mux.h># N M3 F- y! `6 h
) @ J% I! u' K' E3 C+ J+ ?$ a/ Z#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 q1 v9 Z' c2 p" L5 T# N
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 C" t- K; S" R- w#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 c2 n7 A( F% S4 l; e2 g9 E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
/ D! G+ r0 j- _% o! _* n1 o) b& N) e
/* assign the tl som board LED-GPIOs*/
5 t; X: l4 i) F# b% cstatic const short da850_evm_tl_user_led_pins[] = {# e2 B4 _2 N5 z
/* These pins are definition at <mach/mux.h> file */: @% C1 B3 M# L
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
# j/ N/ H) ?! {( b -1# I1 t: b! s) l' ^& D, H2 Y: j$ O
};
+ x0 k/ P0 r4 C$ T: I1 z/ C1 y+ C6 Q* m% i
static struct gpio_led da850_evm_tl_leds[] = {! h: r1 ^* U; c: m: i: r; g
{
1 ?; s+ m2 [3 d, P .active_low = 0,
0 {$ s6 e/ E: n' l' l$ b .gpio = DA850_USER_LED0,8 H1 G+ }% q' O S( k4 V& M
.name = "user_led0",
, |% E/ ?/ I- d# Y( @* e .default_trigger = "default-on",; L3 U) I% P! V) j
},
& k; s3 a' E1 S/ | {
0 \ G* \( I# v) I .active_low = 0,% ] K3 x8 U& u1 _6 A* g/ g
.gpio = DA850_USER_LED1,6 I! u3 U& a5 O, n1 I
.name = "user_led1",
; I* j1 V V7 L# z* C2 _! W( l .default_trigger = "default-on",
8 M* `7 }; j: e },8 C# M/ g; O6 D* `
{
5 C6 C! L, F2 ~/ p' j .active_low = 0,) P: _: f, m8 K# M' v
.gpio = DA850_USER_LED2,
) J+ d9 R, \1 m7 U .name = "user_led2",
. Y+ o9 K p4 B+ X7 i G .default_trigger = "default-on",9 z1 Y- ?4 ^: x# W
},! K7 @1 z) i& Q; d$ k
{
. q# `. a( Q: @# U+ R0 [1 J .active_low = 0, s& Q' T8 i5 {7 `) Q6 `1 p
.gpio = DA850_USER_LED3,
3 _; H H) o% @ .name = "user_led3",
% G* }/ r; C# S+ Z) O .default_trigger = "default-on",5 e6 n& }4 b3 K7 @% |( J F
},/ I2 n' E8 f0 d1 ~0 ~0 S' M
};% h2 U; i& T D" u8 h3 }
. u- B; [* [' B1 Z
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
& S& j9 D7 f- l% q& J4 t+ H# a* U .leds = da850_evm_tl_leds,
% ]7 c( o4 ^- F& C .num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ e2 Z* v" J5 p5 m: U
};
; F) I+ f2 r) ?) T: `1 }& u2 K# W" n) B( ~
static void led_dev_release(struct device *dev)
) M9 o- n$ z! @0 }{
5 I0 _9 r, A9 H( Y0 t' c' A' I};- {9 f7 ~9 x$ t" z! n
+ b1 c- H! M* T* Qstatic struct platform_device da850_evm_tl_leds_device = {
1 e7 K( f3 v" T5 p .name = "leds-gpio",
P0 ]6 O1 E% q4 O. D' X+ ]- w .id = 1,6 \" ^* c# y v( p+ q8 ^. L" o: b
.dev = {( G! T( Y/ W0 l- G
.platform_data = &da850_evm_tl_leds_pdata,
1 D/ X% ?! `: r I .release = led_dev_release,
! ^; y/ h6 v0 M' R }7 N+ `( d, o3 r# I
};
1 R6 d n( v5 N3 o. p5 E) V K3 R$ x; s% S2 m
static int __init led_platform_init(void)5 G" }% i* P$ }" w8 S( e! _
{0 z6 I7 w& v$ L2 B& W8 Y' F: r
int ret;
+ D! @& i# \6 d. {. D* O* g8 N- S#if 0
9 x# T9 d k5 [& l/ u2 h' ~ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);& N$ o' a1 F% r7 B& [1 ~7 r
if (ret)9 Z& X1 p" N n3 m8 e% u
pr_warning("da850_evm_tl_leds_init : User LED mux failed :". [: S6 }1 z* p* r5 E' G
"%d\n", ret);3 k" p# i* _0 h3 q7 I
#endif5 w7 Z) a% e! x9 W( |5 |
ret = platform_device_register(&da850_evm_tl_leds_device);
) T! m9 a) H7 G+ m if (ret)
( h" P1 x. Q; L2 Z/ F! O pr_warning("Could not register som GPIO expander LEDS");
& f9 I2 j8 e5 m$ o9 U( f else
9 ?: F- G3 ]& X+ s. X printk(KERN_INFO "LED register sucessful!\n");
% Z/ F1 ^! t0 S7 v1 F' Q5 C" G, o: w# J- c) `" j4 Z
return ret;9 H# w( P o9 S7 P* u3 S, f# M
}5 F! g: J& W# y9 B9 O+ X
~$ A' j& c% Y3 o& Q0 ?- f6 `! w! ]static void __exit led_platform_exit(void)
6 l/ F; v; d2 T0 J8 }. H- @3 a) a( |{$ n, H1 | L" `/ Z
platform_device_unregister(&da850_evm_tl_leds_device);% o$ Q$ I( c; K
% Y! e# t7 ?9 E5 ^# e* b' M printk(KERN_INFO "LED unregister!\n");/ w0 X& C$ M, X
}. p3 Z3 q- p3 t, g l2 [4 a
q% o7 x/ w" N1 z/ L, y* x
module_init(led_platform_init);# N! i* |, @# `# h
module_exit(led_platform_exit);
! G0 l# p# a7 ]+ t1 v* S3 {* ^$ E8 b( I
: u& O, S' ?5 d. B2 J% F% q$ p. EMODULE_DESCRIPTION("Led platform driver");0 D. O( n. m, `! a2 _3 ?
MODULE_AUTHOR("Tronlong"); W/ t6 c7 m" f4 U5 f
MODULE_LICENSE("GPL");- K2 s& \) g8 j* {- r
: M& v" b- Z1 K. K& l1 ?
|
|