|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% M3 R/ f4 @2 X
#include <linux/init.h>
6 W Y' C8 i7 R7 c#include <linux/module.h>+ |/ r( b1 }! d% K7 b9 f( t
#include <linux/kernel.h>
! I! E u; R9 m/ X0 H3 c" n#include <linux/types.h>
. ]- W9 [9 [; m; w4 @) s/ @#include <linux/gpio.h>5 O, q L) @* D' Q. U3 t7 `$ _
#include <linux/leds.h>
, p: C1 N o! |' Q1 s#include <linux/platform_device.h>4 p4 S5 w: N: j, C2 b1 o3 l6 R
( [5 r# k/ W8 J# e7 P; d#include <asm/mach-types.h>' u+ B0 _% b6 }7 d; z0 s M; k. T7 l
#include <asm/mach/arch.h>
5 s; q9 _3 X9 J+ T! m: ? l$ ?5 B9 A#include <mach/da8xx.h>
. L( ~* C% y) h; J& W#include <mach/mux.h>* D) {6 \- ~" L& p& T- V
9 c+ U, W8 i0 P: {. V# j: Y" X#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 p3 m8 ]% P0 A. W#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, e& m2 V- i" C2 r# I% }#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
8 q, C6 Y) `' `0 U8 L8 E#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 D" c& _- e/ A+ b @' D
4 j* O, _- [! [
/* assign the tl som board LED-GPIOs*/% q4 n$ Y. H- X1 ~; s; o/ @2 {
static const short da850_evm_tl_user_led_pins[] = {5 A, D# t/ Z/ } ?6 @
/* These pins are definition at <mach/mux.h> file */0 i+ ~" l) o- U
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
) ?2 u( w! u1 ]6 ~' E/ x% W9 I -1- O3 i$ R$ _6 O- c% {! d. G4 L$ f
};
0 a4 f4 k9 H, c% \, Q7 @( k6 x2 e0 `8 G, W1 m4 M1 Q- [& }
static struct gpio_led da850_evm_tl_leds[] = {. H% H) \* ]2 a0 y, @0 X' H, ]
{" t; r/ X s# ?8 E4 l$ i9 o
.active_low = 0,0 w. q- j! W3 T% w# S, U v
.gpio = DA850_USER_LED0,8 O4 q+ y" Z: ?8 ^1 Y/ e5 _' U6 ?
.name = "user_led0", q2 ~) ?; U: W8 x. M( |
.default_trigger = "default-on",% N" R. U% M% G* t
},1 B- i+ u$ A- o
{
& Y0 M! l E4 E# p# g" X5 f+ k .active_low = 0,8 B8 m# ^: ?; w9 Y
.gpio = DA850_USER_LED1,9 g6 S, h% f8 Z1 [
.name = "user_led1",+ P1 K8 o- r" v) x; y% z
.default_trigger = "default-on",
% L+ g, Q% i6 x- a, N },
- z5 p& O A1 W8 E6 i! h- X {( j3 I; k( e+ L6 z$ }( B! A
.active_low = 0,+ [0 {9 X% P; A; ]& }: ^
.gpio = DA850_USER_LED2,
" [. e6 v, F" Q' v .name = "user_led2",; X9 R4 O. ]9 O
.default_trigger = "default-on",3 |7 i' m" n' K d$ |2 t
},2 z- j% D7 f0 E: ]7 c4 I
{
& [6 @0 [9 I. j1 K4 f e1 p2 E .active_low = 0,
S6 k2 F: z: ^2 \ .gpio = DA850_USER_LED3,+ k" A5 H( |3 u$ x
.name = "user_led3",
, z4 i7 j# J+ _: Y& o .default_trigger = "default-on",
# ?9 m: P$ A9 a" O8 c },
3 z/ ~- k/ r2 P; v};
: j; k8 V: C3 E* F7 {: I a$ Y+ L# j2 b0 m. I4 u5 O( ~6 I) p
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 N2 z1 i2 J) w0 M: m! u .leds = da850_evm_tl_leds,
& t* x- i7 c4 ?9 q4 [% r .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' o+ F. ^& N! P+ {! V" U}; e; B1 m' R2 L$ x
2 o ^/ C( z1 G% I: d
static void led_dev_release(struct device *dev)
* e4 Q! s5 ]: z{+ D; A6 \' E1 D
};0 q9 L6 d/ ~/ A* v
5 ^" L# z& ^, F l. L( {static struct platform_device da850_evm_tl_leds_device = {
* T$ h. y* r# N) x! S .name = "leds-gpio",
& k( E$ u8 E. v9 w: |1 { .id = 1,
# E) U; I; E9 D3 o. Y2 x% H .dev = {! _, \* D' `- Z8 _
.platform_data = &da850_evm_tl_leds_pdata,
- g, u2 K: e9 s8 i5 a .release = led_dev_release,+ S5 r, l3 v9 t4 V; I& U U
}1 j- t j r0 t$ T/ [6 y. E( T
};
6 k0 v& X) E! ]; D& \9 `( }3 J3 n' h. L9 {( u K+ @
static int __init led_platform_init(void)
2 e, _% X2 Z. u, g/ ~+ O9 p6 w{5 V. {+ \: k5 n4 K4 e* v
int ret;
6 J, T% [3 k8 _$ C#if 0
& p& ^& f9 C3 N ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
* |5 ?8 y( m2 T) b8 p if (ret)4 m- u$ x$ B# o
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 T* c& ^- h" [
"%d\n", ret);4 A6 d- t; R7 Y1 _: t8 W
#endif }( _4 L# [4 H1 X: C4 w; n
ret = platform_device_register(&da850_evm_tl_leds_device);
P$ A! t7 j- Q$ F- x( B, S: N# T if (ret)
* B( B/ c' F' u2 G% t) _/ N9 x h pr_warning("Could not register som GPIO expander LEDS");
" R4 S% u+ w2 ^2 e" J4 ~ else
) M/ x$ @5 H" {* ?! V, L printk(KERN_INFO "LED register sucessful!\n");0 J) V& z' V# u, T8 `3 d' ?+ ~
~" j g2 r7 O" N/ L) Y2 Y return ret;
1 z3 Q0 H4 [- _" S' {! ^}
! t. v3 \4 R, C
; z+ v) j# s% w* ustatic void __exit led_platform_exit(void)" v2 d! P8 Q) z1 Z/ O8 R0 \6 Z! t
{2 V- T7 b |! }6 ~
platform_device_unregister(&da850_evm_tl_leds_device);, P6 P0 `1 O; b8 p% ~
4 a" Z) e) p1 y2 Q" x# ~% N" ~" U printk(KERN_INFO "LED unregister!\n");5 g0 t# j K$ d* x2 w8 Q- p
}; @, F6 ~' u# ?( q
: L/ d. N ], P# wmodule_init(led_platform_init);
@8 k' z R& f: \- G3 Q0 Kmodule_exit(led_platform_exit);
) }3 E _' o( v
3 c$ y( x" S7 q! DMODULE_DESCRIPTION("Led platform driver");
x. p B4 a5 r7 L! ^, M. xMODULE_AUTHOR("Tronlong");4 f0 E! d- X9 o
MODULE_LICENSE("GPL");" F, n4 `. @% O) ?3 }2 @& ~+ k
6 o0 u4 W( }; N( C$ ~' | |
|