|
|
求大神给下面的程序做注解,请稍详细些,谢谢。1 v8 C; d, x" ~' P& I' S
#include <linux/init.h>5 x5 T) r! r3 c9 {& T4 O
#include <linux/module.h>( g, D5 M0 M' Y, P
#include <linux/kernel.h>/ N: s3 W/ G% U+ Y& P
#include <linux/types.h>6 F" g& Q- k3 ^5 p
#include <linux/gpio.h>
' m; _0 v+ U; b6 e, B5 }+ z! w9 C#include <linux/leds.h>
5 I$ A/ B |: V7 z0 h% v#include <linux/platform_device.h>7 Z2 D& O7 E) K3 W3 q0 w8 A( H
) f! G7 y+ s- ~#include <asm/mach-types.h>
! b: Y3 q! @7 y9 s% ^#include <asm/mach/arch.h>1 ]9 [1 u/ H2 e
#include <mach/da8xx.h>) S: P' Z# P+ y
#include <mach/mux.h>
Y$ |0 S7 y1 g, M# v: K9 `0 [( s( K
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% f9 I, w0 n M5 X* {2 U
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) K# Y6 j0 F( ^#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! _. i3 N3 k! h) ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 M" p+ d k k/ W* W' x
& g% ?6 S. v/ h# }% j F0 G, ^/* assign the tl som board LED-GPIOs*/
" {8 f O5 q* q9 r1 V9 zstatic const short da850_evm_tl_user_led_pins[] = {4 J% [; C( B }: X& N
/* These pins are definition at <mach/mux.h> file */
. b1 c, [) J9 I" { DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 Y1 {. }- S9 i, a4 I2 t -1
7 W4 |6 s( z N: A5 e( l};
2 P& `0 P5 r O+ R+ x4 N
$ R K% F2 h% g( b6 H0 Kstatic struct gpio_led da850_evm_tl_leds[] = {
) h9 L5 \; v( j$ G! L- F {
0 k9 g( |+ ?! j3 B, Y0 w .active_low = 0,
6 M7 [+ i& ]! R" V: Q3 [$ e .gpio = DA850_USER_LED0,
\7 b% f1 K" _" o .name = "user_led0",
2 D- k3 Q# O" [( x7 _! \. Y .default_trigger = "default-on",
6 H; `9 I0 r: G! h" w3 X },
5 I# _) W7 T' C2 Y' C {% L: G T; g5 w6 R$ T j+ `
.active_low = 0,
- e; S K6 Q/ m .gpio = DA850_USER_LED1,9 J. s# h+ d9 H
.name = "user_led1",, F+ x) m8 j2 U9 Q& I9 S
.default_trigger = "default-on",
# X s1 r: b3 t. p/ @2 Q },
+ k; u- |+ G6 v% N. V {
) P3 { h; m2 [8 O. d .active_low = 0,2 c* R7 k$ d8 N* S1 @6 H* W6 B
.gpio = DA850_USER_LED2,
4 f. G7 r% X4 T: C4 Y) G$ s# W .name = "user_led2",
, Z4 h6 E8 S5 S# S .default_trigger = "default-on",) J" r% v! { B1 Q' F, C g
},: I* ?4 u4 x8 u; U) m* M0 ?
{' N& x8 d& E# x# ?" q
.active_low = 0,
* {$ |0 f9 D6 ]2 V1 W0 F2 _ .gpio = DA850_USER_LED3,
8 h! Q w4 @" E0 }, C/ w .name = "user_led3",/ A. A2 E( x7 A
.default_trigger = "default-on",! ]+ W0 A$ u4 q: W3 w. o2 {1 x
},( o2 a9 m. Y7 {* @
};
$ o# {' I; g% b, d ?3 j$ F
* D' |5 s' |1 F* _' X5 ustatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
" r+ v* x$ _* g/ x# @ z .leds = da850_evm_tl_leds,
R+ R% r& r. a( k0 ~, M$ P .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
1 ?( Q" B5 x5 @, }};5 C6 m1 ?0 u4 S" n2 U. x8 d- j5 ~
H e6 ?& q3 I; pstatic void led_dev_release(struct device *dev)
: y& E. s! {8 n9 d# A; X1 M{
6 W/ c& f+ D0 r! p};
9 t3 J( u* c7 o. p L
4 M9 n9 S; q0 y! Q6 a& [static struct platform_device da850_evm_tl_leds_device = {' G/ y) R, C% B* \; `
.name = "leds-gpio",
" x1 X3 U" h5 v" x .id = 1,
& K2 \/ K6 {' D6 A5 g, }3 [: M .dev = {
* J. ~. l9 w7 |: Y f7 q+ Y .platform_data = &da850_evm_tl_leds_pdata,
. X/ Q, e. f/ T' H .release = led_dev_release,
! x, E2 I4 r1 S, b3 ] }. y* u; _5 l8 @; ~
};
6 k: w) s0 Y" S2 Y- x& }0 t+ W. ^+ `. {
static int __init led_platform_init(void)
$ {# J% K- Y, z{, d9 ^, D* X6 f2 ]8 v
int ret;$ l6 n5 H6 w! G+ Z8 N. h! B+ X& b
#if 0
# y! h) Y9 T4 v5 H: _) k ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
" H0 O/ P1 G- W/ q0 ~" d1 E3 R9 q5 I if (ret)
: D6 w9 J6 o+ l$ a0 t# J3 ^" U$ m pr_warning("da850_evm_tl_leds_init : User LED mux failed :"% H" Y+ c- v0 @% x, E, \* L
"%d\n", ret);
. k5 y1 Q3 X! b. ~& U, y+ O#endif
8 ^' Z- L/ p/ T0 n+ \ ret = platform_device_register(&da850_evm_tl_leds_device);: Q+ \2 M; C* T% N% s2 \- J
if (ret)3 O2 L* W- E$ W6 a# y
pr_warning("Could not register som GPIO expander LEDS");
! p5 |4 F6 ]+ s. q% Q3 Y7 B else: ?7 |: O+ V2 i- [, m
printk(KERN_INFO "LED register sucessful!\n");
, u. x1 l, i5 `9 @7 e9 Z& _! Y; q Y6 Y# r
return ret;
3 O8 n- f. c0 }, D+ w; k}, b" ^) A, n, w$ f
5 _6 i4 d2 c! z8 I W& j
static void __exit led_platform_exit(void)
$ w) p6 v3 w/ o& U8 X/ k$ Y, h5 n{
4 T+ C" p: }# T# K/ U1 _% t: j platform_device_unregister(&da850_evm_tl_leds_device);
8 o6 y/ w' m6 m3 ?
2 ?/ V0 d5 x# w: o) Y: L+ G' e6 }8 B printk(KERN_INFO "LED unregister!\n");3 O, r+ R2 ]1 [2 T& g6 Z$ s9 H2 e
}
- E# G& ?& f g3 C6 c% I; o
7 X9 i( n. D$ T5 I1 p: v3 _9 D! Smodule_init(led_platform_init);
6 W$ S! L! s$ M, G. `module_exit(led_platform_exit);& E7 u+ x6 }+ b2 Z
: H$ m$ E A' C* A- Z
MODULE_DESCRIPTION("Led platform driver");
5 ?8 G+ R0 \4 rMODULE_AUTHOR("Tronlong");' _ \! T h. P+ U- ~6 d
MODULE_LICENSE("GPL");
1 T* }- E: l9 Y( N: q
' x) v$ A, t4 K$ B. g+ C |
|