|
求大神给下面的程序做注解,请稍详细些,谢谢。
' `5 W6 F) m2 U#include <linux/init.h>
" \' b3 q3 d7 h; V#include <linux/module.h>) q( R6 }( R9 c% W3 N
#include <linux/kernel.h>
& u. v% u. m( b& Y: f* I2 K! B#include <linux/types.h>
/ N& S' L8 y3 {1 Q1 m' J6 c* Y" I#include <linux/gpio.h>
) ]) k: R" B0 h4 u" A) t. F: \#include <linux/leds.h>" C3 T& r7 H# [
#include <linux/platform_device.h>
9 s8 W% o0 | O/ j, u) W6 S; e: \( e, q) Y
#include <asm/mach-types.h>4 z& j. @) m# @' N( b6 v' H6 A7 O
#include <asm/mach/arch.h>
7 s: j; m( q0 _; x' u' E#include <mach/da8xx.h>
# Q* C$ E" K& i- i, J8 p% q' \#include <mach/mux.h>* }* r! X7 m( S& l2 u
^3 C# M; m( `. \5 w
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)5 x4 Z W6 f! e, H
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ E$ x4 `: {; q" J( c! z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 H9 }& V0 a1 l$ w6 T! G+ f3 u#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ I' t8 ?1 h ^/ e# r
3 J+ w& a+ i. h2 K" k/* assign the tl som board LED-GPIOs*/- {) ]7 B n3 q9 C$ d
static const short da850_evm_tl_user_led_pins[] = {' n- \1 p# I# w1 N c; q2 X0 \
/* These pins are definition at <mach/mux.h> file */$ ]; Q9 B" S+ x: q4 I6 D( d9 q
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
6 i7 u( s7 d" d4 ~# K* [ -1
9 |7 d9 o/ e- t3 c. |};. i. N Y, [. a& @# X
8 O, P( x1 b2 l6 i+ }( D- h
static struct gpio_led da850_evm_tl_leds[] = {
) `. C) W6 |% g; h. X {
9 \" c. r: E: r/ v- \1 H2 X) o/ E .active_low = 0,* s, z6 ?# e3 Y
.gpio = DA850_USER_LED0," l; i1 Q1 U$ _; c/ T* m
.name = "user_led0",0 }, W* Y2 w6 h6 q& D8 k$ w
.default_trigger = "default-on",
/ |* s+ X) x; }+ I" ` },/ k1 H6 ]+ q* x3 B
{* W& z; N" \* p/ y0 { w
.active_low = 0,, z) j+ {+ \: X( u1 b6 ~9 C& ~& T
.gpio = DA850_USER_LED1,7 [- i% s4 z0 y+ O5 c& ]+ x2 N
.name = "user_led1",
6 S1 w7 H% |) X4 a5 V9 Z .default_trigger = "default-on",
7 P& u3 ~' O6 {9 l3 B" K* H },1 b! }. f& O6 j e' K% a; m' R
{
1 F: F6 q! j1 ?3 {5 ^ .active_low = 0,
/ t8 ` r! j/ l C1 {6 b .gpio = DA850_USER_LED2,
7 L) E/ Q; L) M9 | .name = "user_led2",
K* t& `" M4 ]6 q" i" P+ J1 \ .default_trigger = "default-on",, \1 s7 t( I) h* M6 \2 c
},. w' s! u6 H; O" f: R
{+ R/ b' a g2 a" X2 ^
.active_low = 0,3 M' }, E9 U3 {; j9 ^
.gpio = DA850_USER_LED3,
7 v n$ ?/ c: E: X9 V .name = "user_led3",4 x& K& Z' ~! P( d2 G4 k2 q: `# O
.default_trigger = "default-on",
! M9 H6 X+ v$ Q) n7 I* J: z" H# Q },# w$ C. N3 p" ]5 _! G4 d
};! Z2 s- }: }. T: z% T
' o' `4 v5 P S5 }9 L" gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
" Z' b( e5 t, v+ y9 r* @ .leds = da850_evm_tl_leds,- W4 b3 [- X2 j3 ]- o& p% R
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 U% T! T1 E+ J& L0 o};
- Y% ^# z6 i3 }* V
6 c+ w, v; M" i- |/ z8 ]static void led_dev_release(struct device *dev)% ~; x% ^ u9 z9 c
{! a, v. P3 _5 C/ `5 l: v1 J
};
9 s& O$ h" N& Q3 M- W$ p, [. U" a& Y1 m2 m
static struct platform_device da850_evm_tl_leds_device = {9 J* h1 |# U: X; l( K Y Z
.name = "leds-gpio",
: z# j( @- ^7 ` .id = 1,
7 P1 g" v& @2 y0 D# H .dev = {2 S% `) }# H% K- t* Q' Z/ w
.platform_data = &da850_evm_tl_leds_pdata,2 X( A$ R0 \; {, _' p
.release = led_dev_release,5 v. z3 p' L5 c$ |# C0 m/ L
}2 x* a' u2 R9 {) w- H3 G) W& w
};
% T" B) A* R$ ~! F2 O! K/ I. t8 F0 b6 o3 i
static int __init led_platform_init(void)7 x* Q( G1 U) Y- m7 l5 n7 t! Q5 T
{2 P# k8 F3 G0 [% [" O
int ret;
+ N1 e8 `2 S3 Z2 E0 p#if 0
& ~# X7 G' W& z# D9 g ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);, l; z% V9 c+ q6 L& m/ W8 z
if (ret)
- |4 R/ Y4 l( G- E/ @9 Q% ] pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; m+ }$ d/ r$ N B5 L "%d\n", ret);
) n6 \! e6 l- ^" J1 j' h3 W#endif
# u+ t, Z& d/ o8 B ret = platform_device_register(&da850_evm_tl_leds_device);# m9 ]2 Q. @8 b- p
if (ret)2 x" b4 y, a4 Z" J, V- l. Z
pr_warning("Could not register som GPIO expander LEDS");
0 x- t8 Y+ Q! B* B% u else9 v. ]4 {2 K; U* u
printk(KERN_INFO "LED register sucessful!\n");
* R6 M0 r9 S# [4 t
& ?, O" }& M, |; x8 V! y9 a return ret;( [8 x4 M2 j! D
}$ H4 f4 a( P; z6 s, E2 u
" q# L% x [) G8 N5 Lstatic void __exit led_platform_exit(void)8 P. F: X& y: k/ V( W( v# R& z
{5 f7 `( S1 z0 n; e- M
platform_device_unregister(&da850_evm_tl_leds_device); u' T! g8 I/ Z7 [" o
- `" y1 t5 ~/ d$ ~
printk(KERN_INFO "LED unregister!\n");
, p* R' C; A# S# Z+ y}) f0 @5 F' V3 n9 X% H' l
6 q# ~ V! i% M& ^* e2 pmodule_init(led_platform_init);
/ ]0 G& _& ?- G% U& Omodule_exit(led_platform_exit);
3 d" S6 y a4 I; o$ V. [" h
, S' a6 l2 f! GMODULE_DESCRIPTION("Led platform driver");
' _/ a! ]7 {0 p: R+ @: LMODULE_AUTHOR("Tronlong");3 ~& |. E6 }/ q. v. m( w
MODULE_LICENSE("GPL");
' W2 y& v1 Q3 I! N: [) \" x1 |
( i7 Y- m5 n4 {' K! H% C |
|