|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
" p f3 O& F& C" g#include <linux/init.h>
6 U8 P: P$ Y+ q#include <linux/module.h>! R) D( H A" ]% [& c7 t
#include <linux/kernel.h>
% ^" ?4 u- t# a. x: A6 y#include <linux/types.h>
+ R8 c& |. P& S7 u! H- B#include <linux/gpio.h>
6 K/ U5 @3 w2 ~5 ^* x4 X#include <linux/leds.h>
, g7 @3 H4 {- m$ a' I- u8 F#include <linux/platform_device.h>
: p& w/ ?5 v/ t! }# x, e2 ^6 G" k' l: O+ n
#include <asm/mach-types.h>9 k* g5 e7 q. B8 P4 d' o
#include <asm/mach/arch.h> O2 `$ d% B+ D2 f
#include <mach/da8xx.h>
8 R: e. B% Z# U3 m6 `+ F- N#include <mach/mux.h>
: \/ I7 M0 w5 \* ]! ?5 y: Y7 X) q# C S7 D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% l( s7 s' c1 G7 I: p9 w& ~. O$ m
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) J8 S/ z' b3 R
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ D" @4 I! x' Y* G#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) K. g x/ ^; n' V2 L- w
; E# y5 X- w0 N3 C" Z5 W; Z/* assign the tl som board LED-GPIOs*/
3 M3 B/ L# {" b E( N3 istatic const short da850_evm_tl_user_led_pins[] = {
8 `7 y( F% b& v( N+ k /* These pins are definition at <mach/mux.h> file */
]; {+ @$ m1 Y7 @7 J U" O DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 u h: f+ ?3 I -1
/ |, A+ B" N: r" D, q};
# s" r! ?0 z# C5 e4 d* h& T1 M7 ]
7 j. i3 w6 I$ k$ @, q7 M+ ^* Estatic struct gpio_led da850_evm_tl_leds[] = {- d( Q) H8 b p* w% q: F
{2 s- v1 g5 H3 x- j Y
.active_low = 0, n) i2 ` g3 ~4 _* Z( K( k
.gpio = DA850_USER_LED0,- e! Y' x, z- F5 u9 k: _ M& E$ P
.name = "user_led0",
: G/ I$ r$ h' z0 N$ a .default_trigger = "default-on",$ j A0 h+ ?( H/ r; b- O) V# ~( J
},
* C. ?6 k$ u5 J. e5 {* `* | {( ^! Y) i9 j0 A2 _; K: `
.active_low = 0,/ L0 |% V) _: ^0 v% @ Q2 o
.gpio = DA850_USER_LED1,
; O$ U9 T+ K/ o: Y+ D: `% ` .name = "user_led1",
: b" N" X3 Y4 }- ~ .default_trigger = "default-on",* G- D) F3 D0 c& m0 |4 _$ @& S
},! Z+ T" Q. Y. E5 k$ [3 |
{! y( Y" ]! f, w5 k# |* G" r
.active_low = 0,0 m0 R: n6 k& V
.gpio = DA850_USER_LED2,
3 K3 @) \: k4 K: X& u% i+ O, e .name = "user_led2",0 Z( N* X, M, {
.default_trigger = "default-on",
' a3 l* H+ S8 k% Q# V0 x },
- [" @+ [% D8 w4 s. ^ {
6 T( X. \' r2 g5 ?! E .active_low = 0,6 R5 J& N5 K5 q6 i) v9 t! e' |( {% M! n
.gpio = DA850_USER_LED3,
) w6 K( L" A1 O6 s7 ^) p# ] .name = "user_led3",6 N5 {# B8 O( r' u) ^
.default_trigger = "default-on",, _. {2 c9 ^9 V7 E4 n! r* y
},' k# g2 k. E4 O1 x/ C- M! [+ {
};% e0 k/ n4 w9 F$ U$ p
. |( Z0 b0 `& K9 xstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( I3 ?: D0 I, X5 _6 S: D
.leds = da850_evm_tl_leds,
$ L0 d1 ^4 t1 v0 f! { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 [2 X* y5 b: w! I" j
};
' V, L8 p# E9 F7 m9 B, V6 O; q' p, D" R7 Q b
static void led_dev_release(struct device *dev)
8 g4 Q; O! J2 O8 x{
9 k7 A/ o: h0 U" T/ h) K& x};
/ p7 d+ \' @3 Q( S6 R. Q! h
( r+ D% g4 |2 Ystatic struct platform_device da850_evm_tl_leds_device = {
3 e9 \, G2 v" @, A* Y) P% i .name = "leds-gpio",# U1 `1 m# }( H# H, V4 V
.id = 1,
+ t( y6 |5 M! N/ S4 q0 m2 V .dev = {
# z1 }% ^( |+ @* d, ^7 q/ Q .platform_data = &da850_evm_tl_leds_pdata,
+ w1 }3 ]( R0 ?7 q .release = led_dev_release,. h% f* V& L8 J) |
}; }9 `- z/ n- M* f; P+ B% I8 {) v7 r9 e
};
; M8 s' `+ s6 K, [
+ j! a/ W' N" K# f; L1 y+ k( Q9 Hstatic int __init led_platform_init(void)' w) A, J2 [" [; R+ {, s9 A- N
{
' u Y1 Q& m! P int ret;2 ^. L/ Q' F- q2 r) a& z) m2 m
#if 0
' _8 b- @; z# m) d9 j# k+ ^ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 n! R4 V' Z8 K if (ret)* W6 ]$ ]* f. | `, X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ w/ Q* z: n: i \
"%d\n", ret);8 S5 N% v6 O9 ^/ I9 Y% t, H
#endif
7 t' b x+ D: r) U ret = platform_device_register(&da850_evm_tl_leds_device); d8 |9 A# V2 u- W. p: @! N
if (ret)
( Q% o n( ]$ s/ F. [2 b5 n+ ~ pr_warning("Could not register som GPIO expander LEDS");. I9 F9 }1 A1 U. z9 e
else. z" O. \2 c! `- H5 \& J1 }
printk(KERN_INFO "LED register sucessful!\n");
# I# I* s8 I0 e+ S
' Y4 p, |* P. p7 y. t return ret;
& R/ i5 w; O' I) I) F# u0 C}7 P/ K7 y5 c' h( W/ A
5 Q7 G6 o- Z1 {' {" A& Y* jstatic void __exit led_platform_exit(void)' Z: d/ b d6 n' b% {1 o
{8 _ {9 e! N0 O/ C& _
platform_device_unregister(&da850_evm_tl_leds_device);
8 I9 b7 X8 O6 ~7 f# K6 p+ H3 f' T5 A- u8 D
printk(KERN_INFO "LED unregister!\n");- P9 Y4 L' V. H: c
}
) a/ F7 O& i$ e) A8 s) w7 {" b8 ~, R+ k8 s, h
module_init(led_platform_init);
- R& L4 t1 T. R$ D4 k; M e! vmodule_exit(led_platform_exit);1 i( y) @3 v* g( Q
9 N( _6 ~' q6 Q# Q. o% LMODULE_DESCRIPTION("Led platform driver");# s- r( N* G7 y9 y) P1 S2 W
MODULE_AUTHOR("Tronlong");
; @1 H, e$ l/ EMODULE_LICENSE("GPL");! b! I( H: z7 ~0 F
8 V1 V: }5 k& B4 V2 \ |
|