|
|
求大神给下面的程序做注解,请稍详细些,谢谢。! x5 B! b0 v" D( U6 z
#include <linux/init.h>% Z* U* V# g, q: t2 e8 }
#include <linux/module.h>4 ?" i4 J7 n& i+ ^7 | l/ M- z
#include <linux/kernel.h>
6 I& a. {7 m5 h4 G#include <linux/types.h>
6 c4 h3 C; v6 m2 @5 u. }#include <linux/gpio.h>
& E h2 i* ]; v1 C#include <linux/leds.h>0 b( M8 K7 \( Z7 H8 m
#include <linux/platform_device.h>- g, M4 m6 Z, h# A* G" Z
6 R4 z+ U' ?/ u' @
#include <asm/mach-types.h>
5 G5 P: @) N* |3 }+ C#include <asm/mach/arch.h>
& Z; k5 \6 U9 Y) v: ` l) E#include <mach/da8xx.h>! D, ?3 S) z4 G6 B: R. n
#include <mach/mux.h>: O3 b+ ~) t5 L3 }4 R( _
- t0 l' }& |. s3 q; J9 d& T' T& @' E#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
2 ?5 L5 j7 d, y/ W1 |1 D#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)7 \% P) k) X4 F# p
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
. @3 E3 ?- j K1 s" W#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)9 W! R' [3 g6 ~, l5 |/ G+ f
/ v$ w( {+ J7 I% i
/* assign the tl som board LED-GPIOs*/
) A/ w; f" b. {' W- Xstatic const short da850_evm_tl_user_led_pins[] = {' c% h% ^5 k: M. S- M# d
/* These pins are definition at <mach/mux.h> file */ t4 I9 p' C; D! R2 J9 E* b e
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) M' e& s: Q( O1 V! h) Z/ ?
-1+ `1 d- ]% p3 U4 Z4 o& Y9 B0 D
};4 Q" E, {3 _! d V
6 m, h8 e" _9 v
static struct gpio_led da850_evm_tl_leds[] = {3 F7 |0 J9 S( C) E$ p/ S X
{
/ d( T% q2 ]+ x1 }. M6 {1 j$ V .active_low = 0,
% Y5 \8 T. l: S$ L2 s .gpio = DA850_USER_LED0,
" ]6 D8 N- C. l- R' `# T2 M' R .name = "user_led0",( h: w" `% S$ [, A \4 c
.default_trigger = "default-on",% x% N8 Q# D! [; Y
},1 G( N: l3 V" \0 L* ]$ _
{
/ t* \" t1 A! _- ^* H. N! K .active_low = 0,
& E0 O! i7 s* s Z4 k2 H .gpio = DA850_USER_LED1,
, p5 p* _7 y/ W Y; P: L .name = "user_led1",
' q8 p4 }$ f' \5 m/ c7 p z .default_trigger = "default-on",
6 @+ f. ~* f* O: n9 h# s6 {4 P },2 v! A% I0 V6 U. I$ V5 B
{
/ y1 X8 ?( P" G! V1 | .active_low = 0,+ n( f# ]# K# C( n; h, a
.gpio = DA850_USER_LED2,0 `6 p! l5 m0 {& G( l7 V
.name = "user_led2",9 ]% K) @7 M6 l, r! A
.default_trigger = "default-on",6 J! d% W2 l ^; g8 u* y2 [$ G4 D
},
' W: x. u5 C, ~( R* D {1 M5 z: n( i) e7 N1 k; @
.active_low = 0,! Z B0 X4 X3 [5 w- }0 d7 _, c
.gpio = DA850_USER_LED3,4 r" [$ A! l) Z9 y
.name = "user_led3",
: z8 K" N& T K' _" [: G; ] .default_trigger = "default-on",
& m: g& A3 [1 h1 Y* i },8 o: `. @& R, N/ J
};
( Z( q5 D' S/ A7 u4 d7 y* ?* _/ o% ?7 n* I. X F% ]- I
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {- K3 f, ? |4 W# f! h. Z, J$ v
.leds = da850_evm_tl_leds,7 `- ]3 n* g% z# y" ?; m
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),- ~8 A+ W, E2 _8 F8 t
};& k1 z3 `0 _ Z& [- _: u5 K
8 v' E) @8 I/ P8 ]" ]static void led_dev_release(struct device *dev)
2 P) ?. l9 z! p/ L7 f, H& }{2 z+ C9 w3 W& M
};3 o& n& h. ` e7 Y! G3 w. M U/ }
# D+ A) A( A( P5 _$ g7 u/ pstatic struct platform_device da850_evm_tl_leds_device = {
! l) Z# G! A" j4 G' `( K .name = "leds-gpio",
. o3 q- q( T4 C% Y/ D4 P .id = 1,5 | e* x7 R* t& {* u
.dev = {6 g, o7 X( L, P& \& c
.platform_data = &da850_evm_tl_leds_pdata,
9 B$ r( W" k5 x( u; B7 M+ T9 [" l) F .release = led_dev_release,
$ e4 Q0 X. @. w- { }
4 k) K! G; F3 M8 T$ W/ f}; a3 `8 Z9 E/ c6 H: P7 S
! D- g1 e/ h% @static int __init led_platform_init(void)* p* p6 u( @2 A' ~% |$ T# S
{
8 q: l' n2 I+ w0 j int ret;
( a4 F: u8 _- ^/ w, M9 s#if 0
# B0 ^% p& M% s# u6 ?: F ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
, r, [4 |! f1 R if (ret)5 g2 e; ^# `! O, A9 X4 }
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" z2 F/ q' J1 h1 Y0 q5 S
"%d\n", ret);
- H+ K- D3 n! d#endif8 l+ d L, i8 ~ t$ K
ret = platform_device_register(&da850_evm_tl_leds_device);8 T& m% \/ U: q; O0 O
if (ret)( ?$ C' o- t& X* X
pr_warning("Could not register som GPIO expander LEDS");5 B; `6 L& K- G' f! E. |
else- v% C4 t3 I- C* f' s: D
printk(KERN_INFO "LED register sucessful!\n");" Z! R$ ]' ]- \3 i# Z$ d* }
+ i) s% Z7 P( p$ F+ b$ ^5 t9 s
return ret;- t4 W0 |; ^& H* s
}: u6 o4 a# k% V+ v3 a1 ~
0 F+ b' b( s P
static void __exit led_platform_exit(void)
H- H, e- H+ b8 G5 U' ~{1 Z% R I) K5 m, z- p5 Q5 z7 |: Q
platform_device_unregister(&da850_evm_tl_leds_device);
( u) \* L& d6 @1 ^9 [: z8 @3 j+ O
printk(KERN_INFO "LED unregister!\n");- h% h8 C5 e0 d- `. q; V/ P4 T
}9 [9 K4 u; T! K! t; b# n! H; U
- b# {' K1 v; S' w e4 Zmodule_init(led_platform_init);
3 U+ T9 Z) s: ^1 ]( amodule_exit(led_platform_exit);* o5 a1 e; l5 B3 \) b/ e% J1 q
7 q) X# M: a+ h3 o3 j# V; v
MODULE_DESCRIPTION("Led platform driver");
1 T- b7 p6 V- f8 C% P _! F w' iMODULE_AUTHOR("Tronlong");
. B1 k$ i, B* ^" B6 ~6 }2 w. SMODULE_LICENSE("GPL");
" b+ I7 r5 Z, H& E2 k- x
/ C+ h1 L7 G$ m6 ]' v |
|