|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 N0 m5 d a( r% g5 z, `9 M- W#include <linux/init.h>
) M, V& w4 q8 z/ D#include <linux/module.h>" i% l U9 p6 v; g! o
#include <linux/kernel.h>! e, F |8 L( ^2 L
#include <linux/types.h>* `5 ~& v4 m9 s0 @7 F0 o0 }( c g
#include <linux/gpio.h>9 u' ?2 I$ b2 t4 r4 N |
#include <linux/leds.h>
2 S) a$ i8 x" ]" |' i7 \. ~#include <linux/platform_device.h>
- C- W6 T7 F: l/ g% I: K! \+ q5 V: v. I
#include <asm/mach-types.h> ?/ K1 X4 M0 ~% K/ z) o/ j1 G, s
#include <asm/mach/arch.h>
8 T G' D7 [) D8 O$ b- r$ j( P" t#include <mach/da8xx.h>
, g6 I; u* c, i) H! p0 J#include <mach/mux.h>
) v5 I# a8 w; {) m7 U
9 M. Y4 L2 _2 [$ T; ^! \' w#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% h+ K9 Y' t' v. ?
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)% q/ t; c7 y) K2 C
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ I7 x1 [! b; E8 t A& o#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
0 ]* l4 O& z) k# E, v _9 [6 l% }
/* assign the tl som board LED-GPIOs*/
\; p7 y2 C! `3 Fstatic const short da850_evm_tl_user_led_pins[] = {
, }$ P& d' `) L /* These pins are definition at <mach/mux.h> file */$ @: m" t/ r+ B9 I
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,/ y G0 t! ~ s( Q
-1
( S2 D p2 @4 {% q7 w: d};% G1 u& [% M* h* \2 {3 h
& z4 `) _/ R+ u) d8 u6 Y
static struct gpio_led da850_evm_tl_leds[] = {
; z0 A1 r7 M* _+ Q7 {! i {- `4 M4 Y: d* ]; \3 t
.active_low = 0,8 q& u. `8 F1 o" V
.gpio = DA850_USER_LED0,1 W( S& h" e3 l5 }3 n$ ^" \- F
.name = "user_led0",
; i' \! f' O2 @6 X2 O .default_trigger = "default-on",
! d- a5 Z/ E: S! x' f },
6 b3 Z$ Q: ~/ ^6 _/ a! _( s! T! c {
+ D' k1 c$ \1 W4 _ .active_low = 0,; A+ A5 a+ q; _' U0 Z
.gpio = DA850_USER_LED1, Q) ~% V b( J2 Q! q- z
.name = "user_led1",! R8 k- A) M3 i
.default_trigger = "default-on",
1 @# r1 @) @8 t },
! U k' o3 x& ~# G {
" q# {1 k: G3 j, X2 ?+ p. y .active_low = 0,
; b' G7 e9 a M K1 E .gpio = DA850_USER_LED2,1 Q I4 r; H/ `) C# i
.name = "user_led2",
! I2 M2 N- N% u% `( x4 T3 i .default_trigger = "default-on",5 e/ X9 m) d% a. E$ }
},
M$ @$ c6 t& d! ]6 Q/ s {
8 d; ^/ v1 `+ F! Z6 Z7 C .active_low = 0,
. ?7 ?% n( }9 U5 G {; J .gpio = DA850_USER_LED3,. p# f) b. \% ^( ~8 N- ?4 V
.name = "user_led3",7 Z& D7 v/ x0 b8 h' r, q8 K8 K0 B
.default_trigger = "default-on",7 N7 b: @9 ~6 y8 k" c1 `
},5 h& E. s& q8 Z. n# e- B- X4 u
};) c6 u) O9 y* y2 L6 E2 I
, v6 g% t# u% p; X. sstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; q, Q q, X0 p8 z# w4 {0 a0 T/ N .leds = da850_evm_tl_leds,& Q9 Q9 P' ]' z+ }
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 e9 Y% c) w4 c- k ?
};8 n/ z; z1 ^- o7 }
! P4 S+ q6 [5 s. ]+ Lstatic void led_dev_release(struct device *dev)
4 {# \7 W3 Z7 g% C, t7 J) J3 m{
) u& `+ c3 n, F4 p. ^! ]/ C};
: H$ t0 ^' a7 V6 C$ Z8 M# `7 H m/ P+ P
static struct platform_device da850_evm_tl_leds_device = {
1 e- U' D( |; G .name = "leds-gpio",
0 o3 x' }. B; C; f3 P8 F/ [" j0 `6 D; _ .id = 1,
5 ?% Y2 z4 Q$ J$ X) N5 X .dev = {
9 t$ X: Q) N, ]# j3 ]$ |5 X k# X7 K .platform_data = &da850_evm_tl_leds_pdata,6 C% [3 b3 N7 a8 H6 j
.release = led_dev_release,& U1 J6 `2 f1 T, L1 S7 W6 W
}
4 h% N1 U, s" K. k. p3 W};
K% K) ?* {$ o% f, x# Y7 ~ w% W' B9 m2 X4 C1 z
static int __init led_platform_init(void)
& {$ [3 w; M8 S+ A{6 S, G- h! e' ~9 A J6 [. @7 N
int ret;
9 [$ Q; e2 i! ^* q" S* i#if 0
: M1 \" b: r' ?/ G5 r1 \- f ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
Q4 g4 d* b5 T0 ^: _3 H* n if (ret)" z* h; m2 {- J$ m, _$ l
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
# n- i' K4 ]) d* x) E "%d\n", ret);. j- ?( {2 |2 k
#endif7 I' F3 {% O C+ h
ret = platform_device_register(&da850_evm_tl_leds_device);
' H# e- K- L/ Z0 N7 y9 A/ r if (ret)
) u: r) g1 x9 @* d5 C- y, t8 @ pr_warning("Could not register som GPIO expander LEDS");
+ {' ?1 G5 |1 @' I; v else% M! k" G- }. _& `
printk(KERN_INFO "LED register sucessful!\n");
/ Q G' E% M& _3 U
1 b5 i, D) _9 X return ret;
9 Q/ R4 @3 Y! i% s7 |}3 H) V7 i; c8 T$ G0 l. J
+ {3 y6 G1 m2 [) g# nstatic void __exit led_platform_exit(void)( u- Z) p) j+ \. d. \3 j5 l, `! I
{- R: D: g7 H+ d# j4 _, y7 n! X
platform_device_unregister(&da850_evm_tl_leds_device);4 q9 R$ y5 o: n- g7 y: p5 k
: z+ M. D2 U& m* v I0 ~% e5 J printk(KERN_INFO "LED unregister!\n");9 M$ y- _% @4 E6 u; O: V
}7 g% r& ?$ g2 ]
9 ^7 L/ k }8 ?8 L# lmodule_init(led_platform_init);& u+ y8 x1 i2 j+ U6 a
module_exit(led_platform_exit);) b1 P- m+ h' ~9 X( g3 T, ?& Q; _
6 u( S1 Y4 H/ T+ C; v q. V
MODULE_DESCRIPTION("Led platform driver");
& d" K8 |8 A! d; k+ h, xMODULE_AUTHOR("Tronlong");! {8 `9 e4 {3 r. C, f5 O& S
MODULE_LICENSE("GPL");. A+ v2 L) c. A( I
4 x0 {+ ?2 i( V7 p |
|