|
|
求大神给下面的程序做注解,请稍详细些,谢谢。) N. c, y0 Z* r/ ^* S# G( p
#include <linux/init.h>/ D+ l* Y, c2 D. e8 c7 u t, |
#include <linux/module.h>
& c" l0 {' Q& H" f& g7 `6 B#include <linux/kernel.h>, \: f+ c3 e5 O$ M k @0 v$ j! F$ J
#include <linux/types.h>
* U" @: U3 d; v s' d: _; t' o& T#include <linux/gpio.h> u% E& \, g L2 Q
#include <linux/leds.h>
1 r: R% a4 @5 q7 ]. k `#include <linux/platform_device.h>
% ~& X- h) ?* A! b8 m1 y4 o( I7 U: }; P$ [, n4 [* @% H0 I
#include <asm/mach-types.h>! G7 a2 d6 M) o5 h" H- h' C: ~2 q
#include <asm/mach/arch.h>- [4 m# f. \3 ?2 R9 R9 U6 f
#include <mach/da8xx.h>/ F# }7 E h# B4 i' s
#include <mach/mux.h>: P# k* t- o# d% [+ `
6 f2 y4 M& b4 t2 _; A- Y5 K$ r8 T
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% h& M- s, |, B5 U+ f% B
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 g, c* W9 P5 U5 i" |% l) _7 p
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- [8 d; W! p4 }0 w- W
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) N# x" M6 ]0 Z2 ^6 s
% F/ ^0 L( M7 E/* assign the tl som board LED-GPIOs*/' _. W4 ?+ w4 J( ~
static const short da850_evm_tl_user_led_pins[] = {, e6 b. W5 p2 N, c$ {' g7 s
/* These pins are definition at <mach/mux.h> file */
( v) p7 N( n2 ] DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,- ?( {8 Q6 N- x; _$ z9 Z
-1& Y) b) w! o1 V- U! [3 t
};
( C6 E& B: D( e9 n. i3 i" |$ j' v4 W
static struct gpio_led da850_evm_tl_leds[] = {8 f/ l5 J( ?0 u1 M% n! }6 ?
{4 N% u! M0 \ x$ Y* X/ g9 v3 x
.active_low = 0,
, o& ?8 \# v& q: y! t7 L- f/ K .gpio = DA850_USER_LED0,( L/ y* |( A0 H( r) C
.name = "user_led0",
2 P# w2 I, @! D* j1 F: c* } .default_trigger = "default-on",3 V; u# C2 F: \% z% ^+ @
},5 f `8 }( d# f' X1 \( D: x1 |$ R Y
{
) g" e( [5 F+ q" v+ p! U3 S .active_low = 0,
' V$ n6 N# y" d; t6 [& T# o .gpio = DA850_USER_LED1,
+ n( t' }/ `4 q p .name = "user_led1",
! q6 S- V. l. B: M$ i .default_trigger = "default-on",; A9 N& t6 S8 m- `2 y6 O! u. h
},
) q' |: I, u! h4 _& a; L) A {9 Z v4 u+ r& h( _
.active_low = 0,$ ]4 H% U' k. m$ u3 p) e2 s
.gpio = DA850_USER_LED2,
1 Q" P+ y" A4 V |4 |( I7 |/ _ .name = "user_led2",/ p: t" t' _, P4 T
.default_trigger = "default-on"," m7 C( m; X( B- Z2 Z* |
},: ~+ o% _0 Z! }3 A" T) x
{
9 j) j2 n7 w9 Q+ k- L .active_low = 0,
4 n% @7 S" [9 A! k4 Q, { .gpio = DA850_USER_LED3,2 m2 J0 k- ^1 s' r: O) |" m- J
.name = "user_led3"," l0 ?+ A# h; g6 b( p5 {
.default_trigger = "default-on", T# k* D1 F3 z
},
+ F0 y5 ?2 k3 r};
$ |7 w8 X$ i: q1 _* g8 J
: x5 N3 W( T& @% }2 W; Fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
m0 g! V% ~/ y* l .leds = da850_evm_tl_leds,9 v5 g" C% |& M8 Z
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),( _) |0 O5 b+ @5 i- d8 W" t
};1 l) r. h2 r( A2 P( }+ z$ ~
! i: c2 N9 P& d/ h! ]
static void led_dev_release(struct device *dev)6 K( b! ~0 p' j; L
{
# E' R6 |' E1 U: B* u};
% C; }) _3 A# e f& F2 F |: y# q( P5 s1 b$ ^9 o u
static struct platform_device da850_evm_tl_leds_device = {
( {: s3 z- ?9 S; h& S .name = "leds-gpio",
' u1 _8 I" ]3 B) z5 t( x .id = 1,
" Y0 W; [+ P: c U2 V! b7 | .dev = {; ~, q) G. B# z7 m
.platform_data = &da850_evm_tl_leds_pdata,# }& ?; o4 c8 y2 V
.release = led_dev_release,, a/ t$ E$ ^5 y1 w! @: Q
}, @0 _/ b# Z* b3 q* y% m
};
$ O& b9 V. a$ y, M, {6 Q, h
2 N. D7 W& Y1 q7 mstatic int __init led_platform_init(void)( L. u s7 j! J; j1 i! Z# P
{
$ W S, z' @ [- y( { int ret;# q! J! X& X' d$ h R9 P2 b- \
#if 0
! ~( e( Y8 A0 v0 h3 R ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);1 _+ X% @' |; @; e. Q* B
if (ret)
% K9 N: X2 q( @3 z2 m* y6 W- k: E pr_warning("da850_evm_tl_leds_init : User LED mux failed :"& _ A0 t+ n4 t7 u8 S; x! u) C
"%d\n", ret); F/ d; `9 k/ q, R& _1 F
#endif
/ F5 o0 u! ]0 Z' W0 K ret = platform_device_register(&da850_evm_tl_leds_device);
; i8 y& N. |, P: m! B if (ret): P. D* L( J. P9 [3 X( [
pr_warning("Could not register som GPIO expander LEDS");
' @! {: t% N; z! r else) H% G" e/ H0 E' f3 T) J( p
printk(KERN_INFO "LED register sucessful!\n");" \ {4 P5 s) l
+ P8 K' W. h/ b S0 p1 F return ret;
6 k! @; E- @2 Y! n, o" X: Q+ g& X5 z}- g O- M: E6 G& ?% N% w7 ~
+ g5 i1 J$ u3 e) estatic void __exit led_platform_exit(void)
2 I. T V5 |( H& E4 l{
! Y$ C9 v% ^3 t6 U1 h0 @ platform_device_unregister(&da850_evm_tl_leds_device);, k) {; _4 _2 G0 u; @
+ @ Y3 z' J* z+ \' j- G: V: f
printk(KERN_INFO "LED unregister!\n");
) j4 R; @! G) ^, s6 {1 Z1 C}
/ |4 C Y: y0 C9 l! x o9 Z0 x8 @3 q$ I1 W( Q
module_init(led_platform_init);' P; h8 g; C/ r' f4 Y
module_exit(led_platform_exit);
3 B9 S* c6 o( d4 o6 k( P" W6 m( C# z
% l6 y7 X/ R! ~/ y& J" L- o% aMODULE_DESCRIPTION("Led platform driver");1 I' f2 R1 D; z8 G5 j; H+ \4 q+ G7 m2 E
MODULE_AUTHOR("Tronlong");( ^; z2 f$ y& D" q6 p
MODULE_LICENSE("GPL");
! c# R% G$ I% y; ?( a' p$ V1 g6 v' I+ t5 E. f' m
|
|