|
|
求大神给下面的程序做注解,请稍详细些,谢谢。0 M; ~& }& w2 ]) P# f9 S: n& r
#include <linux/init.h>
6 i0 N6 e2 O- l5 Z! {#include <linux/module.h>/ `% }/ C, c/ K! r" p a
#include <linux/kernel.h># `4 D( `& R8 [, C2 B* G- O- K. m
#include <linux/types.h>
/ @) S+ f/ s/ t2 ^8 M5 z#include <linux/gpio.h>( x, H/ K9 R7 M) q
#include <linux/leds.h>
/ C" b2 y7 X2 } u& }& o6 a' Y#include <linux/platform_device.h>
E7 }- O0 ^ Q% V. `
+ Q' t" u. K1 w! L3 T( P; X3 `/ ^#include <asm/mach-types.h>
3 l$ a7 s4 c. U/ y4 B#include <asm/mach/arch.h>
" l* @* h/ W( C9 f7 ]#include <mach/da8xx.h>6 c/ W& D: m( `: Y
#include <mach/mux.h>. X9 \1 O% D) u' a# K1 Q
( l2 g( y/ _, W3 r& l% G: z7 F#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
; T" Y T* C$ P6 w& }; x* \#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) ~* |7 }; c( a0 g& D4 d#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 X: ^; r u, ~3 Q& U! N, ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 k6 l% Z* u9 `! z: s6 v! ~" H
* ]* _7 A# \. g) M6 Q- \/* assign the tl som board LED-GPIOs*/
3 [$ N. ^+ [/ e0 Q3 ostatic const short da850_evm_tl_user_led_pins[] = {( X5 b/ D5 A- K J; v( [- i) ~
/* These pins are definition at <mach/mux.h> file */2 ]4 _) q @% ]1 M- ]6 _1 M
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
, m! U6 }# J2 ^4 Q" S" T" F9 n* q -1
' `/ h/ C# X$ X$ ?};
6 S: Y7 I, t# Z' W: i, Y& b0 h1 Z' q. I% _
static struct gpio_led da850_evm_tl_leds[] = {$ A b0 ~$ f& G3 I
{$ `3 x/ G/ l' t- \% x8 c8 m
.active_low = 0, D* R8 }' o, q, D' R: B7 H
.gpio = DA850_USER_LED0,2 w0 c Q* \5 c5 J3 A! k( }/ @! \% i
.name = "user_led0",3 J2 g2 d6 W5 U1 X) |/ C: j0 }
.default_trigger = "default-on",
3 J% I. [ F, a x1 f! ~& i) ] },1 G. x8 d: M2 ~
{; {3 Z8 X( _6 i5 R* n% d N
.active_low = 0,
& m% e* E' q0 i. a: F, O9 [ .gpio = DA850_USER_LED1,
. e! Z# T% G% v# g5 P .name = "user_led1",
5 H5 K/ B# e2 s* N. A$ A$ d% G .default_trigger = "default-on",5 l* \- p8 I. z
},
' x( r! u/ J2 C& ` { @8 ?1 F# T# I: x' E5 h( t( ]
.active_low = 0,& P0 j. G) |6 S! E+ N
.gpio = DA850_USER_LED2,! P7 K6 l3 L" M3 U! e
.name = "user_led2",
+ V2 ^# d$ [: q# T- z .default_trigger = "default-on",4 i& d# R0 H8 ^# M; o: n
},
0 ?8 G( }3 U( {4 v {, h) Y% X# I7 i8 j- Z
.active_low = 0,& D1 g4 V* j. V3 N0 N& W% W4 c
.gpio = DA850_USER_LED3,. U* D* ]* n. i x# V# r
.name = "user_led3",
3 X8 b+ O$ D* s3 z. T- h! Y! x .default_trigger = "default-on",
' l& z: c% i; Q },# A' F$ B, t3 Y. ?5 m
};
: e: K8 z* d! M, _3 f9 ^, ^) Y% R
6 O# N0 L& P+ L$ R7 Fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
! G& F ]# J9 A/ Z. u3 c' d8 ^2 m .leds = da850_evm_tl_leds,
5 g: ]7 Z& @3 n! h8 q* i .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ l( v, S5 Z" {0 A9 [7 t/ A};/ |6 A& ^1 M9 X8 c5 [
, v: c2 t# K0 I' s0 e' u" Q- Y1 i
static void led_dev_release(struct device *dev)
9 s8 A# \5 a& }9 n" Z% Y{3 }7 |0 o# A, Q9 X% o; d( T
};1 ~0 G6 D* q+ r+ x) N! s6 X+ O
: K% ^3 U+ ^" _+ e
static struct platform_device da850_evm_tl_leds_device = {/ I( f6 M, {' K: l) \, p
.name = "leds-gpio",3 @- ~4 S5 {, V6 \$ X' [9 p% j0 y
.id = 1,2 E: N/ G" U, c1 `$ [/ j9 \
.dev = {
- ~, }* K+ b! Y* N3 w* s" } .platform_data = &da850_evm_tl_leds_pdata,1 \4 [4 U' z: {
.release = led_dev_release,0 u- ?. O, Z, y l" C5 {
}
+ ]! L! V! N3 j$ j1 @# T};
2 p3 s1 u% a+ S& `3 c' Y% A1 J. L% ~8 x
static int __init led_platform_init(void)
/ P& l0 J' Z4 a1 ~+ g% ]{
+ R$ `* H% y# G' L int ret;
2 [0 T; O% K+ {! l- \2 R#if 0) R# R" G/ b* d! v
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);1 v- p- M& T& g, H, M5 k/ B
if (ret)! s) s8 _6 u& Y# g$ D- Q0 G/ k
pr_warning("da850_evm_tl_leds_init : User LED mux failed :". d2 M0 m/ {7 R) o
"%d\n", ret);
: p2 K/ |; n" q ]0 b( F#endif5 X) U% ~$ \+ e" C [% b% x
ret = platform_device_register(&da850_evm_tl_leds_device);9 o# a8 Y$ S' _0 n1 i$ T
if (ret)* K4 {5 V' a6 ?4 T- w0 Z9 V7 Y- {
pr_warning("Could not register som GPIO expander LEDS");
' K5 \. z3 X/ o9 c& y7 h8 ] else
8 X; @0 h& O# g! _5 n printk(KERN_INFO "LED register sucessful!\n");' E% _2 z: ]6 v6 H
5 E/ u7 }/ E8 e8 A- K y4 i- P, b
return ret;
) \" |2 R) B. g x. N/ i}3 e/ f6 F, X/ S; w9 ~5 x
8 L& y8 [3 X, E2 M
static void __exit led_platform_exit(void)
5 P# y( g" e9 ~4 Q' V% U{
: _4 h8 c# {' C1 J: o2 a" v platform_device_unregister(&da850_evm_tl_leds_device);9 c0 Q0 p5 {! ^
3 u& a3 r7 M9 Y9 b+ U/ B' { printk(KERN_INFO "LED unregister!\n");
; w4 C, D! L7 I0 [! F: t}0 K' |% z1 ~# u- s! B
4 O" J: v1 c" |! D8 b- J$ n8 Amodule_init(led_platform_init);( Z: V$ U, @8 s) z- p# u1 m
module_exit(led_platform_exit);$ E+ c, [8 H3 w% Z- I
7 K0 z! O: _2 x) G; PMODULE_DESCRIPTION("Led platform driver");( p8 b2 N: i5 d& z) h
MODULE_AUTHOR("Tronlong");
* g1 S. C4 Q3 b( U! uMODULE_LICENSE("GPL");
4 I( A* _2 G" ^5 e1 b+ v* V, |1 ?5 z0 R" z2 `: g. l
|
|