|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% R( a$ P. H* R- l: U
#include <linux/init.h>$ a, x7 \# g" _- ^6 R% R( `/ W
#include <linux/module.h>; P6 P' M8 M+ w4 F) N
#include <linux/kernel.h>0 G4 Q9 H5 V1 k3 J2 n9 b' H
#include <linux/types.h>) H5 N! y, g0 [& F0 D+ z1 c
#include <linux/gpio.h>
: W* z1 G5 |3 P+ J) S#include <linux/leds.h>
6 V3 n) Y$ a4 F4 v5 Q- [! @, G- `#include <linux/platform_device.h>
. m$ o6 K( E- A) w# Q! b7 _1 q
# u7 n1 N# J0 @2 U; b" {4 r#include <asm/mach-types.h>$ G! n N' f) l& J
#include <asm/mach/arch.h>
8 j( o$ ^, w7 ~- g#include <mach/da8xx.h>' h; g2 l8 \2 E% j; b' @
#include <mach/mux.h>
, J+ W! s& Y3 m; e1 m3 k$ j6 ~+ L: `8 Z6 Q7 T
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 j5 x/ I# z( d: ? g5 V2 n" T1 z$ b#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
% F8 r3 Y. d( n' v1 m0 h#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 T" N- w8 w, T0 x8 P6 `
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)% Z. [* J2 d( E
9 ?7 y' ?4 z" Q+ ?- G+ k2 A7 I
/* assign the tl som board LED-GPIOs*/8 M0 E# c( R1 q% m
static const short da850_evm_tl_user_led_pins[] = {
' G* {) A; _$ D /* These pins are definition at <mach/mux.h> file */% t, j* J) q0 w6 ]' x6 L
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 i5 e- L4 G' u" a! _8 e# q% T$ x -1* y) I. v, N8 x
};- E; t& z) J0 j9 V& X W
2 j) H9 n6 W* @
static struct gpio_led da850_evm_tl_leds[] = {
1 Z5 {6 k, l; f8 p; q T& h" O& f {
, ^; l& b3 ^( q0 R5 ? .active_low = 0,& f ~: b' e! t: x$ o* c y
.gpio = DA850_USER_LED0,
( n: C' z: S1 ?1 o3 f+ c7 W5 \! S .name = "user_led0",
& w1 V+ S( r9 r0 Q* L$ y0 W2 c .default_trigger = "default-on",
4 f5 O8 J# C7 w, b8 l4 S) b },- P% H+ n. W, U. {5 U7 `! ]
{; M& @2 l- h% u! R1 V4 r, J
.active_low = 0,2 _5 b5 b4 c1 y9 n I. r
.gpio = DA850_USER_LED1,# J2 O6 m" |5 L9 U; X% n1 L
.name = "user_led1",/ C# C) i% Q# @) F. V6 }5 W2 I J) y' z
.default_trigger = "default-on",
5 y) t/ _$ v0 q0 t9 Z' F( t },( t9 s2 J% o ?5 i; l' w
{/ ?4 c- C+ J; M
.active_low = 0,
1 q) p/ P; Z# ~' X .gpio = DA850_USER_LED2,
+ H+ _2 Q \) O3 ^( b .name = "user_led2",
) m$ T9 W( ?. s, K .default_trigger = "default-on",% _; F4 P1 a. N7 n4 s! ?
},
/ v: G7 f6 b ~' l {
: A# p5 r1 |* t, F0 v z .active_low = 0,7 y2 C. G% Y, F M# e
.gpio = DA850_USER_LED3,
$ _) g- V+ e( e/ s2 @) H T .name = "user_led3",
& @' _6 A. }$ q* K. d4 M .default_trigger = "default-on",
; n* W, O3 P' [1 W2 ^ },' X7 I* ]6 X7 a" c. ~7 O
};: c0 W1 W$ G/ j: I
! S+ A" P# k/ y' Z& v2 H. g7 fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = { y' z; N. V9 S4 [0 x
.leds = da850_evm_tl_leds,
; ^$ N7 P; m" n4 J" Z6 ? .num_leds = ARRAY_SIZE(da850_evm_tl_leds), o# r1 L5 j, j$ r1 X% y
};1 y# h$ \6 K- u6 X
1 Y$ z. S" l) q7 M7 E0 g
static void led_dev_release(struct device *dev)$ |; Q3 h0 Q- M V
{% H0 F$ l/ Y! F. i; `# R! e
};
3 r9 B* N, N1 b" u! r% T% i! ~- l
. s% g& } e- Y/ Hstatic struct platform_device da850_evm_tl_leds_device = {/ W$ b9 \% u- ^& \) m
.name = "leds-gpio",* D' s' }+ G, N. Q
.id = 1,
. e" R/ M1 B. Y2 i* \ .dev = {
: ]) b7 e( J; h0 t0 y1 n: p .platform_data = &da850_evm_tl_leds_pdata,
) @5 j5 f- u- ]* W$ m' A6 U4 E% z .release = led_dev_release,
$ q* r3 K! [" ?% `4 S1 {! B5 i1 \, k }
# ^( o' V. v0 K" ?};1 X- x3 Z7 y% H2 w& F
0 M; R: e g1 h% U2 ~1 K3 sstatic int __init led_platform_init(void)1 x+ X1 K( R& D9 E9 d. n' X& y
{
, ~# y! {4 a3 _; W9 y, B int ret;1 ]2 m. T/ w6 r5 B
#if 0 o9 n8 R9 Z* z! h0 P: j
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);! L" S& X5 \) D; O
if (ret)
8 b* P2 M4 k0 b6 G: Y* u7 W- @ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 l+ l& i* R5 c1 @6 J1 B; e3 a5 f
"%d\n", ret);
) K1 F* g* O! F4 K" Y#endif
) [, T C \9 @: T, ^ ret = platform_device_register(&da850_evm_tl_leds_device);
1 Z2 K% s% E( b7 z" h" O! _4 v& d( n if (ret)2 C% V& O U h% n
pr_warning("Could not register som GPIO expander LEDS");
$ p# D- o: I. y1 s g1 L else+ G: Z9 E, i* B, s
printk(KERN_INFO "LED register sucessful!\n");
* O% j* X4 t0 S! d, g3 G$ y& U1 A ^# w
return ret;9 t$ M8 E# ^+ `: O; P' d
}
5 E8 T; D: j( ^* s, L. g, ^" i2 z. S2 {, {8 C2 A2 t
static void __exit led_platform_exit(void)
* F# u- G; i5 L2 `) m$ g% D- x- ^{
# [5 i6 u k5 ?& v platform_device_unregister(&da850_evm_tl_leds_device);
/ S- @3 A% z/ ~, r: t7 q3 W
! x' P5 l6 p A$ H* Z printk(KERN_INFO "LED unregister!\n");: |( j& |" g/ t7 M! }2 f# f3 x
}& U7 o0 R/ ^4 [; m0 U4 R$ y2 x0 i) L( d
1 y+ Y( `: V0 q$ q. Hmodule_init(led_platform_init);
% i% Q W( W: _$ D5 A) ~module_exit(led_platform_exit);0 G5 Y, I( ^. v6 F7 [
& B% \2 t' N9 `- p# ? H4 v9 G
MODULE_DESCRIPTION("Led platform driver");* c6 w; Q) ^/ J" C; T
MODULE_AUTHOR("Tronlong");0 p; ]. L; K. F1 p
MODULE_LICENSE("GPL");
" y. p) m1 \! D7 H1 N ~
7 U7 ]' |! t% v. z" z: K8 A2 S+ \4 Z+ u |
|