|
|
求大神给下面的程序做注解,请稍详细些,谢谢。7 R3 e) j, k4 ~
#include <linux/init.h>
0 o5 k+ ~- G6 D' `; P' i( n8 S#include <linux/module.h>
7 N' H+ n' T: b# b2 ?#include <linux/kernel.h> a1 Q- w. D- N: }% z
#include <linux/types.h>
8 u/ O' S6 Y4 j* g8 D#include <linux/gpio.h>4 a+ k4 H' u' U+ x% J
#include <linux/leds.h>, e5 Z/ \# F) y' Y8 p
#include <linux/platform_device.h>
) _: ~8 g2 _9 Z
& g6 q# ?0 P8 q, f#include <asm/mach-types.h>
& {" [7 F& W) M; p+ _$ l#include <asm/mach/arch.h>1 q% X4 W5 |, R
#include <mach/da8xx.h>
* ~$ r3 A+ Y* Q# ]$ P#include <mach/mux.h>
, e0 D U" b' @/ E8 J9 r# @5 N- G a0 {
3 X4 L! `1 {+ y; `6 j/ M( S#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)( \) g( q) [ M4 i$ p
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) R6 T0 v N& }: l+ t, j/ U2 n#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)6 j, c8 W; ]; U9 Z: N- e& Q$ Z# h4 ^
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
7 u9 U& Y* x/ n# S* E7 R- z& A1 K7 d' Z
$ T. v) n) B: h9 K/* assign the tl som board LED-GPIOs*/
+ T% i% f! y( t2 M, E+ N' P& Xstatic const short da850_evm_tl_user_led_pins[] = {6 C+ @% ?& H5 M0 O0 b/ f" Z
/* These pins are definition at <mach/mux.h> file */0 c4 b4 T$ K4 _3 k# a9 G3 Y
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
* o( y+ t7 d! H( [( D! A -1
9 Y1 h. ~. ]; i, c: O1 E};
9 [" W+ t/ @ y) S7 C% d7 w9 U8 L& d0 Y# u0 q8 U0 ]0 e, s
static struct gpio_led da850_evm_tl_leds[] = {! o; B+ ]# z# x V9 g' L% g
{# L4 p/ e) a% ^+ F' Z6 N
.active_low = 0,
: e" q- ^" ]4 P: n .gpio = DA850_USER_LED0,8 c4 ]4 S; `# T J6 S0 z" B
.name = "user_led0",
6 S$ w5 Z0 T9 j, `' i% S .default_trigger = "default-on",
( ^' Y3 t$ ?' P* z. v },
0 K. C y; |* A3 N {
; L4 O( W/ S8 |4 _8 O .active_low = 0,! E# |& f/ r7 H
.gpio = DA850_USER_LED1,0 Y2 F( n1 T4 c( C, }, l
.name = "user_led1",0 X+ u+ ^6 r% N+ T) ]9 ]& k* o% M( Z; T
.default_trigger = "default-on",
" V( ]1 k7 s& g },$ f8 L( k# }5 h# f8 y
{
0 l! p1 q$ L* X' B .active_low = 0,
5 P8 h0 l, p# i$ W) H& F .gpio = DA850_USER_LED2," _, u4 O; p4 T' k) s4 ?0 p
.name = "user_led2",* y0 P6 C" ~; L/ T' Y
.default_trigger = "default-on",2 a8 `/ K1 T s; |
},- [, P5 n3 d/ G# I1 G
{
! O! m# P, k& d `, D8 w2 r .active_low = 0,' h% ~( Y: q) H5 o" [
.gpio = DA850_USER_LED3,2 a9 i7 z' y! T1 C4 @. V- q
.name = "user_led3",
5 b U [( V6 B4 O4 f: F, [ .default_trigger = "default-on",
: _& x( k7 s! F },
6 d) T6 _1 e3 f6 j# v) H};
0 C7 L v o; m5 q1 Y6 C
& C5 b% O, Q1 h {/ _0 U( tstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ G* e: u. U; F$ e, A
.leds = da850_evm_tl_leds,7 D$ \) g: n/ ]) C, l- O$ s
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- Q( n2 |/ ~. `0 d* R/ J" | e4 Q};. m4 V0 Z1 ?& P2 e9 p
# h, E4 X+ T+ E6 A
static void led_dev_release(struct device *dev)
; c7 m& V j" t! U: s) J# b{
9 S, ^5 ?, q" o' W, K* Q5 c: O3 J0 i};
. s2 M+ x* M8 B) {0 G) `2 W( e% h% [% Q _9 Z2 \& r% n
static struct platform_device da850_evm_tl_leds_device = {8 s9 H/ ~. Q c, v$ Z3 L9 r H' c# t
.name = "leds-gpio",
7 J3 d5 y% G m: \% X2 J0 { .id = 1, d' W* q4 H6 U7 P
.dev = {
: T7 _0 B8 S y5 K4 M$ u+ ~ .platform_data = &da850_evm_tl_leds_pdata,$ V% C2 K. v2 g# b8 g& q
.release = led_dev_release,
8 x1 y' y; }& M: g }
' E3 g5 R7 h' Z7 A}; C7 V+ v- I3 n& N9 E
( s4 f, e/ _" c+ J
static int __init led_platform_init(void)4 }: Y3 ^. p( K4 `+ V, Y& r, @% b. U. A
{ B7 M2 |" b, Z# X* F; a" ~: }& e! `
int ret;
, N: u# ]) i% m0 X' Y4 i+ I3 X- C#if 0
0 i( p1 _0 r) q. E/ r ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);$ S' f6 | a4 N; }. c8 e1 y$ ^5 @6 k9 N
if (ret)/ a6 ]5 R7 A! J; }3 c
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"# R1 C/ \. W3 e6 j# L. J# m( t
"%d\n", ret);2 c3 ^( m' |# M' t
#endif5 n& ~5 g9 {4 f5 n" {! Q: W
ret = platform_device_register(&da850_evm_tl_leds_device);
% ^0 o S6 n1 f' \: R0 K5 `; {: a if (ret)& W* U' C+ j% N9 z, ~ v- [
pr_warning("Could not register som GPIO expander LEDS");
% {2 S) ?4 T' |( k1 ^/ \ else* g0 U% t0 T$ Q' e
printk(KERN_INFO "LED register sucessful!\n");
. {- x4 h" R, c9 p" U5 Q
) Z$ [( g% W( N D1 P* M return ret;) y6 N9 |% b9 i7 v9 {5 ]
}8 p) L, l; p8 D5 s6 O' b5 M' H$ P; b
; l. H4 b' Q& o
static void __exit led_platform_exit(void)
8 c' h5 j% d( ^. o5 O& i2 L. F0 G1 [{
) D1 ~ Y2 F4 D: i- P f& ` platform_device_unregister(&da850_evm_tl_leds_device);7 h& ?& m; x9 ` j; W1 X0 G+ O: ^3 m
8 H% L3 D1 Z7 H+ \
printk(KERN_INFO "LED unregister!\n");
' k, p; R. R R g2 m. t7 b} l6 u1 R0 i. d; c" [- r
, |& y# Y0 H1 R% F3 Tmodule_init(led_platform_init);
8 m9 p/ a1 v; R" ^3 y* w& mmodule_exit(led_platform_exit);
' L0 l6 d) P E& H( y9 F) d) ^6 E9 `3 J6 @# Y
MODULE_DESCRIPTION("Led platform driver");2 d2 G( n2 y. b
MODULE_AUTHOR("Tronlong");, d0 c w) v* H* O. u% _
MODULE_LICENSE("GPL");' q2 k$ f+ i% d5 u& q9 Q
H/ \% p( g+ } |
|