|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
4 f+ q( i! _, G" j2 g#include <linux/init.h>* U" _7 [! ~) k
#include <linux/module.h>/ n! s7 x, d& v+ d0 j1 O4 N
#include <linux/kernel.h>
$ Z" @/ J& H6 c# b4 V+ e#include <linux/types.h>
$ v! l( w8 Q! S6 V2 u#include <linux/gpio.h>
( B9 G/ {+ j' ]. Z. P#include <linux/leds.h>1 ]9 ~2 s: o ?7 B9 c
#include <linux/platform_device.h>. {, y& i0 F: p& A* `% u% x
8 ~) U/ v8 P: G
#include <asm/mach-types.h>
S3 N ~1 S4 S#include <asm/mach/arch.h>) e( U0 ^5 {2 y8 \! h
#include <mach/da8xx.h>- f! [3 q+ ?$ y4 x
#include <mach/mux.h>/ u; h( \# u! F5 b5 l- r" g
! z, } t; I& `& B; J) p/ L9 ^5 H( Z
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 i& |' }6 T' \, o9 z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
. ^9 r: k* u3 D& \: L- l#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- r1 u0 ^* P) ?0 t3 }5 T% M
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
( E& \- |+ q9 h1 A! D
4 Q& R. X `. M: g! }/* assign the tl som board LED-GPIOs*/
. r5 |+ C, r2 s( t& ostatic const short da850_evm_tl_user_led_pins[] = {
3 D, F" T" T- X! a; z1 ~9 [ /* These pins are definition at <mach/mux.h> file */% c1 c: k, P" a. J) Z8 [
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' k' q/ {1 c2 N
-1
/ I2 T7 [ l% N6 Q2 T0 I};
% Y$ Q$ X* k) ^/ T& u5 V$ z \" S# N+ R" f
static struct gpio_led da850_evm_tl_leds[] = {
4 n" M; u; m% p7 g* }8 T9 n {+ W2 i' V5 |5 w7 s) O$ k" ]' s
.active_low = 0,
6 m. N. Y7 U: i9 g# [ .gpio = DA850_USER_LED0,) D9 k" a" I$ n
.name = "user_led0",
* f6 n8 G' g. J! k. ~ .default_trigger = "default-on",
% A2 h8 ^# E! f6 C% k$ e },& d! S7 n( C" t$ p; p
{
1 k+ ]8 \; g% S$ I' ]9 W4 x( K1 [0 A8 k .active_low = 0,, j8 }7 l' B4 l1 D( B( k
.gpio = DA850_USER_LED1,* V0 ?4 c$ m1 R, ?: ]
.name = "user_led1",
' `0 q* [8 X J) P/ e0 |7 F2 R .default_trigger = "default-on",0 Q3 q9 `7 F- Y a6 u/ Y* y
},* I8 D. Y7 N( D. |& ]+ T: D
{
& k7 V' O5 |7 p .active_low = 0, U! x' D/ o6 m3 p
.gpio = DA850_USER_LED2,
" ^8 [* y, r! R1 k9 M; Z .name = "user_led2",; L' j* l: C8 Y' g4 d- e
.default_trigger = "default-on",
% d5 E* @( {( ~ },
3 S2 \, h4 d3 S! R" |4 G {& {# F v8 s/ z; T* p" y4 O3 d) N
.active_low = 0,8 F% |# ~ K4 @7 @6 C6 T! w- L& d1 a
.gpio = DA850_USER_LED3,7 e w/ V1 R5 |+ _) |3 p" g
.name = "user_led3",
4 T6 D' U. O. z8 o1 g3 G/ c; c .default_trigger = "default-on",
8 D- q6 L$ A+ ~! r0 e },$ Y @1 v+ Q0 [! C
};3 c/ F6 O' w8 `* w- b3 G3 W3 ?
' e4 Q+ S- u. C& S0 R& k( Gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {6 u8 l2 e5 |# V8 C3 e4 P/ `. k
.leds = da850_evm_tl_leds,
: e6 z6 R* F2 X1 J0 Q .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 j, f$ Y( D' a! C$ C1 I};
/ V6 I' c) o" l" l2 s
Z2 l" j% ?$ M% N3 tstatic void led_dev_release(struct device *dev)
a Q( T* W, z2 ^3 k{6 T# u( I t) h9 `1 P! L/ ^
};
- N$ Q' ]# B. }- E8 p! R2 t% K& j
; ]0 `8 y' U( c# q F% j. Y6 mstatic struct platform_device da850_evm_tl_leds_device = {$ x# F- l9 U- G, D1 z" M0 l( c' h
.name = "leds-gpio",
8 K$ A/ P+ `2 i' x0 R. r) A& k .id = 1,, C, b2 _9 b& R3 M1 ~5 i1 I" ^
.dev = {$ P, h0 y8 h# |9 f4 L
.platform_data = &da850_evm_tl_leds_pdata, z1 j. n p$ u* ^" ]
.release = led_dev_release,
" s+ R9 _1 U& F# e& p; P/ b }9 N* ^: E+ h ^0 w* P( E0 L, `- r& V
};
& D3 [# b' v" R8 T! x l
: e8 R6 ~: b3 @6 _, Ustatic int __init led_platform_init(void)
: C/ q& }* x I f9 I+ `{/ f" z A7 q4 \% w
int ret;
1 f* D3 [8 E- ?9 P" \3 x' k1 ~#if 0
]5 f( ~' J0 R& N C" P$ x5 a ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);1 D% n( Q7 c3 b4 S% g& L: @2 c& s
if (ret)
" \1 k/ V" I$ Z4 C! V# J pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
( X/ j+ k! t2 A8 E "%d\n", ret);
$ b! }: K; ~% w- S2 o, a/ }#endif) b2 u k* x E2 u. l: M
ret = platform_device_register(&da850_evm_tl_leds_device);
. k1 Z1 w: n% ~- L* x4 E if (ret)( @+ b$ G4 Z9 L6 @1 ~1 k& ~
pr_warning("Could not register som GPIO expander LEDS");! m+ l8 X, F8 D; [9 Q1 M1 y! a! t
else m, r* Q7 X3 G/ G5 g- E& _! X
printk(KERN_INFO "LED register sucessful!\n");
2 d1 w+ l9 _! m7 m" M: D) j+ A) g
: Y% U6 m. u. v# N9 i ~$ T return ret; f9 Y" n, w' V! e* L% ~
}$ x- [% M/ R% |4 ~( d5 s' ^/ Q3 T
+ l, p2 Z- c" p( T; D2 Q5 d1 r
static void __exit led_platform_exit(void)
/ `0 p6 X1 L! s0 {9 Y{9 \$ _( q8 h" X4 X
platform_device_unregister(&da850_evm_tl_leds_device);: H# O% `5 P! X) ?4 i
2 y2 I. {$ C6 a& J: z9 ]; @ printk(KERN_INFO "LED unregister!\n");
( l, c- m* Q% y8 T5 A$ d2 v' U}4 ?% b2 b* E5 ?' A# t Y3 h
^+ W4 i7 g6 s/ M8 Emodule_init(led_platform_init);
: l- U9 h6 k+ A9 Smodule_exit(led_platform_exit);
& M* ?+ `) Z! K" Z: B1 O/ a/ r. G1 V5 R5 ~. k1 g$ h, r, w1 M
MODULE_DESCRIPTION("Led platform driver");
~. s5 ^# ]9 O- z a7 A/ j: I, pMODULE_AUTHOR("Tronlong");
* x) M* d" _6 t3 H( z. KMODULE_LICENSE("GPL");- v. m- G- f7 P. d6 ?
5 v" K- B( {6 L8 x3 v s# P( g9 K" P7 J |
|