|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; i0 A( m, B0 R7 I7 E0 I/ J
#include <linux/init.h>! K1 g5 I2 J3 O5 X
#include <linux/module.h>* F8 e6 f& _0 F B
#include <linux/kernel.h>7 s" \8 p! [5 l- p1 j9 ^ C" l8 B
#include <linux/types.h>
/ D& N5 m5 y W$ f/ \; D#include <linux/gpio.h>4 U& X# \4 A" B" Y K% b8 q0 c
#include <linux/leds.h>
0 Z2 b, p6 {, O% q$ X1 l#include <linux/platform_device.h>
/ W) `# G; ]2 F% R! U9 Y) ]' k9 v9 V
#include <asm/mach-types.h>
+ ?; V* N5 V' ]. S1 J; I( B* Q+ _, H#include <asm/mach/arch.h>
3 L3 j, s. B9 n" L& |' `#include <mach/da8xx.h>5 P7 |' c; F% O# D9 W( A
#include <mach/mux.h>
/ Y4 |" L/ @! }0 j6 ~
K) Y: f8 r8 z% B#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
+ i- y6 w, X' M) M/ h: f. H#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
6 T* ?- ?; I* w7 H% J" m0 U0 }#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
. O7 f' F" y0 q' s w7 Z' W! s$ G: S- w#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
! h2 R5 Q9 F# D' q! H3 H! H3 y+ n! Y' @: O. w7 q7 a% Q5 [* H
/* assign the tl som board LED-GPIOs*/
9 C }2 E/ @! q; |9 p; vstatic const short da850_evm_tl_user_led_pins[] = {
: X C1 U3 {" N8 p6 J [ /* These pins are definition at <mach/mux.h> file */
% o' \+ P) R! c8 W# g# S DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,3 D: C) ]% i" }* S N# Z
-15 Q* Z# ?7 h8 H e
};
6 D! h3 K0 \( s# m/ u. ] v& Q2 {. V
static struct gpio_led da850_evm_tl_leds[] = {
1 U5 _4 ~0 J5 |5 Q. m) p1 P {
% }3 H3 P6 f3 k0 I% O8 W* U; r. R% Z .active_low = 0,
f; X* t& O7 B" r* X2 m .gpio = DA850_USER_LED0,
3 k8 k6 J0 q; f# b) g .name = "user_led0",3 F) \& K% D8 P4 F K+ b g
.default_trigger = "default-on",
. z0 O6 m& l& ] },
! h8 z! y: z/ |+ P6 I2 c {
% G0 e3 f$ k5 m; X% J; S8 ] .active_low = 0,
0 Y) I) G U! z/ r0 c( J .gpio = DA850_USER_LED1,$ f# l# h! ?% {! f
.name = "user_led1",
5 x0 B& L+ ]( G# ?! ` .default_trigger = "default-on", v5 W, j) @9 s+ |: d+ d- V
},4 {, v$ p F5 W5 g
{" S8 T0 E4 B- q: j& j3 H h" o; e4 H
.active_low = 0,
! j( B3 y" P l# L .gpio = DA850_USER_LED2,
# i) q/ Z: P! i/ f* Z# x) y. B' ^ .name = "user_led2",
! O% b' U8 C r- U/ U: ~ .default_trigger = "default-on",, P) Y; _* t: p. J% F# D! D
},
' r) u: w0 s3 G* { {( h+ c1 `: c8 ~+ [; {$ a7 p: m
.active_low = 0,
' S) |- v4 D# q9 ]0 L# G .gpio = DA850_USER_LED3,% k( u$ q; w8 M6 C7 v
.name = "user_led3",0 @* g& M% @" T9 [' W$ o, ]4 g0 i/ S
.default_trigger = "default-on",2 r0 G+ z% ~2 A! k! ^4 s& s! ?+ f
},
8 R4 w4 c' [% ^2 {};
G+ t+ ]' Y4 c
# F7 O$ A& N( X9 r" z0 ~3 I7 @static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
# K4 A6 z4 P3 y' o* Y5 r0 z .leds = da850_evm_tl_leds," p) j0 m; O* o/ O- N
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
p& G2 X0 m% R5 D4 i$ _% Y};7 o# U( a4 q p$ g$ k. B
: h9 l9 a0 ]2 P" e6 a6 Ustatic void led_dev_release(struct device *dev)
; ~, g$ t6 }5 a7 F{4 | x1 c+ O+ }1 {$ Y6 }' ^2 H
};
: ~! w5 ?. Y) A, I! j1 X
# x ~+ X; e) k7 z# |) rstatic struct platform_device da850_evm_tl_leds_device = {
1 D& g9 q% y$ W( ` .name = "leds-gpio",
F# R9 Z \( \/ q' B .id = 1,
( Z& L2 [5 e9 Q( d9 k* o h5 L' L .dev = {
- ?* w* g4 O4 }) K1 { .platform_data = &da850_evm_tl_leds_pdata,
& @5 Z& b0 C/ {* j .release = led_dev_release,7 y2 U2 l5 h! Z% ? {; y, s
}4 g. q& q2 v8 Q( M8 t, D
};% V! t+ A7 f0 f# F! O- K6 |8 X
# \$ e& N* W7 Q+ T2 Y) y
static int __init led_platform_init(void)9 W7 Q" X1 _/ Y
{
# `& Y8 J5 M8 W2 R# m6 d int ret;4 ~! C; P% W8 r" U }3 m7 N X
#if 0. b/ E. W. O0 t E9 i% n
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 I& M" u! g- h' G9 i
if (ret)
2 f; i) T8 ^" u) t# m pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 b% l8 s Q# U, C
"%d\n", ret);
+ q- _ s) L7 H#endif; x9 j }/ j# y- u0 Q( c( f+ e
ret = platform_device_register(&da850_evm_tl_leds_device);
/ ?% f- s" _. [# Q% J+ A7 U if (ret). X* L5 r% D5 ]. ~% c
pr_warning("Could not register som GPIO expander LEDS");
+ M' H" I3 q- L q3 F) G else% d. ^! V G4 o+ q* N" S0 I
printk(KERN_INFO "LED register sucessful!\n");
3 g* e- W# a( c/ r3 U$ w2 h J8 G$ d1 U) |5 Q5 w/ d
return ret;& @- x- a x% X. d/ b& S
}# l( N, H) y9 M" {' y
, P6 s" l I1 h/ Z. K" V$ q
static void __exit led_platform_exit(void)
, c; y& N% c8 d! X: c4 B1 {# ?{
+ V: J' C9 T1 p6 o! M- `- y# { platform_device_unregister(&da850_evm_tl_leds_device);
) d) C; }' h( `$ O6 e) f: p# Q8 L; M) f; \: O7 u/ S/ w2 `
printk(KERN_INFO "LED unregister!\n");% n+ V' h, I u7 k6 K( }7 p6 d
}
1 z/ M! `3 E5 k2 _' X
$ h# j/ X4 [3 {module_init(led_platform_init);
) `$ U0 c8 w1 [+ h% R9 x* m1 X6 i" Bmodule_exit(led_platform_exit);
1 p3 d3 z4 I, z3 U2 {4 s: J5 Z( k
3 a# v: k' x7 U" O, \) YMODULE_DESCRIPTION("Led platform driver");. ?( z! I& T: B- b4 T4 s
MODULE_AUTHOR("Tronlong");' c" z; j6 ~$ B- r
MODULE_LICENSE("GPL");
5 z3 s/ M' B5 v1 r. e, Y W$ F" e! |+ F
|
|