|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
- D) N- n5 L/ y4 K#include <linux/init.h>2 Z0 w: ~- o& L, I- l8 I
#include <linux/module.h>8 [8 U/ b5 o4 i
#include <linux/kernel.h>7 u+ O# G: L, P9 s; U* m
#include <linux/types.h>( i2 _1 F' r- n2 H. N7 `0 f
#include <linux/gpio.h>* w! t/ F+ U7 h+ A8 G6 G
#include <linux/leds.h>/ L: K0 F7 p# J, r2 L& D
#include <linux/platform_device.h>. P1 g3 c6 U4 b* f& n, e
. z2 j4 w$ m4 I- U% p
#include <asm/mach-types.h>) A& X+ S' a+ z7 w9 B$ }
#include <asm/mach/arch.h>
( K" l, P3 l1 u4 @( C; X! T x#include <mach/da8xx.h>" ?/ `: n* a( J4 Q: Z9 t
#include <mach/mux.h>
" s. E- f% R1 i. ?( V) }8 `9 u b" _, m8 l* O0 _
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)) x* `' K4 N0 h, Y7 I& k3 q* @
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
% M* D- Q& p' H+ _2 }- w( m- A7 z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
+ ^. {+ }: {9 _3 V; X& D- d#define DA850_USER_LED3 GPIO_TO_PIN(0, 2). g0 ^/ W/ i" t" d: W- d
, x! r/ x( I( O* _& \& k( X+ Z/* assign the tl som board LED-GPIOs*/) M5 y# |( s5 A/ h: |5 R
static const short da850_evm_tl_user_led_pins[] = {* p3 `: Z- j. o
/* These pins are definition at <mach/mux.h> file */
/ u$ j- z% R1 z4 ?$ V4 ? DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,9 h% s8 f% v$ _, k" p' A
-1
9 {' d; C% M0 d& [' E};
+ |$ r6 u G2 |7 w" n4 e6 j- H0 i1 H5 w4 B6 d( Y
static struct gpio_led da850_evm_tl_leds[] = {
0 T4 ]: p# R* N3 } P3 g {
# M' t) G6 l6 }- X* c .active_low = 0,
- f2 w! m3 m# a" k: _* b6 e .gpio = DA850_USER_LED0,) ^! j& A4 n/ O) j. U
.name = "user_led0",6 c4 _: T: k7 m# z. K8 @0 |
.default_trigger = "default-on",, m$ l6 l! W0 p) q3 ~5 t
}, k! b2 I- t- g! j; I8 l1 f
{
J' F7 H. f- C .active_low = 0," O+ G1 m* D2 e$ ~ _: j% z
.gpio = DA850_USER_LED1,, g1 P7 p( M; w+ j x; L `2 b
.name = "user_led1",% G$ f$ b9 u* R: r. v
.default_trigger = "default-on",5 z" p2 \* w2 p7 u
},0 K1 Y# Y( n5 {/ U
{
; ^/ e! h9 }/ f2 H .active_low = 0,
3 u2 g7 d" i, S- n( m .gpio = DA850_USER_LED2,
1 O9 i( ?8 e9 B4 B# K6 H6 ] .name = "user_led2",4 L0 s# k o+ ~4 c! A, Z6 A
.default_trigger = "default-on",
! V0 \' D- s$ v9 R7 D7 }) w' h },( G4 u2 W# v; q. S4 i/ g9 i- j
{
4 F6 e, }: d* }, e1 W9 i .active_low = 0,
. F# a; P5 ]% s, L' o .gpio = DA850_USER_LED3,
* R n' @* |& N- {& s .name = "user_led3",
* b) w' } N* ?- R8 V( A1 | .default_trigger = "default-on",' \: _' J2 o0 N2 ?! x
}," Y* }/ D% P/ q! e
};6 h2 z0 ^- W* o$ e& C5 C# T4 \
/ L2 B6 H/ h& f. X* s) I
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {6 f2 `4 \; j" M) m3 F" ^
.leds = da850_evm_tl_leds,
( o2 s: q! [" _; d! b .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 W7 k! P7 F* s/ w( ~2 ?
};# E7 y) A. r# V
# E3 k7 g' R9 e. i
static void led_dev_release(struct device *dev) V' {( y o. C# W: C9 U% _
{
9 K0 ~( Y2 ~. @/ i};
0 e& Q4 w3 M7 S- |5 P# W: U
: a$ X& p# y7 J- y8 ]static struct platform_device da850_evm_tl_leds_device = {+ K W1 d$ Z' c! k1 o
.name = "leds-gpio",1 I) N% |7 D8 k. E
.id = 1,
4 R5 _# G+ ^' K0 x* R8 B .dev = {# p% i, `( ~4 ~+ n
.platform_data = &da850_evm_tl_leds_pdata,
1 N* i, B+ ?) p7 L) k( M .release = led_dev_release,
7 u8 C5 k- T! B" y1 i4 b }
6 n( y/ t- p- X) T A};
3 T, L0 G0 Y- k) U% }# N
; L9 U. u6 t R2 B4 cstatic int __init led_platform_init(void)
+ T! }% V& L# |{
1 x7 j' ~& V& M int ret;
& I4 q& m8 N+ u: G( i#if 0 K5 y" x/ H9 T( d' k
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 D' p3 @ V" a2 ?& m
if (ret)
; e9 X1 X9 T" {6 w }- @ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"% n( R, j% W9 L g( |; k
"%d\n", ret);
4 z% B: J8 |. m {#endif
6 o( S9 c. a. b$ P0 G/ m+ A) j; h ret = platform_device_register(&da850_evm_tl_leds_device);
6 I+ z" o: J; k8 ^! E if (ret)$ P9 y6 O+ L& c% _4 K
pr_warning("Could not register som GPIO expander LEDS");- C5 d' A% Y8 `+ z7 M
else; ^& S& a H! W
printk(KERN_INFO "LED register sucessful!\n");& ^2 P9 W# c. t3 B7 E
% X" A* A* D, h7 y
return ret;6 H* c7 R2 D9 E3 r0 j1 L; e2 G0 Z6 z
}
! q. ^- G* w) Q5 K3 Y2 W' f( Y7 ^6 n4 S; o$ r
static void __exit led_platform_exit(void)
" r- t; H5 ~0 w& q. @' [* B{
2 A3 g( _9 v. |8 `# m$ C platform_device_unregister(&da850_evm_tl_leds_device);
$ |! ~5 H: G7 q: C, L- u$ n5 s
0 F! c2 S% @5 T6 t5 u9 b printk(KERN_INFO "LED unregister!\n");3 \, J$ C4 r& P! N! l% F# v( j3 x
}/ ^! P' j5 ]' W r2 u% z) z
- I( F# B* o) t+ ?& w/ o6 gmodule_init(led_platform_init);
2 X7 J& p" |5 U* Q. `- Y2 nmodule_exit(led_platform_exit);+ u6 R3 y" k2 {% q+ a! i! U# |* k
2 V& z1 q2 B( P- ]6 d8 Z7 g
MODULE_DESCRIPTION("Led platform driver");
- G4 b' p. g, N( jMODULE_AUTHOR("Tronlong");
, E. b" U$ j+ S. n6 bMODULE_LICENSE("GPL");
6 S. t, j/ }" ]8 c& s! C3 u
: Z' O; M0 c8 i. I/ W& b, B Y |
|