|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! P+ g' v) ^. R; {#include <linux/init.h>& L7 M* ?; t8 Q0 d: {
#include <linux/module.h> [0 A6 w D% ^
#include <linux/kernel.h>
4 R( {) E2 E2 T9 Z3 l7 D#include <linux/types.h>. h% [3 u& V6 M3 u% S$ F% Y
#include <linux/gpio.h>3 x+ r1 x& S8 {1 C) ^: U3 N( K* Q* T1 O
#include <linux/leds.h>
7 L+ G* x2 p. f* W3 q& {+ c#include <linux/platform_device.h>* q3 W1 z$ B4 r8 z! M+ }
0 E/ h; P+ ]$ D2 c#include <asm/mach-types.h>
5 ^+ {$ D$ m- s5 D/ ^( g. F6 f4 X6 F#include <asm/mach/arch.h>
7 o3 ~$ L! U8 l8 F" C+ d#include <mach/da8xx.h>! H& m. v! x" k2 p" `* p" s
#include <mach/mux.h>
# B, ~9 S7 v. B% B. G5 H& P& x ?$ B" W" U! U0 T J
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
5 n" x- e) _7 I#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)9 w" v/ t$ a5 Q7 K& c" B& H5 D
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! `- v; o* x5 l0 Q* D& A
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 ?8 `" K3 k: D2 ~& L0 J
% P5 v/ K6 J* Q; E; _/* assign the tl som board LED-GPIOs*/6 S2 ^1 z9 t- Z/ U3 W* u
static const short da850_evm_tl_user_led_pins[] = {
+ `3 q Y U' n( T /* These pins are definition at <mach/mux.h> file */& D" o; W& G" X9 u3 k
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 i! ~* V4 R6 v% r% B -1% C% y6 P2 p/ I4 l9 r
};0 r3 l0 l2 r3 i8 d4 u$ ~
* a. C# R7 F1 C# mstatic struct gpio_led da850_evm_tl_leds[] = {
- `/ @+ u: K# ~0 ? {
" X; |4 |' b) C! o/ D" P .active_low = 0,3 C, }5 X! d O. O$ d$ ^
.gpio = DA850_USER_LED0,
1 S+ O4 n# l4 @* G8 @% Z; T/ f" b .name = "user_led0",+ E- u- t7 c. R% p j* I; f5 @5 I* i
.default_trigger = "default-on",1 p6 \) _; V# L2 W
},
9 }0 }3 z; L9 O9 o2 ?' d {$ P* D! Y8 i' _- A6 k, C
.active_low = 0,
$ f) o6 @7 a ^5 S5 E+ D, {4 Q .gpio = DA850_USER_LED1,
9 G T d% P. W, \" v6 n% ^( O .name = "user_led1",% F: w6 \+ U/ F# m
.default_trigger = "default-on",
) |% ~8 v/ h7 f( X" @4 l },
! n% U2 I5 o1 @/ z! u# g {* i/ K+ @! o6 A. v( T
.active_low = 0,
7 F5 `' r5 t/ W V |6 p4 P. P .gpio = DA850_USER_LED2,
6 a* K( M" Y# W6 H; A .name = "user_led2",, }0 k8 X' B' `
.default_trigger = "default-on",
, u2 b5 k' p# o7 D },
$ K5 Y% k7 A, I, W" e7 S {; M3 ]# Q, Z- n; l+ N
.active_low = 0,
) O1 i4 e$ B. |/ O$ I .gpio = DA850_USER_LED3,3 y& I, T! T2 `' s/ G
.name = "user_led3",
% s) d( R# e+ h D# l .default_trigger = "default-on",
' [9 u- K+ p0 v Q },# J7 K2 d D3 J/ O/ i8 Y
}; U, e: `. P# A2 o% @2 P$ `1 n
- c1 i4 ]& F1 e6 n" [
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ \% U! `9 Z# ?, S
.leds = da850_evm_tl_leds,# t, i6 ?* p' _4 F6 e G
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),% {: z5 t: e9 J) K4 Y0 Q" Y" G
};5 a) A. X6 A3 G' Y5 g8 g
7 y6 v0 F2 i6 E3 l
static void led_dev_release(struct device *dev)
Z4 D1 o1 U" b7 g" D- C# B/ t{7 j. @2 \4 _ z0 I0 K
};9 u) k4 r; R% Y' b/ c7 j$ _
* x* d& s8 }6 |$ Z* L
static struct platform_device da850_evm_tl_leds_device = {
; D5 h; z9 Y- {, K .name = "leds-gpio",
1 A4 r' G/ w3 k* d! n! g6 M .id = 1,; |' U: P& g" E& T$ M, x+ {/ g4 x
.dev = {
$ c9 J: w8 M+ r8 P! L O9 N .platform_data = &da850_evm_tl_leds_pdata,
9 C- z+ Y9 Q6 d1 I .release = led_dev_release,
3 [- O w( n- S8 @. Y }* t; `" W# |. c; Z& }- {
};
; E2 @8 Y. j2 |) l! ^$ V% t% s, w0 ?5 a
static int __init led_platform_init(void), I7 c, N3 D$ H, h/ B5 ]* V
{
; t4 i8 D+ d! L; D2 t# m int ret;7 ?- [ D X$ ]$ m: C5 J' d7 ^
#if 05 M/ U' p) j( Q9 v
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 Q/ u7 k% L& [' E* t6 \" q& Y+ W- D if (ret)
# G6 Y+ d9 J1 R& t pr_warning("da850_evm_tl_leds_init : User LED mux failed :"( I4 X- v3 p: t9 b1 J
"%d\n", ret);( ?6 i2 x9 y' D* s$ c
#endif
% b* |4 z- }/ g, ^ ret = platform_device_register(&da850_evm_tl_leds_device);
9 D+ ~; M" Z" l: X6 T( t if (ret)6 V4 i% f" }/ L Q- g, C# T
pr_warning("Could not register som GPIO expander LEDS");! K; O' L, R3 r7 X' r
else
. T$ Y$ S" J | C# U5 B5 } printk(KERN_INFO "LED register sucessful!\n");% u; j3 d) Z0 D- @6 i
/ N) c; F& f2 |; ^. w6 E/ H return ret;" Z4 H& i1 c1 r5 i9 H* C$ E. k
}3 q! {" c, O7 Z
0 F4 j. Q+ ^! S" [4 k- `
static void __exit led_platform_exit(void), l0 _: h; t9 k; q
{% e6 h; ?1 H/ R6 F2 l/ X$ W1 X C3 y
platform_device_unregister(&da850_evm_tl_leds_device);" r7 `! J4 N) R7 v
2 r% t* Y) ] o+ E( t1 | printk(KERN_INFO "LED unregister!\n");. q3 o% m- ?) E# o f3 a
}" [3 F8 ~. `2 S6 e5 R
' _, c) x' l! B: d+ o3 W
module_init(led_platform_init);+ P/ I& o x' q8 v/ _
module_exit(led_platform_exit);
3 Q( Z# @" `6 y Q3 W! y9 I0 `* T; v6 m
MODULE_DESCRIPTION("Led platform driver");
& _. d" X' l- f: K9 u4 |( NMODULE_AUTHOR("Tronlong");+ Z7 p9 | w( N6 C& p! b
MODULE_LICENSE("GPL");
+ i1 B2 K& e# F2 \6 d% a" R
0 z3 Y8 h) J! V |
|