|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
7 q0 l/ L& p; Z' S6 J#include <linux/init.h>
% _8 O5 Y& O! g5 |#include <linux/module.h>
' E6 ]% T! G& J# o; c#include <linux/kernel.h>
; L4 a2 Q+ x8 Q. V1 W v. V3 Y# z#include <linux/types.h>
8 b, T* ]. N, w P#include <linux/gpio.h>, k b5 U# w6 j$ M5 q/ @
#include <linux/leds.h>
: i' R' @: [& x% j$ m; I#include <linux/platform_device.h>
+ c$ ?; y7 m1 V7 u2 ?- h$ j9 G4 E& N
#include <asm/mach-types.h>( ?9 m. a- w2 [- y7 c
#include <asm/mach/arch.h>
% v+ @ g$ j1 L6 w4 m$ M#include <mach/da8xx.h>
/ _ B$ S8 y Q5 r- Q0 a4 O#include <mach/mux.h>1 Q7 B$ h: d$ t
$ X, t# D5 R# \ h: L#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' c$ K: B( K' ^$ [
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5) m3 F, @2 r0 W; Y1 y& j H+ Q
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)# F/ z& ^* |0 k! T9 h8 ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)6 J/ I8 G/ v" \! R. b9 Q" p$ U! `1 F
1 Q b8 q- i" d! O' e( y
/* assign the tl som board LED-GPIOs*/
. O2 A( L3 }& t- _6 P9 x4 q# }% Tstatic const short da850_evm_tl_user_led_pins[] = {
& B. l4 g" S1 ~" R, l* q; d3 h /* These pins are definition at <mach/mux.h> file */( x$ I2 I M. F* }. W3 [
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
0 D; |. K! f% T" H) t -1) C/ R( K6 G9 s
};
3 b( l% @# c2 X- m/ P6 x5 r
$ p$ t# |# r7 a5 \: M( astatic struct gpio_led da850_evm_tl_leds[] = {; \7 P' n+ o9 ?+ D% @, I
{% ^' ?% r: t* o5 E- v4 t
.active_low = 0,7 p3 ^+ r3 L/ r9 F
.gpio = DA850_USER_LED0,
5 `/ d9 A5 N5 Z, X$ R .name = "user_led0",
9 ] l- Y9 ]# X1 `. Z( R .default_trigger = "default-on",
/ O# L- k z+ F },& v% { g% ~. Q# u
{; z( }5 b; Q8 m
.active_low = 0,
0 J9 g6 H" q% w V9 f .gpio = DA850_USER_LED1,
1 I2 b% M1 ]: _ .name = "user_led1", u; L* u, O0 L: Q1 _
.default_trigger = "default-on",
. S5 F# R% D6 L },+ X+ i6 q" f& l/ l M
{
+ {2 g# [5 }# d2 u' F* t .active_low = 0,
% R: ~- n* [: U1 n .gpio = DA850_USER_LED2,
2 \1 W: f2 W. y$ u .name = "user_led2", W* C. s) B$ h0 D
.default_trigger = "default-on",
5 I' l7 N( `& ~, x! u; P* a },8 x: h8 [" z+ Y( ^9 _/ P* l, q) @
{
: F6 y* s2 }& C8 d .active_low = 0,
1 [& [% x, d0 M. y* {. I. ` .gpio = DA850_USER_LED3,
: h# Q0 _# w6 x% b .name = "user_led3",4 A/ F6 @+ a3 N! h, M7 B% j
.default_trigger = "default-on",
# M% u2 C0 a# q* @3 w* j# z# h/ h7 @ },( v$ Z* l9 z, H; x9 @) Q% Y# g2 V5 K
}; D3 H, C/ |# c( c# C9 @5 U* I$ s
! g. q- p& |$ H% Q
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: ~5 V$ ~: ?4 A' b9 r .leds = da850_evm_tl_leds,3 q' L& P: n/ C5 {5 C. L7 D3 X
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
& c! U# Z& R9 K! ~1 O};2 Q% f- O- M9 s
0 _$ U! Q) w9 C% w7 N, `0 ostatic void led_dev_release(struct device *dev) I5 E0 v0 S: x! ~
{, P6 W- \ v' ]0 v
};# y* N B* J( V+ k9 B; f
. I' ~9 \( r8 Y: g8 ]6 hstatic struct platform_device da850_evm_tl_leds_device = {( O6 e% D3 [) \
.name = "leds-gpio", e& s+ N/ T$ [$ m
.id = 1,5 r7 G2 ?3 s- @0 ^
.dev = {
4 x: C$ K- }& K/ _( i9 n. V+ I .platform_data = &da850_evm_tl_leds_pdata,
: K3 ^7 I2 {$ A, N) v# E .release = led_dev_release," J U) q: F; D& p( Z% Y K
}3 K" c# d( r( _) e
}; s) t( T8 r" y( z: c! R9 f, d" Y5 |
# c1 o% k5 L; W7 S! N+ ~, f7 G* m7 r1 E
static int __init led_platform_init(void)
% q+ Q1 G5 H$ O- ]8 Q; l! f4 W{
- a6 K2 N \, q& J# L: V int ret;
j2 _3 M: j3 o#if 04 V0 b1 r+ u$ E1 S! f
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); i6 [. M2 n( r/ D- j) w
if (ret)
, X) y' l2 c& p7 M/ I pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
8 o g0 M1 {: ~( Y. b( K "%d\n", ret);, M* L' `% ^" D7 r* [
#endif
* k3 E& u) E8 W u ret = platform_device_register(&da850_evm_tl_leds_device);; K+ |6 O+ d) B$ Z
if (ret)4 P$ a( |" W: ^6 r7 P* Y
pr_warning("Could not register som GPIO expander LEDS");
4 [* x" p9 i' K2 f" L else
( ~. Y) k- g9 {, g# N# [ printk(KERN_INFO "LED register sucessful!\n"); S: v& V# M+ B8 t
+ ~" e9 g9 T, E C3 U. c _: L
return ret;% C6 V U1 P+ @1 W, T, n. K) s
}
' o1 Y4 P1 z* w, K* N, [: Y/ I( a& r. n
static void __exit led_platform_exit(void)
8 z8 V6 f* |+ G{
) C4 \) l G( R! G4 Q, t$ i7 \ platform_device_unregister(&da850_evm_tl_leds_device);
4 r7 E1 R% @6 k5 ]2 F
, D! b% B* G) ?6 x5 i# L printk(KERN_INFO "LED unregister!\n");( W7 Z5 J" {# @* |: b
}) J5 z$ S4 q4 g+ ^# u
0 Q, l5 a: N; m# o/ T( z& Kmodule_init(led_platform_init);( L6 {5 x5 C3 ^4 C1 Y4 e
module_exit(led_platform_exit);
7 ]& v' K y5 ]' U/ B9 _1 S) S' i- ^
MODULE_DESCRIPTION("Led platform driver");
0 ~( I% q2 C: f% R0 ^8 HMODULE_AUTHOR("Tronlong");2 G- v: l' t# W. c' c, `3 J
MODULE_LICENSE("GPL");# V; l5 z3 a/ Z
" J* L1 M4 @0 H+ q% j; U ^( E |
|