|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% L: E- ~0 B8 Z4 E9 M
#include <linux/init.h>( C0 v" s9 [/ T, v! p
#include <linux/module.h>
; I. \7 C1 K5 N( ~( t. {9 k#include <linux/kernel.h>. p, N; W' ?* G8 h, e" Y4 W
#include <linux/types.h> ?" [" Z: w+ J9 [! o! R" H4 h
#include <linux/gpio.h>/ a) i. p1 `+ e% U" P
#include <linux/leds.h>
, H! v4 T3 M F" K8 {! N#include <linux/platform_device.h>
+ A2 [4 Z- f g/ o. B; I3 @3 D0 w. f& R. k }6 Y q
#include <asm/mach-types.h>
& w7 `7 u0 x$ i) a#include <asm/mach/arch.h>% b9 m& m* W N* g* X) _6 B) N
#include <mach/da8xx.h>0 L* B) k" U/ n' V6 e. n* \" c
#include <mach/mux.h>" g' X, K- J6 U6 ? H" V
9 ~/ ]" H7 a5 A. J, F6 ]# D7 `
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' X! m! b k) L3 Q6 y! v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)" F' U" `- ?2 O/ m; \+ D. H! {( m% w
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
& w4 k% q' N- T5 r' ^+ Q2 `#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ P6 F X, u4 E! ?! R7 b) w/ p3 g8 k# u0 {; K2 Q Z# I
/* assign the tl som board LED-GPIOs*/
: v9 {2 J# ?/ v8 Xstatic const short da850_evm_tl_user_led_pins[] = { f% y& \- B% ~! ~# P
/* These pins are definition at <mach/mux.h> file */+ A* [8 g# [. t w
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,1 o% g9 w0 V' R5 C/ `1 C* g, _" p
-1
2 y. G+ ^" E, t Q% m6 m};
& H6 \" d4 r6 m4 ?& N6 j) J
3 | Z9 l7 ?6 a0 z9 _static struct gpio_led da850_evm_tl_leds[] = {
7 Y; I" H" ^3 \8 s {; `. _6 v# N& Z! w. r
.active_low = 0,
' K+ o$ s2 U/ e+ c2 B9 H% U/ \9 D .gpio = DA850_USER_LED0,# n d1 G* w9 c) L
.name = "user_led0",' l; q# x# p& {) m
.default_trigger = "default-on",8 ]" t/ P8 z4 q4 ~
},$ T( Z& p6 z" ]% f* F5 u
{
) z6 m) W& Y: x0 T% o9 y .active_low = 0,
' x7 ?4 y% r: t$ m( x/ I8 p .gpio = DA850_USER_LED1,
k' |0 y4 h% p. x1 ]3 O ~( E& n .name = "user_led1",! K7 k. n4 X4 _& d% @, x
.default_trigger = "default-on",7 O% }8 a8 \; I
},- B/ s, ~# g" {8 w9 U, z0 S4 @
{0 f9 N% V7 c2 T. O
.active_low = 0,: m/ S {; j6 y+ W
.gpio = DA850_USER_LED2,, m1 F2 o6 d, I# B9 V
.name = "user_led2",
" t/ M) A5 g/ a4 ] .default_trigger = "default-on",# q% r) h$ j& U0 v
},
4 q2 E% u; N% W2 J4 E6 H {
8 W6 e; K; H( M7 J$ e .active_low = 0,) k! @5 T0 m2 m
.gpio = DA850_USER_LED3,
) Z1 C9 ` M1 u. i .name = "user_led3",2 w' j1 I8 T3 e7 w
.default_trigger = "default-on",
3 m! a/ I4 \6 [8 B% c },' D0 V2 t1 D" p' E6 A' X% l
};
7 i' p) m. c0 k1 u# M! V5 R; H
3 q) _) m. @9 {# Ystatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
) z* G; q% \1 e0 a. Y .leds = da850_evm_tl_leds,, K! E/ J! d* ]
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 B% [2 G/ q8 o, c
};
- E1 {8 o8 S. w( }) Y( @
2 U* Z' L- Q! [7 k# bstatic void led_dev_release(struct device *dev)
5 n9 v+ U9 O2 X. F8 p$ t( V+ N% m{8 A9 H4 E" z7 h
};
% x4 ]% z! C8 r& O/ W0 Y3 N: a$ J- e' S: {! N8 d2 ]
static struct platform_device da850_evm_tl_leds_device = {
( T9 V; l' ^ ]& ^4 V; q' X% t. h .name = "leds-gpio",
6 l7 X8 l9 R; F# z8 K .id = 1,+ L" N6 O, h! d4 S) h& V
.dev = {
1 h: u @: q5 p' Z6 ]3 \; `: G .platform_data = &da850_evm_tl_leds_pdata,$ U# D( `2 X+ b$ H
.release = led_dev_release,
( h( G M! j% G' ]7 C }
/ F5 b* u: F; B$ _% v! L2 _: ^; V};
0 S6 P# K' ~$ ]2 Q& P( e; G
! I+ w( Y4 G9 B o* a; t+ Y, V- I5 sstatic int __init led_platform_init(void)0 J6 A1 `: `8 k" n& ]$ w
{$ i! g4 X4 y/ q3 H, P
int ret;
" X* L) a9 b5 z( e#if 05 Z0 A* L* \) g. M$ }4 S* f
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 [( ^& s! g1 ^2 M if (ret)
1 _- k% f% W) U( ~. B4 E pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 A' [4 X3 p2 } C, G4 M/ s; z
"%d\n", ret);
$ @$ H3 N& x: V n) H! W4 l( G$ ]#endif
' v8 o/ i! M( h% ? ret = platform_device_register(&da850_evm_tl_leds_device);
5 ?0 q: p" _5 a6 m; x if (ret)+ }; y& X( p/ ^2 _7 x \6 r. x W
pr_warning("Could not register som GPIO expander LEDS");4 W; V: X( T& S6 y( u4 \, D! l6 m
else- s! A- g$ u! `: }- Z j1 N2 p
printk(KERN_INFO "LED register sucessful!\n");% Z) r( `- I! D/ @- Q
# [! p; H& f( o8 v) t! o
return ret;
e9 z0 F1 m4 v, |- K) l% z}3 m$ p- T. i9 d$ \# v
8 c- Y/ Z: g+ f' C7 E Q
static void __exit led_platform_exit(void)
' `* T& t( h. Y- x f2 o1 ?. p: ?{/ |% B" d- R0 P- J
platform_device_unregister(&da850_evm_tl_leds_device);
' O# }+ r9 S O4 y* p- q) v3 ]& t* p, a9 o' h
printk(KERN_INFO "LED unregister!\n");
8 |, E# {9 r7 I}5 l8 P# m$ }9 w! B! |& w! q7 K8 E0 K
/ j; ?3 X- u2 n/ C0 w4 c" h9 l1 K
module_init(led_platform_init);
# J) m$ p2 V4 umodule_exit(led_platform_exit);5 q) P g* R( B% w
: t& @9 C3 C- e# q
MODULE_DESCRIPTION("Led platform driver");
0 e Y) N, n9 {MODULE_AUTHOR("Tronlong");
0 r" H. t- M$ K5 w& M. T9 oMODULE_LICENSE("GPL");0 |# c5 m* C; ]" {0 a+ F( G6 @+ I# J
7 g- \+ p0 |) m |
|