|
|
求大神给下面的程序做注解,请稍详细些,谢谢。. p/ y4 u L9 }7 ?' X: Q4 K
#include <linux/init.h>
; }& L; i& q8 o" G v* n) |9 `#include <linux/module.h>
: G* d+ p( l. B w% t* p$ @0 `5 B#include <linux/kernel.h>8 z6 | p5 {3 x# A% c) }3 H
#include <linux/types.h> Q" L" o" i7 Z0 y- ]: r( F
#include <linux/gpio.h>; F) o$ E: y' A g
#include <linux/leds.h>
3 H9 J+ b8 h5 s' X7 ^: D$ A#include <linux/platform_device.h>
1 a5 w3 M3 d M; k! W# S2 N
+ Q! N8 f; Y. C#include <asm/mach-types.h>
! E! m! R. f3 ~! v8 r' A#include <asm/mach/arch.h>
) J/ S3 `) q# ^/ |3 {/ L% a#include <mach/da8xx.h>
& h8 l9 l! z& g* X# k2 j#include <mach/mux.h>
) ^0 c& \$ l3 Y. x8 D
[. l8 d3 F5 T7 h' {#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)) n6 {$ A9 H1 X5 M! }
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& m9 J: ?1 k; W7 T( ^/ k( D#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: h' @# o& \- S( @#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# M% Q$ ?# h- ^! G. W8 w! M
& N& Y5 R2 e1 [- W* s/* assign the tl som board LED-GPIOs*/1 d2 e9 v% l- K
static const short da850_evm_tl_user_led_pins[] = {
, T" p5 h; Y- n1 K) F" K /* These pins are definition at <mach/mux.h> file */
) E l2 O$ D+ G/ D, K1 Y DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,7 Q, k( A3 ^2 E6 \: f( F" r
-17 S6 r* D4 v" Q8 @, w& A
};; |- m- m5 t' @0 O4 b
i" _& B' F. ~* n2 i# h* m
static struct gpio_led da850_evm_tl_leds[] = { h! r7 F5 Q$ d$ u: y, E. m7 Z
{
# K' j7 R- W9 F .active_low = 0,4 `$ _! H; y# D9 C8 A
.gpio = DA850_USER_LED0,
" y$ L p2 J( c' g) m .name = "user_led0", k: i- t7 L" S( s% J
.default_trigger = "default-on",( h/ j$ x; w# A0 W2 u
},' j% O8 t" O+ H& Z$ f
{
7 [; `/ r) Z- M) y .active_low = 0,- K* P- ~- o$ N/ N: T/ a8 u+ `
.gpio = DA850_USER_LED1,
- r# [. t+ [; v3 e .name = "user_led1",
5 u0 M" B6 M) L1 e .default_trigger = "default-on",
/ n: o% P4 U- B& `5 U/ p0 K1 Y },
% i1 \. Y- h, f8 n$ Q {# R) W% T, S+ P2 c: ^; L# Q3 L" ^
.active_low = 0, ]$ ~2 s/ I5 [
.gpio = DA850_USER_LED2,9 ]( c6 ~; E, K# u
.name = "user_led2",8 N5 S- }9 x. j4 S& M
.default_trigger = "default-on", G( N4 Y# f$ Q- `. @- u1 E
},
8 d, ~+ y5 [$ y+ {. ] {+ p; M m q! P( x& H6 e
.active_low = 0,& Y. m4 M, R; V/ U1 t$ d
.gpio = DA850_USER_LED3,% q5 ^% \9 O9 O0 x( i- W% N
.name = "user_led3",
7 Q, w; t0 B) F \! L! t- }% N .default_trigger = "default-on",
& I3 z! u) B3 Y9 A; i9 | },
: }( G7 \2 D0 Y* _};
$ Q r& }, F* c; o% ?9 H# b$ z7 e& a0 o F6 v4 g, b! k& k
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
3 F, q. \4 H+ u7 i .leds = da850_evm_tl_leds,% q. d8 [+ |6 i! Y$ X
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
, J! s' c3 d. c8 ?" i};
4 W" s; g) D0 k0 c" S( _* Z4 u A) ^% q
static void led_dev_release(struct device *dev)5 |" T9 \. U! ~" k
{
" U% n; [7 W4 s# d' y};
5 u" ~5 c" h* ~1 @5 C- P
1 [2 e- z [. k* d( _0 ?. C' v2 U0 ~6 bstatic struct platform_device da850_evm_tl_leds_device = {8 g5 i+ c4 n7 N2 G* \
.name = "leds-gpio",
: h8 `, H5 q! ] .id = 1,
5 M9 G. W; P/ E6 z0 M% X/ ~ .dev = {
% }4 |! |8 ~5 l .platform_data = &da850_evm_tl_leds_pdata,
. U* `' l3 _! Y6 u3 d7 U8 K7 T5 c .release = led_dev_release,! F6 C% `2 E$ B1 \5 z
}
- P" @1 K7 u4 N};
1 l: B+ J! e6 j; h* X
9 I. R5 i! M* Pstatic int __init led_platform_init(void)( J2 m }% ~9 e3 ~% [! Y
{
8 j4 B. A ^5 M7 y9 m! j int ret;. F, M0 O: D& n* K9 p6 p- C( Q
#if 0
* E4 |4 B7 ]% P- {- u+ L ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 d) \: t0 ~3 j4 V. b if (ret)
1 G. v8 |( W9 M f/ K2 u0 h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
4 m! [5 l: }3 L/ C "%d\n", ret);: _8 D# B; \/ v h
#endif6 G1 H3 \4 S, X2 l
ret = platform_device_register(&da850_evm_tl_leds_device);+ w" _- B: U1 ^2 t% E# {( _8 J
if (ret)8 G$ t5 V, \' `2 T# c1 ?
pr_warning("Could not register som GPIO expander LEDS");' n$ W8 ~1 ]2 a1 I/ u. U5 \
else
1 |+ k% H: o6 z! r# E( @ printk(KERN_INFO "LED register sucessful!\n");
. i" v' h/ @! H& u0 M3 I& N
8 R! ~9 y, \5 w return ret;) e2 |; G V6 I8 ?6 J
}8 R9 `! V7 u6 n9 H1 q) P3 Y$ u0 n# ]
s6 L. M5 c; r0 r2 M/ astatic void __exit led_platform_exit(void), s* E1 O& K! H2 u
{- p8 G6 k' f: o& x4 }) N v
platform_device_unregister(&da850_evm_tl_leds_device);
0 ]/ l- ?& h! n' a1 a( n4 {
8 I# i9 `7 m9 T$ F- j printk(KERN_INFO "LED unregister!\n");
) x! t5 o: Z; Q7 j6 D1 Q6 W D} U* Q$ U4 r) o, f" P. u" g- K
3 S' W# \$ b5 N3 P1 i, kmodule_init(led_platform_init);
) E7 H& {+ G' f6 ~module_exit(led_platform_exit);* `0 }) M* e; R$ e' D( y l+ w S4 m. N
" g! t1 |& w. J
MODULE_DESCRIPTION("Led platform driver");* I& D& m& F# u0 G: Y& ]+ g& K! c
MODULE_AUTHOR("Tronlong");/ l$ P- i* w0 y' W& M
MODULE_LICENSE("GPL");
4 W" T7 t) a6 n- |1 f3 Y+ A4 u
% y# o5 Z! ?5 B. H1 l |
|