|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ O$ ~* m. |/ Q8 X- c$ F3 P9 S) ?#include <linux/init.h>$ [" i) ] D% ]
#include <linux/module.h># f7 U% \* Y8 W7 d' Z
#include <linux/kernel.h>
( y: Q+ b7 T+ R/ A# {1 \9 r#include <linux/types.h>
% |& C2 ^* R! T l* O9 _. @" _% }#include <linux/gpio.h>& \7 o5 b( I" `. s1 y b9 {4 r
#include <linux/leds.h>7 H, d0 Z6 a* ~' ? c+ }: m
#include <linux/platform_device.h>
3 |1 {3 M" ~5 X+ W6 q) s! j* f0 P: b, q
#include <asm/mach-types.h>) K* }0 D0 L3 P& L D; C# |5 Z9 F
#include <asm/mach/arch.h>2 I3 V; E( C/ A7 _0 x# z
#include <mach/da8xx.h>
* L% E8 S" V( m, g#include <mach/mux.h>0 D F6 F( M; W7 A/ Z
, u9 N- m c1 D4 l) p/ t5 E#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 @9 ?4 q b! m8 i( \1 Q0 d1 W#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
' B( ~. x2 E* x#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)$ ]- i4 H( D4 \' U) S
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)1 w; q ?: A4 Q; N0 {
9 t/ ^, i |3 ~% B
/* assign the tl som board LED-GPIOs*/
3 U) c( \* E% bstatic const short da850_evm_tl_user_led_pins[] = { y; m7 y ~4 `* k' F
/* These pins are definition at <mach/mux.h> file */' X' m( y [2 ~" p) b+ \0 }
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' y1 [- I: w# _
-1
+ U3 T' |% n* C' `% Q9 L};+ O! l2 c; p/ K9 Q3 z! i& D" I
& \/ E! y0 u( X7 a( N
static struct gpio_led da850_evm_tl_leds[] = {' p! @5 |' W4 F$ F. q b
{+ x* v% `; }5 Q, E
.active_low = 0,
9 \- s5 I, @1 r) E& _1 m0 F6 R .gpio = DA850_USER_LED0,
7 j& ^% y" D7 Q( W: @8 B .name = "user_led0",
) D+ r# l" Z, `& D' ^$ K/ m# K .default_trigger = "default-on",8 S" i3 Z' m/ ]! S: t V
},
. i) h. E n8 c6 f' F) q {
" e5 N* j x1 O' ] .active_low = 0,
5 P* h2 w+ r; u1 O9 q1 w .gpio = DA850_USER_LED1,
+ q, T' J# B5 u d0 w8 K .name = "user_led1",
& }) V' ~! l0 \, A( x .default_trigger = "default-on",5 I8 k+ a1 R6 X, f7 u5 s. d
},! }3 n' e6 X+ ]0 T. p5 Y: b3 K
{
% h# `1 `4 W6 F* A( ]' F! q .active_low = 0, {( V9 N0 R9 W8 Y* ?8 H# _9 d
.gpio = DA850_USER_LED2,
7 T% m5 Q5 H: V1 F" ?+ f: u .name = "user_led2",! e0 j1 x Z! S( n# B2 b/ ~
.default_trigger = "default-on",
# h! g; X& O F4 X- W },1 p$ s4 Z1 r! y6 R6 I
{
+ V2 g7 v; E# N .active_low = 0,
5 D& b5 H G$ q$ U" a9 I3 f3 Y5 ? .gpio = DA850_USER_LED3,
$ j% [& R7 B' i- B) F .name = "user_led3",
, J- g( Y" [+ R; e .default_trigger = "default-on",) s9 v% s" y# w
},- o# v8 |# ^' q. i
};" F/ M$ y* V! r! K+ `
* Y% q& U% L/ cstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, d e' ?( W3 u .leds = da850_evm_tl_leds,
: X7 k* b9 x- w* d2 S .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
5 V5 `! y+ z$ o8 [1 T: q7 j};
( d w7 a& Z. ` C6 b i, `
8 e- A- s. D. u' \8 Gstatic void led_dev_release(struct device *dev)
' ~+ P( t! M2 J* M1 T! {" N{: [0 y7 ?7 v, e. @( R- D; L2 z
};( s* Q' G+ K7 `! p/ F, [
z! W: F- V. j3 ?4 y; J- t R
static struct platform_device da850_evm_tl_leds_device = {" B, Z' k* o+ F1 R. K5 L
.name = "leds-gpio",( f7 r7 r3 I% s4 h4 h1 b
.id = 1,
7 W4 a5 y: i3 q+ g) T4 d1 k" T .dev = {' b0 _8 _8 c3 u. |2 C5 q
.platform_data = &da850_evm_tl_leds_pdata,
( `$ l( s+ B% u, O .release = led_dev_release,
/ a; C& c5 I" z+ e | }2 E, h' c, F4 i* B1 _8 R- @
};* Q1 l H/ ~3 o7 v+ {
- {6 O7 V3 X- N/ J" v3 w7 estatic int __init led_platform_init(void)
6 \' T p, e1 r{
; P, c" V! z6 c int ret;% Z; u/ `' D, y5 u% {. w9 y
#if 01 @: q6 N; H L8 F# @) t
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ R. V0 F# A) B if (ret)
5 j$ F: P% y U, ]+ A, V) p pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ b$ G) R+ i# U* W7 J6 p
"%d\n", ret);
* o1 W1 N6 E3 Q' D3 @#endif. V# V6 ~( M" [; q7 L! `
ret = platform_device_register(&da850_evm_tl_leds_device);1 k( \5 u* K: _3 X9 j+ X
if (ret)
X O: z B$ v L" w- Q pr_warning("Could not register som GPIO expander LEDS");/ e& B2 D8 K/ D8 W: U$ D- E
else, U+ E5 r! N5 M7 n
printk(KERN_INFO "LED register sucessful!\n");! x6 }* [2 J. U3 d. A
1 w5 j9 f4 B* R
return ret;
: w% x' l4 h: h% O. R$ L- W2 |0 l}
% d9 e8 P; B7 g/ q p3 m9 [+ P7 U. J0 Y" `& n1 h7 n V
static void __exit led_platform_exit(void)
- P7 @! g* k. E{
. q, a2 f+ L. ]& q% p+ K% w platform_device_unregister(&da850_evm_tl_leds_device);+ C- ^. C, T; Q2 z/ W" h4 Y3 o
: u3 O* F0 Z$ e5 C2 g printk(KERN_INFO "LED unregister!\n");: s; K6 J. O6 a1 w1 y; m
}
9 @! B; D$ W8 i3 g4 I8 ?
; p/ d( H/ Q L+ c# h2 z: p( imodule_init(led_platform_init);8 }7 I: g" u* ^' w
module_exit(led_platform_exit);# l$ n/ m6 O) C' w
2 Z" N2 V( Y9 p8 FMODULE_DESCRIPTION("Led platform driver");
$ s( D) F7 N$ I! N9 ^MODULE_AUTHOR("Tronlong");
2 L2 X& s8 B: V8 G) o* XMODULE_LICENSE("GPL");
* w. @6 Q, c8 N3 e& h0 H7 `+ Y7 C" r7 i& q( [$ f7 ?' [
|
|