|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" f7 X# a: t- l) ]. R
#include <linux/init.h>
/ i) a U4 C# w0 l0 c0 v0 [0 r, ~#include <linux/module.h>
, @4 C% w5 N; @& u1 D; ~0 O" u$ t#include <linux/kernel.h>
/ T& C( z. A- X+ s) }#include <linux/types.h>" v7 q1 S7 a8 g. t# E
#include <linux/gpio.h>3 s8 n" v" `! D7 I- r
#include <linux/leds.h>8 z: h8 ]" g- i* ?% ^$ B
#include <linux/platform_device.h>, j1 A7 S' O- [; j
6 k* s8 u. ?: G, a
#include <asm/mach-types.h>' G% e. |, I* i
#include <asm/mach/arch.h>* P1 R0 M: a7 ?0 X) h: \
#include <mach/da8xx.h>
) S, `% U0 v9 t#include <mach/mux.h>
7 b" x$ p( L4 g& h0 L
7 Y! O+ X( ?" Q i+ V ]* Q- B5 g#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* g+ N* @! y5 k* U. W
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' C7 P3 ` f6 W& E) A$ Y
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! Y' t/ _2 I8 l" Y9 c2 Y#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# m$ T! Y; I2 d, r
# W } d$ q4 w% X/* assign the tl som board LED-GPIOs*/: m# u- M/ D" F) E3 R% G1 T2 N
static const short da850_evm_tl_user_led_pins[] = {" f# W. F8 S5 i# _; P/ x3 j
/* These pins are definition at <mach/mux.h> file */ i' U" h; `: T" }; |; d- `; a
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
! |% Y' \& H0 K6 v/ d1 N -17 Q% N( r0 M/ ~( q5 l
};; ?# g+ c a4 Q
9 u, d+ \, y" n& Astatic struct gpio_led da850_evm_tl_leds[] = {' e- w* G+ \3 W8 h% ^$ e
{8 A9 N- t0 k/ o5 |3 A
.active_low = 0,
5 c5 m6 |) G7 d$ D" g7 w+ {7 {2 ? .gpio = DA850_USER_LED0,# Q! ]( _; u6 T* w6 ~# `6 Y" h
.name = "user_led0",$ a- K: b2 E/ ?1 y0 ~" K
.default_trigger = "default-on",
. h6 U5 v1 r6 W# A, Z, F },
; Z: Q6 ^- D9 U/ r {1 z" E% w$ A! G& E' R/ p
.active_low = 0,
; P6 A3 \! T6 W# L% B* J .gpio = DA850_USER_LED1,( H; [9 T2 t5 O) h# q+ {
.name = "user_led1",7 @* E$ o! E7 h" A0 x5 b% I
.default_trigger = "default-on",' Q) L% T ]8 W4 q( m. H/ B
},; \* g) e8 k* c, o
{
( i! W& Q0 p% S& a .active_low = 0,/ C, ~1 l& J* g+ k
.gpio = DA850_USER_LED2,* B; P7 u; O7 d+ p5 [6 u- f
.name = "user_led2",
5 m, D* |% z4 W7 G) ]' }6 @6 ~ .default_trigger = "default-on",& G. A- K# L' @3 C& V# a
},
$ u; v4 ]9 a ? {3 B3 A4 @* q' V
.active_low = 0,
0 v' J& L: }0 x .gpio = DA850_USER_LED3,! j; ]6 ]8 v5 Q* Q5 V
.name = "user_led3",2 W5 [ @. r/ V% \
.default_trigger = "default-on",
# p0 y% s% L- B$ y8 F },$ D2 B7 ~# ~! i( q3 q$ R5 Y
};
; ?' M9 T- w! f/ j" ~
, S3 q3 f, [5 }/ z6 L- V9 e S Istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {# |! g, B1 g. _% o) ?; E) T
.leds = da850_evm_tl_leds,* n5 k5 s, o- \7 T
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
# b) F0 Z# X3 q3 y};
3 b( s5 c- T# F7 w( G/ A! J9 X2 o! c0 X2 |
static void led_dev_release(struct device *dev)" r2 z6 a: \/ ?9 t
{0 a6 N4 S! w$ Y, \0 \
};
- k9 \7 b& s {" ~7 O$ G' M
( q4 M( A5 c _3 J: Hstatic struct platform_device da850_evm_tl_leds_device = {+ D8 X* e: g/ K
.name = "leds-gpio",
+ {$ f! q" U7 b$ @6 ?' P5 |" _; f2 Y2 o .id = 1,# r, _: |6 u( `/ w. d
.dev = {
0 n- z: b$ C' C9 C; N- u) U* N- d, U) _6 p .platform_data = &da850_evm_tl_leds_pdata,
. {$ q' R8 a/ } m' K7 k& C .release = led_dev_release,) H# m+ ^( t. W7 y3 R9 |, F
}6 T A8 Y( j. H
}; Y, V! T- t# D2 Z5 I
: F5 N8 c0 ~# {$ Sstatic int __init led_platform_init(void)$ F) r" W% x% _& Q/ y) T( e
{& i) e! G& K! J
int ret;
' |( V: j5 p5 ^$ n2 s% {% L4 x4 S#if 0
1 q( c$ F& K9 h ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 n1 i, m. T# j" ]8 i+ h* N8 k if (ret)$ k9 i' U. @7 j6 }/ M- v
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ S( }1 `; `* h7 h% j "%d\n", ret);
/ [0 E) z! @+ L+ U2 S L#endif d& [, P5 H/ V2 n& M
ret = platform_device_register(&da850_evm_tl_leds_device);; A, E/ Z$ V6 R1 N! j# u, e F+ {% S
if (ret), G' q! T" f" L3 Y* u- g* T0 r. `5 J
pr_warning("Could not register som GPIO expander LEDS");
# e: w! D X9 U9 S9 K9 X else5 W; j5 i" C' Z* P r: m
printk(KERN_INFO "LED register sucessful!\n");
/ w ?8 v+ Q# [3 l- V8 V1 ~; K* ?, P7 P
return ret;
" A/ U& T1 ^+ [, [' s}
/ L, y2 z- Q, a% Z; O- Q4 g2 |0 T( W8 P7 F& F
static void __exit led_platform_exit(void)# j) M: q; q" x7 ~& |4 p! U4 G& U2 F( z
{
* r) q" v& x& k platform_device_unregister(&da850_evm_tl_leds_device);1 Y& M2 O% C% W8 c7 T( _
' R" V: |. o. T' Q printk(KERN_INFO "LED unregister!\n");$ o+ N( {9 H6 a, a' m* D
}- y R& a) d/ X9 V
8 q" e Z/ c2 s8 Y, d( H8 Ymodule_init(led_platform_init);
, m& n, |! Z8 u7 f1 k; ` lmodule_exit(led_platform_exit);
?0 }* ?+ ^5 e5 f
) `1 Y; Q. h3 H4 d9 lMODULE_DESCRIPTION("Led platform driver"); G1 q) W6 M9 F% E( Z! _
MODULE_AUTHOR("Tronlong");3 {* ]4 D" {' p
MODULE_LICENSE("GPL");# g d* M( V; f5 C9 R
@, [& c8 D, Q3 I3 H) V
|
|