|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 p' C/ t& i' H/ _+ [2 S" q
#include <linux/init.h>5 }: ?/ r, ^: T6 P2 I/ @5 y4 {
#include <linux/module.h>
- {1 b+ w+ Y$ s) m0 q- M#include <linux/kernel.h>
1 X4 T1 t: Q; }7 Z- {2 p#include <linux/types.h>. L X+ M3 e4 x3 i
#include <linux/gpio.h>
3 @6 d% ]- J. s+ W#include <linux/leds.h> R( u1 Q' R# Y+ ^
#include <linux/platform_device.h>
9 L: F6 [' N7 Q4 V$ |) D- J, D
N- a' a1 G4 [- k#include <asm/mach-types.h>
7 T0 f6 ^0 v( U. V0 n- C#include <asm/mach/arch.h>0 M) y& h$ T0 q7 W& i% r& l
#include <mach/da8xx.h>- F$ u! q; `9 H. Y* u6 l4 |
#include <mach/mux.h>
# U* p4 b7 c0 e1 i! Z
/ ]0 b' D2 B* s% F$ e& q! R#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 Z! o2 Y n3 w2 `4 L#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) M; h1 O* b' T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- s& ]5 [# C z0 v" d8 Y: ]
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
9 w; I5 L6 a7 ?& q2 b; r1 G$ {, r% X! U6 F g
/* assign the tl som board LED-GPIOs*/4 g3 o0 j: _+ I L. Z1 ]
static const short da850_evm_tl_user_led_pins[] = {: {) j0 C) T' v: R: O) _' J
/* These pins are definition at <mach/mux.h> file */
: y* j4 J. g/ }; t DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
$ {% z' H( b! P5 I -1% O9 L' d: w6 b9 |6 v/ D
};' j9 l! P, C& h/ R* }& t
5 U: a3 j- _ `, N6 U
static struct gpio_led da850_evm_tl_leds[] = { V1 C F* E$ ^3 f
{. ] U6 {# S. W: N/ \( C
.active_low = 0,! ]6 v- e) h- G( m. D i v; o' E+ k
.gpio = DA850_USER_LED0,7 v* U( K& Q' v
.name = "user_led0",
8 y! A! j0 }# ~ .default_trigger = "default-on",
2 C' C2 f1 U' X' s6 x },# z$ U- X2 ^3 T$ e& W* t! K
{# c% g* N ~. ?0 H( g
.active_low = 0,4 r* b9 t- R3 q/ O: V. q
.gpio = DA850_USER_LED1,
2 y, c( K8 D1 Z6 G .name = "user_led1",
& U% w% z- l9 | .default_trigger = "default-on",# g: }2 K2 E, j! x A
},! `! Q3 S& ]+ {! m
{
# L7 x _& _0 ]# d/ D3 W. Y. @; C .active_low = 0,
" z! m' O5 i) G+ q, Z" E; F .gpio = DA850_USER_LED2,: b8 d( t% i3 z+ {7 b* Y L3 a
.name = "user_led2",; R5 ?9 f, C. `6 m2 G: u/ ]& X- _. S
.default_trigger = "default-on",. \" h; x8 U! c
},3 o4 ~' y4 e# J6 _4 s5 b8 j6 x
{& z8 p" Q" `6 W4 w
.active_low = 0,* X/ s! _, \( N* q) l" L
.gpio = DA850_USER_LED3,
7 I! Y3 k6 B% Y, e: ` .name = "user_led3",& ^1 c; U. P- {; g) e
.default_trigger = "default-on",
* P- p3 N# `* E9 Z/ j$ k9 [$ Q },
7 h6 g% C% q3 x& u+ N& [};" S* s u7 H0 ~+ @: Z
0 E) ^, u6 [0 y6 z+ O$ fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
7 ^0 J5 i0 s: W, q1 V. C .leds = da850_evm_tl_leds,- W2 g7 u" S6 Q1 g! I
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 e* \ @2 R1 r+ O. C' }9 C
};( |3 [$ T$ y. g5 W6 ^
' A' M! I, `, K
static void led_dev_release(struct device *dev)
1 u3 y, r6 j6 z{$ v7 A2 {8 I* x% y. g1 g9 r4 G, l7 z
};$ Y5 t; Q/ S0 d7 b2 e4 A- x$ L
! E2 L% R# X* D0 i+ `& Y! z; L
static struct platform_device da850_evm_tl_leds_device = {
& ~0 g7 K: }) D. l- `. O: e" v .name = "leds-gpio",5 V: f5 H- m3 f$ u0 R/ @+ S
.id = 1,% O9 {" Z& _3 \. U& K3 c3 [
.dev = {' v6 R/ u' _3 M9 q$ n l
.platform_data = &da850_evm_tl_leds_pdata,! Q. ^5 a& ~3 ?1 n
.release = led_dev_release,/ A9 m3 n! E: @+ B5 @
}
1 B9 _2 m/ e! K};
* v% l, O' ?6 x+ X
|9 u6 M0 |( k& Vstatic int __init led_platform_init(void)
0 ?' d) h- ~" e( g* G{
1 a! r B+ U: m+ O% } int ret;
7 f0 M- N: N, l) ^ R#if 06 _6 C l* i6 W/ ` E2 a8 H0 t- q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 x4 ]! @" a3 [' n
if (ret)8 `8 {1 V# ?' B% u. M0 V( b
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ P4 p0 K! {! i" O "%d\n", ret);
; t0 b% ]/ _- O9 | Q#endif$ c p$ o' _, g! }* \/ r) B
ret = platform_device_register(&da850_evm_tl_leds_device); @1 e6 {- |% C z/ S
if (ret)' D( F7 C1 h! m& Z7 ]& ]: h( [% \
pr_warning("Could not register som GPIO expander LEDS");" y, \2 x* G+ _) V
else
; j: R$ W6 t5 P; r% z9 k printk(KERN_INFO "LED register sucessful!\n");
/ P( z, C3 K) K; E8 A% H% ?( l! y/ D+ i6 J. Q |2 G9 J X; t
return ret;
% t* v$ H: _+ i}
( W9 y# ]$ \1 A W1 m Z7 s8 S
; c* U/ h4 @+ A; Pstatic void __exit led_platform_exit(void). [9 b$ C2 W- H4 B! v
{' G: A9 t+ T/ W3 E* B- z
platform_device_unregister(&da850_evm_tl_leds_device);
! |( y8 a/ {0 A$ O u) I9 p+ n" O# x/ ^! U; f; H
printk(KERN_INFO "LED unregister!\n");6 F- K c' v* x/ _, W- M' W
}
5 l8 ?5 o h- _7 y& D! _% I: R- s' D! c( L( X* f5 w: r. b
module_init(led_platform_init);
2 O7 i3 u7 l. T. H/ o, ^module_exit(led_platform_exit);
% {) r0 }- i# K6 P8 p2 K4 H. W+ F- {7 Z) j _
MODULE_DESCRIPTION("Led platform driver");
, G$ g( e2 E/ `" ^# |7 `MODULE_AUTHOR("Tronlong");; ? e- \! i' X4 T# [8 u
MODULE_LICENSE("GPL"); P% C; h. h6 B) `& _
7 c* X3 I/ W) q; ]
|
|