|
|
求大神给下面的程序做注解,请稍详细些,谢谢。$ D1 g0 n) `( W, |: A
#include <linux/init.h> g7 z0 Q9 |* R- i, d0 x8 d
#include <linux/module.h> ]( \- l7 o+ M7 B2 M
#include <linux/kernel.h>" ~" B/ e7 A2 m) z
#include <linux/types.h>9 ~! j" Y! |6 N. j) J
#include <linux/gpio.h>
# L) C1 \$ S) x6 ^" ^, |3 Y7 A#include <linux/leds.h>1 P' F* u( R4 @6 R1 I
#include <linux/platform_device.h>
! U6 G2 J# \7 }3 L
5 I. _& d7 t& V) {! r#include <asm/mach-types.h>( ~- }7 \# k, k y( j3 h; v
#include <asm/mach/arch.h>! w1 [. G: @$ Z! E* N
#include <mach/da8xx.h>- u+ z# j0 ~# i9 n
#include <mach/mux.h>
" n- U8 R1 u" J4 c" C( d. y* r* U+ q# o5 x; r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ _, h, a& |. _: a% V7 B! T0 p4 R
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& ?9 p" L- g3 Z! v* f#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
- \! i4 M. a" f N#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
4 r8 [8 p" {: a. C
7 R) g ` G6 n/* assign the tl som board LED-GPIOs*/
4 g% Q' e7 K ^# [static const short da850_evm_tl_user_led_pins[] = {
/ C% n+ U; r' b( a; ~: J3 ? /* These pins are definition at <mach/mux.h> file */
3 g4 n, j4 P6 S0 N DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
1 q6 w6 h1 u% E% I* v -1* {7 p) v: m4 G3 F1 \$ |# ?- ^
};. R( }" z/ F3 X2 b( X
! X+ l" G/ m7 @) y2 Zstatic struct gpio_led da850_evm_tl_leds[] = {0 S Q0 A- {, d- [) z+ F6 v4 r2 j
{
5 K& v- W* f( r .active_low = 0,
1 P' _$ X" _0 d .gpio = DA850_USER_LED0,
s& g& Q/ K$ ~ T' |& C .name = "user_led0",1 l, w# Q0 g6 k+ P i- |/ A2 Y
.default_trigger = "default-on",1 P, O) x/ j8 Z* W% V' X
},! q% E0 _+ Y; {" J# z# P" L6 r
{ f2 o, ?7 S: Z
.active_low = 0,
1 H( V; }" \" E# G c .gpio = DA850_USER_LED1,
) j+ u5 m' n* [ .name = "user_led1",) @& W1 ^( b* ?% ?$ V/ M
.default_trigger = "default-on",# X: P4 k2 a$ y- u* a$ n. ~6 [
},
# B0 M% i$ Z" U+ d {1 l1 h) ` ]" I. I2 n
.active_low = 0,# v. ?9 z4 J f% B1 [
.gpio = DA850_USER_LED2,
8 Z* [$ [* _( f: e4 s/ c& ?- F .name = "user_led2",
7 ~2 S" w5 S, [0 e .default_trigger = "default-on",; B6 [! W: P; m2 j+ M8 n5 O2 X% K
},! x. D! m2 \5 {; r/ ]. p
{8 {1 \1 ^" F: W6 w
.active_low = 0,
/ i! t5 c% S% F .gpio = DA850_USER_LED3,
& [+ X& H$ ?$ m" H0 l: {% E* _: \ .name = "user_led3",) Z7 w6 m" x O- ?
.default_trigger = "default-on",
; q d# `# c& c H2 o7 l },
$ B9 f- T' Y* a$ [4 ^5 b h* h: _};
2 W$ m. L% M1 m2 l8 }
# I7 h- _" k* d+ ?) Z0 H. ^: i8 C- @static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {" b: m6 W) C! O
.leds = da850_evm_tl_leds,
! _- J$ E/ g8 W* g) u1 j/ _ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
" B; y- [" `8 j) @, P};
2 \( S8 o' K# l, H5 `4 l3 }6 L" i/ h! G% F' S2 ]7 |
static void led_dev_release(struct device *dev)
$ Y: p6 G; D% f{
0 C% s% h8 ?( f! x" l1 r8 ~};
: A: ?5 K) y# \* ^9 p5 V' D) K+ U( l
static struct platform_device da850_evm_tl_leds_device = {
0 P% g8 J; m w! V% H .name = "leds-gpio",
5 Z: u+ y2 d9 _ X5 i .id = 1,6 s Q7 r2 z, Q- n$ V9 G$ w0 ~
.dev = {1 ]2 R: v' E# r. X) H+ I& u
.platform_data = &da850_evm_tl_leds_pdata,9 r/ v" ]6 u7 b6 G6 i
.release = led_dev_release,+ y- o" G! k7 ?+ }" V
}
0 [! y# J. \6 ~, V/ e};
I7 P# t% k8 V/ y4 H$ t/ n& ?2 d) b$ X+ N1 Y
static int __init led_platform_init(void)7 F% L- T3 ~3 ]3 k5 _1 d) M0 j/ C
{0 X$ [4 F( g \$ ^6 q, `1 P
int ret;
# {* G' B$ C4 h#if 09 i' I# f. J. J9 S) P
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
! ~$ a; f; A/ g; f8 P if (ret)" `/ W6 P. O' t1 [3 j( {
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 m# g7 f( Z/ g; E# g
"%d\n", ret);
7 L1 @; I6 _# i* I6 c0 |8 y' Z* u#endif
$ K$ x. p& o/ _: _' W3 ? ret = platform_device_register(&da850_evm_tl_leds_device);+ k( J. n& A& R$ s( H4 y4 p
if (ret), r+ r* f1 b& u( e1 P" M5 K. Q
pr_warning("Could not register som GPIO expander LEDS");
) w' c& J' F; d" T- ?9 W else
# e1 g* I9 V, E- a7 n; L printk(KERN_INFO "LED register sucessful!\n");: m( Z5 T M/ _9 s0 R
4 O3 Z5 b! m# N8 B
return ret;
$ D0 c7 l3 x0 Q H& r' o}
3 P4 d) M9 ]( v, P
3 x* T D' N+ Z' hstatic void __exit led_platform_exit(void)# i: W. b& G3 r7 o
{
6 }) B9 K1 _7 t0 l4 t platform_device_unregister(&da850_evm_tl_leds_device);3 N& `, N/ z+ f- [+ R' _3 v2 c
, T* C+ g# g7 }/ y! P0 `7 ? {4 ]
printk(KERN_INFO "LED unregister!\n");
# v* j; z( U0 n! H4 H}, k6 ?$ w* {: r9 u4 t$ A! g
9 T0 Q( f0 ?! ^
module_init(led_platform_init);
6 i) g# {9 O, o) V$ m1 i0 B/ Wmodule_exit(led_platform_exit);
5 m! }4 \( h Y p" Q1 g$ C, J4 k
. s4 x! L0 Z! ~- N8 Z+ D$ ZMODULE_DESCRIPTION("Led platform driver");
* ~8 e, Z% r) xMODULE_AUTHOR("Tronlong");
# h& q! G, n, c3 v5 ?3 jMODULE_LICENSE("GPL");" D# U" K, v0 ?7 e2 R- L J2 W7 z
% V, q5 {- q# F9 f# t* }: ]1 r: h; V9 ~ |
|