|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
- F. L; _$ Q/ H1 f' s#include <linux/init.h>
2 g% Q) @1 C3 z( H* }1 X#include <linux/module.h>* c4 J3 T% O/ P3 x( d: h+ | R! U
#include <linux/kernel.h>
+ E: g' v0 ?! C5 `5 _' z' m#include <linux/types.h>
2 Y, I% R0 I/ a% Z' Q o: a" v#include <linux/gpio.h>
& _) u5 s8 \) z9 b0 y% J. o. w6 w#include <linux/leds.h>- s. H: V4 q* }% ^4 Y& ]
#include <linux/platform_device.h>
0 d$ Z# _$ @- L" b8 l/ {7 a' v: Q" m! A& K' ]. |
#include <asm/mach-types.h>
1 |; | e# I( Z0 K" i j+ m#include <asm/mach/arch.h>
( l' [% n: S: z#include <mach/da8xx.h>. ~" D3 v; B- O0 p: c
#include <mach/mux.h>
/ a L$ {4 @9 g* G" j. @5 y* n5 C+ M' X
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)- E, {8 U5 }3 h) q4 D7 h; Q3 k
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)9 q: k, B. Q. X5 B8 J# U7 L0 h5 u
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! g$ i8 G1 n( B( d$ ~#define DA850_USER_LED3 GPIO_TO_PIN(0, 2), ]# W( R( F3 R" Y+ W* v
' F+ ~3 c* L' l( d
/* assign the tl som board LED-GPIOs*/" {! ]/ W" f# ?
static const short da850_evm_tl_user_led_pins[] = {. V3 A: Q0 p- V6 N6 f
/* These pins are definition at <mach/mux.h> file */( ^% Y9 {% P+ h' j1 m
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
~* X. a, g5 ]6 Y. Y5 O -13 ^7 U, p) r2 R+ ~4 L$ B
};
0 H& E& f3 L y6 d# u. N4 \, R0 C& c2 P
static struct gpio_led da850_evm_tl_leds[] = {; Z {0 p/ J& V, i" X/ Q
{
# X7 [& x: v5 D |8 I% ?7 B .active_low = 0,& e+ J& Q1 |/ }. K0 a2 D4 Q2 ~
.gpio = DA850_USER_LED0,# B; S5 a& P9 q9 m l: r# P0 E' Z. F9 m
.name = "user_led0",' `, y4 g; J+ a
.default_trigger = "default-on",* H& Y \# W& e" [; o# C! Q N( O
},
2 r7 ?) D# [( y {
6 h8 @' X- T$ J8 u2 ? .active_low = 0,8 R0 R7 n9 D* F& J9 W
.gpio = DA850_USER_LED1,
- Q# W6 Z* Y! C h! K .name = "user_led1"," q9 I6 X% k+ H: R
.default_trigger = "default-on",3 M6 k4 C j% N. `/ _* P3 R8 V
},
' e" R; y! N# |6 o8 g, |/ a& v/ W+ A6 p {/ Z' x, V7 ^9 e% @" `2 i! l
.active_low = 0,) c; Q6 X( C" @0 B7 H4 N! y
.gpio = DA850_USER_LED2,
1 A$ {- b( K: j1 l: _( T' |. E- o .name = "user_led2",6 f4 y+ K2 |9 x" f
.default_trigger = "default-on",
0 T! A3 g, v6 i- D2 ~' ^5 e4 x+ N },; y6 g- Y' U4 d
{
4 {& d* [, N: q& f% c& w .active_low = 0,8 a: G( J! N+ J; N
.gpio = DA850_USER_LED3,
1 ]3 k& N1 y' x5 u$ ]; J .name = "user_led3",* o8 F0 _# T3 F6 b
.default_trigger = "default-on",$ n5 I$ W8 a- Z# I5 [
},3 Z, a% d6 A/ ?0 x
};
0 J$ q. b$ o% K0 F) {+ m8 x& c3 g' n7 r7 Q- O4 k* G7 l
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
+ l7 y1 ^ M7 w4 F* R' G .leds = da850_evm_tl_leds,) Q$ [# k: K4 s( H
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
, X* l0 f, u! p' ?3 l9 ]};
3 D/ P( M* L0 ~! v. h6 e
# u) j: a5 J0 S# P3 A# {( Ystatic void led_dev_release(struct device *dev)' y- m* L! c, Y) ^- n# ~. P
{
6 u5 Z* _; p* ?$ Q/ d/ p};( c& F, r1 F0 T. ` I& u
& \; p- p6 M/ b3 W, s" I1 ]static struct platform_device da850_evm_tl_leds_device = {2 q, X& G" J0 ~4 \1 z
.name = "leds-gpio",8 d' D) F% g: M( ]1 J
.id = 1,: |1 ~9 g! G. [4 O d! w, m
.dev = {5 T& \/ H! W9 U$ c' g* d
.platform_data = &da850_evm_tl_leds_pdata,
0 Y- s" C* l k' _7 d: o4 e) h .release = led_dev_release,
9 W- g8 |7 |# D1 ~. E$ d }
8 _& H1 O% H! {; d};
' g/ S& z+ u2 f& _% G: s
" O8 s& x* ?, U: V! E% j2 u! d- F; Gstatic int __init led_platform_init(void)- r L" U- E/ X o, ]' l$ y( G6 a
{" W2 K0 ~8 S. ~7 Y/ c8 R/ J1 g
int ret;
$ O- x5 n) T+ i#if 0
+ B- l, ~. U g" q/ s! ]( ]5 \ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ y: T9 L% z4 t X5 K8 I$ d if (ret)
; l; k/ l; w1 x) _: y pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ w1 U( Z; [1 ^' M/ p% } Y
"%d\n", ret);, l% X& j6 @% u' z
#endif7 _+ R' l. Q0 C; X2 ~; U/ U
ret = platform_device_register(&da850_evm_tl_leds_device); c, p# g: V$ D" Z5 B
if (ret)
A" \' S# k0 ^ pr_warning("Could not register som GPIO expander LEDS");+ I- \7 J j/ s2 W9 w2 ~: ^+ O6 g
else9 P/ G( S t$ v
printk(KERN_INFO "LED register sucessful!\n");
% b/ Y" n$ C+ Y: W# x
5 L! e5 t# M. C& s return ret;5 M- }& N8 V& @% `1 n
}8 b4 t: w7 m( h9 ?4 P
2 `9 j8 c4 D+ G! J$ Ostatic void __exit led_platform_exit(void)- Y. Z6 v+ \9 Y. x( l
{
4 M- ]8 Y6 M" M) t6 }6 |2 ^ platform_device_unregister(&da850_evm_tl_leds_device);( ^9 {+ m$ b h5 H& J' }; o; W
( [$ z% k( M6 T% C" Y& a printk(KERN_INFO "LED unregister!\n");; } s1 b( y) @3 A# ~- R* W$ D
}
# d$ j0 u P$ L, B; q6 ?
8 m/ G" X" q- u8 [. Pmodule_init(led_platform_init);, W7 q( n5 d+ u% D+ s
module_exit(led_platform_exit);
# C" m3 B8 }* U b' L! y9 e
6 s6 _' p- I6 ~# ]2 @8 q* uMODULE_DESCRIPTION("Led platform driver");
, i+ T: v& ?1 {3 g& G* JMODULE_AUTHOR("Tronlong");7 P( a5 [+ r7 a6 J* {8 K
MODULE_LICENSE("GPL");
3 j+ f/ d" {% k: c! E2 ?1 U1 N+ r8 M5 S+ r: G `: z
|
|