|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
* s! v4 C; S$ g8 D' L6 h# N- F#include <linux/init.h>) U0 R6 w C+ q* i, v5 d) o
#include <linux/module.h>3 D) Y% D u) _: m |) ?
#include <linux/kernel.h>
# {. r3 d6 j* V! p1 U; B3 b7 z#include <linux/types.h>
. v5 E! S7 a8 U; m! F* r#include <linux/gpio.h>
7 c( h/ R/ [, o8 Q5 k#include <linux/leds.h>$ S1 q+ G3 ^# c. ~0 E" c0 M" ] B! U! d
#include <linux/platform_device.h>
6 x4 W* ^; b4 {! ?7 Q$ X
! k1 P% X" V! T: L5 \! _+ \#include <asm/mach-types.h>9 O; l: B# D5 s
#include <asm/mach/arch.h>' Y, P% A& r% p4 n$ C6 G6 `( Y
#include <mach/da8xx.h>. g: V7 k4 d' r0 j5 y2 P- }8 W6 p G
#include <mach/mux.h>
% t% T2 d( X* p; K
- Z7 h+ X9 q2 }: m) R8 H1 n8 e#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
# L, ` \* `( k: _: W& ]5 ]6 X#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ S3 e! a" C- h6 q' V* f' @5 S7 `5 m#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- L4 V, s" L, h& x- M/ |2 O
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
4 j$ e- K- _$ ^0 T; ]
# K4 f. x6 [- T: [2 j0 x z; f6 X/* assign the tl som board LED-GPIOs*/; Y6 P' |5 _0 o+ a9 G: o+ e6 O# K
static const short da850_evm_tl_user_led_pins[] = {+ u" o' W7 R P5 h0 D$ }+ g
/* These pins are definition at <mach/mux.h> file */; ]" f1 ]. J' a- {+ u" l
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
; M# Y7 A3 W( x -1
; a5 b7 E- o5 \" T& A( J; v# [7 Z, i};
" L4 d( |0 V. N+ B/ _- w# l* W4 @1 O* X& ~2 M/ f. t" G) M0 K
static struct gpio_led da850_evm_tl_leds[] = {
& G7 g) X* ^. T, Q {
U6 A1 g! \8 C .active_low = 0,
3 w( I8 m2 \# f' O+ K, |# w3 r .gpio = DA850_USER_LED0,
( w9 c% C. k& L" { m, U+ ]( u .name = "user_led0",/ E; r+ _: S* v: \' e
.default_trigger = "default-on",' k5 ?9 [6 b5 \: r, Z7 m
},5 r: v+ O8 q8 n
{% [! O9 u7 N/ r. Z( [" T' m
.active_low = 0,. D; f) _1 I! s' k
.gpio = DA850_USER_LED1,
) C' a9 r1 a$ l6 p0 Y' R1 W: K) z& l .name = "user_led1",
/ q1 v* N/ H' V; w. I( j% T% J .default_trigger = "default-on",
8 M& z1 i/ j1 @' o },% t& R/ _2 w; f7 y6 c
{/ s! Z% y) r# E' e0 ?+ J
.active_low = 0,
0 m( Y( I! ~" _. Y .gpio = DA850_USER_LED2,
9 Q* I T4 b T S" Y .name = "user_led2",
( s0 X* I: L2 }) g .default_trigger = "default-on", S( E C: a+ L* }/ z) a- Z0 Q
},0 z6 t9 N( V5 `* H7 K& B
{
' L+ X [) w. a) P- w! |! j .active_low = 0,
# F& h# h8 p* e8 ]) Q/ M .gpio = DA850_USER_LED3,* Y4 u4 k9 U' I
.name = "user_led3",
; p( R9 x2 r2 k+ [ .default_trigger = "default-on",$ f" W: }: b4 i* L1 q' {+ Y
},
2 \, E; b- t2 h$ B- U};: B# G! c7 y# J6 n2 H" z& H3 q) W5 q0 W
0 K# N" s) `$ ^static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
7 w) ?$ X" Z6 r& t% ?& O .leds = da850_evm_tl_leds,
, C5 \# d% t; q8 ~ L' [; q6 |$ x .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* o; k3 g# K9 r+ \- o};" [1 V2 j- }% ~; @9 d( b* Q
& c9 D% l; c1 `9 M% Z2 l7 X/ ?8 S
static void led_dev_release(struct device *dev)
1 b- V" Z- U2 h( ]9 G$ L2 e3 A% m{
, a( R1 }1 o% `: d& K* t2 e J};" R& x; E, U7 x0 N# G0 l
' B! e8 X ?4 `' n# g7 m* Z6 b0 D# N8 {
static struct platform_device da850_evm_tl_leds_device = {% D4 z" U* l) a
.name = "leds-gpio",8 H* ^+ L3 I1 Q g6 D2 e
.id = 1,# V- I% K$ p6 ~' t& D, v3 q6 C- A
.dev = {2 M* y1 T- e* z4 m7 ^4 z
.platform_data = &da850_evm_tl_leds_pdata,+ [, b1 \$ A$ K5 n* y' c, H0 b: [
.release = led_dev_release,+ X/ @% X5 I! r/ g4 t j5 \! U7 G
}" T+ g" x+ _) M- U9 w+ z7 E
};# J7 e2 Z4 w& ?8 @/ b7 b; I( P; j3 I3 T
1 C2 u' ?- h2 Y. ~
static int __init led_platform_init(void)/ H& T% D" x! G3 A
{
" H! n0 }* }3 t K- { int ret;6 p, L+ g* b0 k/ w
#if 0( N! u# P r1 w% t6 B& |# R5 H" G- g
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ G2 T, ]. l3 I
if (ret)
; z% o6 d! |) a pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
/ }, R( J4 S; T* I9 q "%d\n", ret);# W# c$ Y, } ~3 R1 X
#endif: g$ o8 f# W8 |$ E6 C
ret = platform_device_register(&da850_evm_tl_leds_device);
, n r+ X w! d/ t2 g( [ if (ret)
0 N) b8 C# f6 L. i8 p pr_warning("Could not register som GPIO expander LEDS");+ \3 X0 T: y6 U2 B( Y
else/ ~% e( R0 Y K8 d, r
printk(KERN_INFO "LED register sucessful!\n");
+ C- R! ^3 X& s# o8 g, B
' w- T6 }+ p H return ret;
" S q5 h' d: H0 ]( o}
1 }, y5 W. c! c. N6 r' F2 {
. ^0 l. @8 u( o8 I0 w+ p8 q# G) Nstatic void __exit led_platform_exit(void)
/ P) G& X6 }+ P8 k# D4 k{" l' ~! V2 {3 D+ Z1 w8 b
platform_device_unregister(&da850_evm_tl_leds_device);
# d) x! U% ]# e! M, }5 D5 B$ v3 O" k" M
printk(KERN_INFO "LED unregister!\n");- j& ]6 w* |4 b# _
}* F% d# H2 t" `1 X( L
. F. h+ X8 |8 e. ?4 kmodule_init(led_platform_init);
* r4 g+ i4 T5 mmodule_exit(led_platform_exit);
6 Z% p5 W4 k r
4 n+ v" R7 L. E- mMODULE_DESCRIPTION("Led platform driver");
' n$ s4 \4 |7 {. O: @2 IMODULE_AUTHOR("Tronlong");
8 l$ K8 L0 Y( u. W" S8 c! e ^MODULE_LICENSE("GPL");6 c& y4 p" L Y- R6 }
* r; ~& t; L3 t
|
|