|
|
求大神给下面的程序做注解,请稍详细些,谢谢。& t9 i1 }. V4 I6 G( L9 }% [
#include <linux/init.h>1 N" I& ?6 W' V' W+ Z
#include <linux/module.h>9 s2 Q! `9 X! E* ]/ C( y( v
#include <linux/kernel.h>2 `/ a1 ]: D6 J. x- d$ W/ ^
#include <linux/types.h>. ?2 L- w4 m7 P1 S% J
#include <linux/gpio.h>" }: y) I6 k- H; N% m/ N$ k) }1 X7 T
#include <linux/leds.h>: F" H& r: G8 P t0 ^
#include <linux/platform_device.h>2 U. G! W9 j: e" C# A
* x) h' U5 z) ~* Z# u#include <asm/mach-types.h>4 f' G, M1 [* o
#include <asm/mach/arch.h>
, ?. \, n& @) ]5 A/ U#include <mach/da8xx.h>
- g! @6 a& o/ ~; c' E, T4 ~#include <mach/mux.h>
2 K4 v% q0 Z% T% ]9 Q
8 A, e% Q4 ^! T0 e X% O7 T3 r#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)9 e2 q9 h* L c# y7 c" y+ j
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)* d7 X) q0 [! `( m
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)' I3 M2 M/ G& u% o8 ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
S6 L5 f. k( L7 w# J1 b
& j# S2 @9 z" B& R7 {0 @/* assign the tl som board LED-GPIOs*/
9 ~. Y: V# M6 }' {$ astatic const short da850_evm_tl_user_led_pins[] = {- U" f* Z( s) d! `
/* These pins are definition at <mach/mux.h> file */( _+ ^% @& p& W1 y' x# D8 W/ e
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: p8 m; m) k N/ O6 n2 [# Z f -1" l5 H7 G) T; `' I; E. b
};! K' y$ |: p4 b8 L
6 k! |- S5 o, _( w" I) F: D4 v6 l
static struct gpio_led da850_evm_tl_leds[] = { a7 e; F+ [7 {& t, W$ {
{$ J @; s+ M2 b" Q9 h) y5 Y! n
.active_low = 0,2 s3 V* t2 M1 f) x5 o c3 ]
.gpio = DA850_USER_LED0,% `3 G _1 \* T
.name = "user_led0",
1 C3 X6 C1 |- j: `5 k .default_trigger = "default-on",( X: m2 m- F- a/ I w5 Y2 ]
},. c6 R) h' X; C: m2 o; v9 W
{
( I6 i6 v+ x: F, c b .active_low = 0,+ Y* j/ Z6 b. P( X
.gpio = DA850_USER_LED1,4 R% N$ Y/ c3 Y, v4 t/ t/ V3 V2 e, g- t
.name = "user_led1",
1 T5 V" e# w( y& s6 _5 v: x .default_trigger = "default-on",
9 v. A2 ]1 c8 e2 W% @ },
$ j( [% ^5 v8 y, l: Z {
: {1 u" J/ ]+ @1 V5 k- h: | .active_low = 0,
( m/ ^1 ^7 {9 y) s/ u( {1 U .gpio = DA850_USER_LED2,7 a6 ]5 F5 l: K5 K. {
.name = "user_led2",
5 ], }2 d1 b, _ E* a' k .default_trigger = "default-on",
: } k2 {) e+ Q) f( M },
" a' t, J: H4 z: n {
$ y$ q( f& ]8 |8 I2 x .active_low = 0,- p$ m! W- j/ Z0 S
.gpio = DA850_USER_LED3,3 n$ G) [/ i! V& K3 f) T
.name = "user_led3",2 J* k+ [) A5 z* D1 R. v
.default_trigger = "default-on",
" h+ T; f" r# t+ H2 }. {5 L },
" S6 E3 }' N2 s+ A: v3 H% }! i};6 L$ G% J. T0 B0 q
$ e8 E) J8 B% l4 x* n0 ~/ Y
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {: T3 f- i, C& i; a0 J& G9 j8 d
.leds = da850_evm_tl_leds,
/ p" `2 T- m1 _9 U+ ]1 @# U .num_leds = ARRAY_SIZE(da850_evm_tl_leds),# U( M( a* o Y, H# F m
};& W/ J' L8 c6 [$ T" e1 q7 a' b
7 @" o) k, q% m
static void led_dev_release(struct device *dev)
* B' u# B3 y# }3 K! Q# R9 O{
- h0 I8 E5 F& U* s. J};3 r! J' a1 f A6 i* C
- J/ ]1 w; K" }) q2 v$ ]; r7 M- ?static struct platform_device da850_evm_tl_leds_device = {3 [ ?8 ~7 u+ F
.name = "leds-gpio",
# ]' N$ M4 L# Y# l; B6 b y! l .id = 1,
" p* x" |/ N: e; D/ R .dev = {
% \- M; j/ F9 r4 J0 w/ f# j/ } .platform_data = &da850_evm_tl_leds_pdata,8 H1 ^; ?8 n9 V8 }. p7 m
.release = led_dev_release,
i% o# H, i: ] O4 r, @" | }- n. k! v: Z! C& a0 C4 t7 D" q7 k
};, T3 {, }$ }1 H
# x: U Z+ a% ^' u$ a/ J0 k% r; `2 X
static int __init led_platform_init(void)5 [4 Y3 s6 j8 Z& r$ _+ G( N
{
5 l1 w2 S6 n g k6 |% h int ret;
9 ]2 W( o2 P1 g6 r0 j#if 0
; E1 }. ~- U: e% S ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);& Q5 D7 k3 l0 A$ d
if (ret)
4 o* R: k( j% h8 d3 ]' D pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
r) n3 E! e7 k! F/ c3 y "%d\n", ret); Z# i% F* l7 f0 m9 v
#endif+ E* O( ?$ R+ i* ]+ J. o
ret = platform_device_register(&da850_evm_tl_leds_device);( f( f0 @7 }, N8 s/ E" y
if (ret)
! q& D# }' H- g( d; j+ v pr_warning("Could not register som GPIO expander LEDS");% w1 [; \) c, d5 {0 i; A
else
6 Y m/ E) [1 p4 o2 \( J" ~$ L printk(KERN_INFO "LED register sucessful!\n");
' g% o: B0 [+ w$ ]+ T# b- a+ Q- ^( j: i# O( @" r2 @& Q- c: v; n. }
return ret;- l6 F3 u7 i9 W
}
0 o) V5 d+ Q) L& E: e+ u+ s$ g( ~
static void __exit led_platform_exit(void)1 w. r' s# I' y& R( g
{
7 r2 q$ d6 i0 t2 r4 k7 c* M platform_device_unregister(&da850_evm_tl_leds_device);0 K1 L& M, H! `- Z) R
e, M$ v/ E+ ]+ e* h l' i* A* n printk(KERN_INFO "LED unregister!\n");. q: Y( a9 }$ U/ Y+ @3 \
}
4 C6 U4 i6 S8 F
2 c- H" U4 S0 ^8 F1 W$ j: Cmodule_init(led_platform_init);
' M6 J2 {" W2 v, {5 I1 `7 n, r9 G- lmodule_exit(led_platform_exit);
! H) {8 d4 w1 a8 m4 y$ g9 G- |9 c$ f# u. f
MODULE_DESCRIPTION("Led platform driver");
n' s( r) z+ V3 g+ j |5 CMODULE_AUTHOR("Tronlong");
0 `9 ~- |1 G# w4 QMODULE_LICENSE("GPL");% j& Z! ~( U) D2 Y1 i' F
9 E m+ G% L, E; k |
|