|
|
求大神给下面的程序做注解,请稍详细些,谢谢。# u) U9 ?, G2 f7 x. H4 {
#include <linux/init.h>
: b( G& H9 O' H8 v2 v1 Y4 S#include <linux/module.h>
& C/ f$ b' n1 y% H#include <linux/kernel.h>* d1 L+ Y, j) I) }
#include <linux/types.h>. x9 W0 A" j% F
#include <linux/gpio.h>
, p5 \2 a: C( R) T& e9 K1 b#include <linux/leds.h>$ J4 h% G8 M( K6 q& C5 ^& B
#include <linux/platform_device.h>
# e* H/ T" b! v2 _! y! P" K
' \ V) Y# T* S' V7 |+ ?#include <asm/mach-types.h>
5 E! W0 `' Q- j#include <asm/mach/arch.h>/ ]- }2 `! u8 g1 {* u- s' k
#include <mach/da8xx.h>
6 |2 I3 k5 [# @+ k2 j- [#include <mach/mux.h>
5 @, s4 M# `* J* {( \' p0 J2 Q2 g8 Y) S( U$ f
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 z' j4 w \! w1 |. g. x* j* y#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 X _% O% F$ O1 B" x#define DA850_USER_LED2 GPIO_TO_PIN(0, 1): q$ W0 p% ?9 g
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; `9 {2 h/ [! }0 w: Y
. c: h5 u: I8 m/ k4 v5 o/* assign the tl som board LED-GPIOs*/$ w, h/ U, |7 u2 `0 q. l
static const short da850_evm_tl_user_led_pins[] = {
' N0 x: V8 @- W0 [ /* These pins are definition at <mach/mux.h> file */; C. b9 W$ M* X
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,# \" l) N( L3 ^5 ?+ o2 |% e
-1
, W- v1 U5 O6 A6 |) F( w5 C};
9 E1 z7 D( b0 r; c0 _/ B: O: a; o$ }. v e3 h
static struct gpio_led da850_evm_tl_leds[] = {
+ L0 p. K8 a0 A% `$ e {3 \. h9 D6 e/ T9 ?5 V0 H; }0 H# ^
.active_low = 0," u, L) D/ y: Y
.gpio = DA850_USER_LED0,
& P+ K8 }. K0 s9 o) K .name = "user_led0",
( r1 e5 a) g) F0 H' p .default_trigger = "default-on",3 Y2 [6 o# V7 x+ A& n, r _( o
},
: }8 p+ ~; g; { i, E' D {
2 i. P3 \+ j" }9 \, [1 Z .active_low = 0,5 ~+ b$ s; Q) f+ G
.gpio = DA850_USER_LED1,
% T3 g0 E. F8 |% u .name = "user_led1",! r, J( @/ L1 \ [: r2 Y
.default_trigger = "default-on",
$ t+ ], s m$ q, n' X! I },: r7 L& Q$ X$ U9 t+ u
{1 \( U# q6 Y+ h
.active_low = 0,
2 _( g0 T* G. u* ] .gpio = DA850_USER_LED2," h. F8 \6 l. m. V/ X$ L
.name = "user_led2",# ~# {. z! _; \" H- z4 C/ K
.default_trigger = "default-on",
" |( ~1 K1 ^. ]6 Y$ g) k },
+ l* u( R, x1 K# v. X, ? {
. M; G. H# z' R. F .active_low = 0,. u! } \6 r* @! v% B
.gpio = DA850_USER_LED3,$ @9 l6 g# B8 l) R' p$ B
.name = "user_led3",
. `5 u, ^ W; c( q6 s" H! X .default_trigger = "default-on",% ^1 C5 m% q$ K
},) [. J/ g/ S- m/ \0 o
};
" x' Z' u- T7 }( q/ @. E, w5 i% \; n, |* s
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
' A/ @$ x, ^$ }! j( X6 B% @% j .leds = da850_evm_tl_leds," r( h2 F$ y2 V- U3 s3 p4 i6 o. T X
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 Q# y+ M! k3 q7 p4 @
};
1 H8 |) M6 H( p* e0 r5 e' r. j) F' q% j- A" S& B9 P$ y x" ]
static void led_dev_release(struct device *dev)
3 n$ b% g0 T Y* v- X{$ y8 X, s- |0 R5 l6 K- b! }
};. f0 K, H6 ~* ]- A, o
9 h! \) U3 f5 h+ o' I" u
static struct platform_device da850_evm_tl_leds_device = {7 W; P2 O- W' W3 N5 ]2 E% x
.name = "leds-gpio",
9 h9 N6 b2 w! b- s+ P8 x/ k .id = 1,
1 F0 _6 i% J) C: D( I4 b .dev = {
/ {1 \5 {1 z, ^ M3 ~# M* u3 H .platform_data = &da850_evm_tl_leds_pdata,
& P! A" n& o2 l1 ^/ f/ P$ p% A6 F .release = led_dev_release,
* |' }* g4 A* R" w }5 w0 X, P; G/ |! @
};
* ^* H6 {' `- u6 A8 q+ P6 `) X4 V
! x1 x8 P) \7 }; N+ Q) Dstatic int __init led_platform_init(void)
/ E" H$ F3 B2 w5 ]0 }{
: Q/ Q5 X$ y K1 E, M int ret;) R( m6 m; ^4 E. C4 Z
#if 0
, j6 N0 A. L1 J ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& }5 t/ G- m: q+ W! w if (ret)
3 W) k% J% ~" M pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
" ~. A9 R9 C2 x5 ~/ y$ D "%d\n", ret);
0 J( V( ]0 Z. k8 O& B#endif9 ^) U7 S" `2 f3 P% q6 v6 w- c
ret = platform_device_register(&da850_evm_tl_leds_device);9 ?7 n9 e9 ^" a
if (ret): o% n! X2 Q! ?$ @
pr_warning("Could not register som GPIO expander LEDS");3 Q& p$ O/ O/ r! f
else
" D( k4 ~, j+ O5 S% m0 w printk(KERN_INFO "LED register sucessful!\n");
. n6 l0 Q1 T. B- e3 q! R% s- v) b% |2 _
return ret;
3 m- v2 ?! E( u9 a}
5 f6 E* T; @! F$ ?
$ c0 s* B2 `5 L1 n4 t( _static void __exit led_platform_exit(void)
" j& q$ R8 }) G; J. v$ [; i! d& U5 i: |{) v0 ?+ x' a5 @3 J
platform_device_unregister(&da850_evm_tl_leds_device);
/ p5 ]8 ] Q, k9 ?$ b4 x
( {: x( Y( F9 h/ f printk(KERN_INFO "LED unregister!\n");
; A& M4 T, z2 Y/ b2 r$ j9 k# _3 F}
7 H2 }2 g6 |* k# c0 }% H9 O( t& e0 I" V" K# p9 Y0 M
module_init(led_platform_init);
/ m6 k( S$ _ wmodule_exit(led_platform_exit);
3 @& N) J% ^1 C# K& Y
4 v5 M% i7 c0 dMODULE_DESCRIPTION("Led platform driver");" [% j& V! L' U. C% a
MODULE_AUTHOR("Tronlong");& E: E( O4 }" ?3 m+ M
MODULE_LICENSE("GPL");
9 ]) Y3 h2 |* ^/ _+ C
2 f n% U0 D# i. M |
|