|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
F( g3 }2 X/ K9 y. o1 `#include <linux/init.h>5 W9 `; u! u3 Q0 H7 i
#include <linux/module.h>
0 k9 s& P/ }2 R#include <linux/kernel.h>
: l- X+ ]5 z2 w/ m) _#include <linux/types.h>
* }9 E/ V6 P3 z# U( G5 p#include <linux/gpio.h>' \6 y: ~; U8 {% P! J/ I
#include <linux/leds.h>
5 A$ [; E! o: ?$ {1 i9 d* y: @#include <linux/platform_device.h>
! j& c0 M0 R* ^4 u, w( f0 x, m1 x# v
#include <asm/mach-types.h>: n7 a ]0 [9 t" C( k+ A _
#include <asm/mach/arch.h>
- ` }1 d% H8 y a#include <mach/da8xx.h>
0 F9 M! k; F9 a#include <mach/mux.h>' U8 N5 U3 J* b/ M
$ A$ S9 z8 l- n4 X/ ~8 ~/ h
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
" R) B) W+ N! Q#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)3 C+ r& w& d0 z9 ^
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 ? o' c3 q3 F3 ?1 f8 p
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2). b5 y& `5 b$ `" M
4 g& q- z. K+ q6 |3 Q5 c- t. N5 t/* assign the tl som board LED-GPIOs*/8 H5 j' H/ A5 x# U0 H
static const short da850_evm_tl_user_led_pins[] = {+ j/ W6 H: k- j, l
/* These pins are definition at <mach/mux.h> file */
- _ v- @* m0 z6 \5 I5 i% g9 i DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,; h3 C9 v! J b( Z; g; |# S
-1
. w$ j( y7 u. P$ M% J, w: ^$ }};. ~: l, _$ d5 J; R3 D' {( W/ p
, Y& ~; T% B' B* t7 \7 _& q
static struct gpio_led da850_evm_tl_leds[] = {- p# ~: f& [" ?. @! l! \
{
, _9 F+ r6 L" m6 i4 z .active_low = 0,
, W) | V/ p! P3 \ .gpio = DA850_USER_LED0,2 T) X4 y% R+ L8 ^( t2 N6 b5 N
.name = "user_led0",
& B' m7 E- V. H8 E% I .default_trigger = "default-on",+ W6 c ?6 p7 U& z! n
},* ~ Q6 m) P* N R. H' W8 [$ s. s
{) n+ Z @; N1 y5 i9 D, `/ N' @
.active_low = 0,
% v2 O8 S6 Y4 z6 s# w" c .gpio = DA850_USER_LED1,
" p: V! v. Z# l0 I5 y- {8 k .name = "user_led1",
) ^+ g9 U2 s* }' ?+ G1 n .default_trigger = "default-on",
' c' ]0 h2 F: I6 ?0 ~ },& \7 |+ H. m: }" d' e: s+ z7 @
{* f7 S+ `* ~3 ]) g3 k# d7 K# ?
.active_low = 0,- f' k9 a% O* C. q8 A
.gpio = DA850_USER_LED2,9 y n' D. P" W. Z2 X( V
.name = "user_led2",
4 |" s4 D* C8 N) \* B. ~- D .default_trigger = "default-on",9 F7 z4 K) R) v% a( I; C
},
2 E; k3 j/ a3 z4 k+ _; [! J# f {' K. Q4 y" N+ U+ h# d/ ~/ r* x; e4 C) M
.active_low = 0,# k K4 q0 m$ G6 @
.gpio = DA850_USER_LED3,
5 }" e! n$ y; n& z .name = "user_led3",
! d" z: W5 E$ i! w: U+ e9 ]# V% w .default_trigger = "default-on",4 U: h& [9 ?% R
},; \- l! I5 a/ ]) B! H
};
' k' W& q5 Y; j4 b
7 L, v& ]& w. y% @# M+ Sstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; Y4 Z3 ]+ ~' d g4 \( R1 n .leds = da850_evm_tl_leds,
! t4 V! f; G* T; U9 `; n* U .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
I$ a( U' {' }: J3 p9 l};
, b: i0 o2 J8 i. t F' k7 z1 f2 f6 L( L7 S
static void led_dev_release(struct device *dev)0 c! s4 m) ]* _9 m0 V/ M8 {, e* f
{" z6 C+ m7 d9 j$ N( p+ b
};
6 L& z3 R& Q0 A3 m1 h+ I# p5 G1 j4 U: a5 x2 ?/ W0 u
static struct platform_device da850_evm_tl_leds_device = {' r1 h' ]+ e2 B( A
.name = "leds-gpio",) L$ g/ o! [/ p$ ?
.id = 1,
4 u" T0 p2 D3 S6 _0 r3 J .dev = {& K; f# ?' m) q' e# [9 v; Y# }
.platform_data = &da850_evm_tl_leds_pdata,- u! y) V; N8 h. t5 c
.release = led_dev_release,- Q- n1 _2 U8 U
}
* U7 a, M; ^3 ?1 _6 H1 S8 S3 k- Y4 d};
, l* ?! L9 _5 ]9 |) H" E" n s- y8 t8 n+ j% Z! M
static int __init led_platform_init(void)4 y8 k+ N7 U3 i8 j
{
" T7 ]0 T6 [" Z' v# P int ret;" w! @- j8 q. m! P) i
#if 06 i0 k i; U8 Y; N# d) F
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 A9 P$ C w+ g! o if (ret). s1 o8 `, H: K( j% o7 ]6 q
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
& { F% d5 c7 M "%d\n", ret);& S4 r9 `% r T' E0 p j
#endif% ` u) Z9 @/ F: @9 l9 Z3 a( T a
ret = platform_device_register(&da850_evm_tl_leds_device);
: F0 l* o [ i/ S$ x if (ret)$ W" p( h) E# a3 b6 |5 m
pr_warning("Could not register som GPIO expander LEDS");
& W* Z2 M7 @) @' ^( y else
7 Z) P% s6 a6 H: h$ h) B* F0 F, b printk(KERN_INFO "LED register sucessful!\n");
2 p2 l* H. G% ]9 q) L8 Q$ C
n/ O7 u m! V& A1 l" J; s' s return ret;
: b5 ~' g0 ?. M7 K% q}
% e6 d2 [2 k5 C8 K2 z9 x8 x( L6 K- N$ v' n( m9 k( O" ^
static void __exit led_platform_exit(void)
5 ] X6 ~ ~% b( _9 Y{& W/ F' R7 b2 R: B% {) t
platform_device_unregister(&da850_evm_tl_leds_device);
) I/ d$ _* ^+ r2 O- N) J3 F" B+ G% H0 }. f0 i. R
printk(KERN_INFO "LED unregister!\n");3 C9 D9 T6 M* {) P! u6 w! }
}
4 K& X6 c1 O9 `1 N! z7 ?. [
: Q8 Y7 j, O6 y( u; f" H8 zmodule_init(led_platform_init);
) v1 K# S) L; W7 ymodule_exit(led_platform_exit);& k/ L7 D5 x. O% a# `6 L8 ^9 t
4 g$ z! L/ Y, e; s! P! ` d7 UMODULE_DESCRIPTION("Led platform driver");
: H2 C% ?3 `. E8 ?4 Y1 u8 WMODULE_AUTHOR("Tronlong");
" m8 a" |9 W9 ]6 e( f% c! x% xMODULE_LICENSE("GPL");. l: d: a+ A+ Y) W7 {7 h, O
! g) V" Z8 p0 E9 ?. T9 ^4 T, { |
|