|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! q8 U4 v: e1 {#include <linux/init.h>
3 _: S8 X: L! L; c2 ~2 s% h, K#include <linux/module.h>) ?/ u9 Z2 ]9 f, W# _' l$ t
#include <linux/kernel.h>
, G7 s: F; I6 Z8 o$ k6 X# P: ~#include <linux/types.h>
/ J6 x( p7 z( b+ B" t; O+ T#include <linux/gpio.h>' K0 {* q; n+ W1 R' {" E$ T* P
#include <linux/leds.h>& y/ ]' n2 `/ m+ D; W& Z
#include <linux/platform_device.h>; v l7 v# K2 h5 u8 J V$ N( y
0 `- a8 i' j0 l' m; B: F#include <asm/mach-types.h># D8 G* |7 u0 q$ y- W( `
#include <asm/mach/arch.h>
0 @4 K$ @2 u, f( r x. Y#include <mach/da8xx.h>
, t8 o" [, f( T( Z) W6 C#include <mach/mux.h>' X0 p0 {1 R- N/ _) n; t' P
! L, E3 m3 ]4 t n* {4 Q
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0), X5 [8 Z- y! T; b- t6 }$ i* }
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)0 R8 y. ^# Z- w' @4 k1 q
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
; B2 ]: ~. N6 d. J#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
: o5 L7 L" j {8 v" O* D- k0 U8 C/ |- c5 z6 W$ j3 n6 i+ b1 o
/* assign the tl som board LED-GPIOs*/
6 H% l! X1 k: e6 `* Xstatic const short da850_evm_tl_user_led_pins[] = {
8 A I- Y) U" s0 J) u /* These pins are definition at <mach/mux.h> file */
; d$ j- a. I2 K8 L9 E0 W9 Q4 N DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,( x! j: f" _8 S
-1# |0 z% t: w6 V2 A3 j/ W
};
$ q5 l9 Q+ R2 p# d& N" a* C# T3 l- E8 M! e, w% e; R9 q: A
static struct gpio_led da850_evm_tl_leds[] = {* Y4 S3 `+ q9 Q( e& a+ b* U' y4 |$ f
{9 i" }- F( N/ Z
.active_low = 0,+ n, l' ?; M; T6 _* r
.gpio = DA850_USER_LED0,
( R# A, a- u! U! \- y) }. @. J# c .name = "user_led0",
/ J# X2 h- U; V! K+ p& W3 Z; Y; d .default_trigger = "default-on",
* z3 |" `8 @) ]; ?( Y) I+ _* w },. b/ w7 i8 @4 v: N9 Y/ ] F4 s
{5 J9 H" O5 z1 b. o# X) I/ Y
.active_low = 0,2 H# I7 Q& }5 ~; U: w
.gpio = DA850_USER_LED1,
; m3 Z1 D6 a n# a9 O# s3 v .name = "user_led1",
/ q; y0 N6 D+ M, [ .default_trigger = "default-on",
6 Y/ Z9 A8 @$ X7 Z* s },
5 X* m& [9 y2 \4 C2 n7 L' l: i' g {
; h! {) [6 `, M8 u8 [' } z' o .active_low = 0,8 n2 w; i y6 R0 u
.gpio = DA850_USER_LED2,7 g# ^: F9 k8 u2 S2 f, y
.name = "user_led2",3 A6 x; _! m- ~$ b* ~4 h1 Y3 f; \
.default_trigger = "default-on",6 y$ R; t) A3 P# g* b' X
},
; o7 {8 r; R. v' k5 B% q7 L# B {
5 O: r3 B' w8 V .active_low = 0,7 y) {8 g/ k Q, Y5 n; m. ^; D& S& [
.gpio = DA850_USER_LED3,
) R5 O& \1 s( o" G .name = "user_led3",
# Y2 b8 H4 y& D7 X! P/ k .default_trigger = "default-on",: h+ B+ i5 L. h o" J, p) P
},
/ l3 F& O- b$ P- |4 s) V};
) W, F$ N6 u, @ l4 Q* [5 R) Q" k( E( Y% @* l; g/ u% }) z3 a
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {3 W& \* |. \7 r) x m0 A# d
.leds = da850_evm_tl_leds,
8 v( D$ [! W/ g9 v .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ ]1 X$ |- s7 J# p) H};; L2 r2 ]4 b6 G6 M9 p
0 P; L6 u" r0 Z/ Ystatic void led_dev_release(struct device *dev)
1 o8 E8 ~- I& R{
) F5 k& {( n) R};
! F6 b1 ^" ` i1 A1 F" k
& B" ?, W) i% ~- o, s0 estatic struct platform_device da850_evm_tl_leds_device = {$ ]2 K7 V6 ]& P. B
.name = "leds-gpio",2 ?8 q; [& C$ J% A! M: n" o1 F. a- L! {
.id = 1,
4 J9 [" D2 N* Z7 i1 u, w .dev = {, ^& G7 g2 i' z2 s: N! c; l, i
.platform_data = &da850_evm_tl_leds_pdata,
; u1 j g8 n& k9 Y5 \* R .release = led_dev_release,- x1 {0 g7 Q2 J2 n/ g
}
+ `! ^- Y- |; O* F; U};* ?7 c* Q" n, B0 L1 `
3 a' H+ v- b7 Z* k/ ^" \
static int __init led_platform_init(void)* U- C3 ^! [6 c3 X. p2 ]9 a
{! Z& o' C& m9 F. x: Q- d5 `
int ret;
" v& F; i; a/ ^: p# i#if 0
/ R+ [) C% {# i0 n ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
; m, A1 a; O- h4 ?4 K1 m if (ret)
: P0 ?& c2 {1 L4 V' L" F pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
8 c5 h5 z6 w7 B% H* t "%d\n", ret);
( d; ? Y( ^1 T+ E1 O4 U; p#endif
4 v8 Z2 P0 q; |" F ret = platform_device_register(&da850_evm_tl_leds_device);
1 O+ i4 V( Z. W" X& S2 W if (ret)
6 G7 U% g9 s' O7 F v pr_warning("Could not register som GPIO expander LEDS");% A3 f' f* w1 Y: A+ n: S
else
( c" P( \; q7 s; V/ j4 P printk(KERN_INFO "LED register sucessful!\n");
7 A* ~( D) D7 y4 m* y2 V2 Q( l. `3 V0 O; x5 @6 w( D% S% u
return ret;
5 O p6 G" O/ a" w' M}
: s8 \0 ]0 ^' o1 O" H- E' W' F$ l% Z+ V
static void __exit led_platform_exit(void)
/ ?7 n9 @- [0 w5 a [6 Y8 B{0 O/ z$ Z$ I' l! i+ h
platform_device_unregister(&da850_evm_tl_leds_device);
5 [- H/ e& w" X# I1 j! k3 c$ W k+ {3 D+ s }! ^
printk(KERN_INFO "LED unregister!\n");* @, P: B8 ~" z& ~4 n
}
: x0 H* _" H. ?! [
4 V" q+ n# N3 W& m2 R0 omodule_init(led_platform_init);
3 N) j% c: x3 d, \# Q+ Cmodule_exit(led_platform_exit);
0 U+ }! T! ]3 P- ]6 [" ^1 g( u4 A# `' j o4 e8 F
MODULE_DESCRIPTION("Led platform driver");+ G2 m& t3 y0 j9 f+ ~1 ~3 A
MODULE_AUTHOR("Tronlong");
0 K9 |7 V% e4 Z: }1 L/ A% P0 x p2 f( C6 j% DMODULE_LICENSE("GPL");( `0 w7 L( G9 i( c$ n6 [
/ _5 P1 e3 L8 [ ^
|
|