|
|
求大神给下面的程序做注解,请稍详细些,谢谢。: M9 a8 c) n) @0 A. K, b
#include <linux/init.h>
: b; [# ?2 J: C$ |9 n+ E8 g#include <linux/module.h>
& s% _! x0 D+ h% t9 e" |#include <linux/kernel.h>% C+ J* ]; z$ X" b" p" @; C6 ~7 ^' I
#include <linux/types.h>. A* y f/ T8 N$ S% B$ M6 U1 u
#include <linux/gpio.h>
! O7 s z* U0 M8 b! r# z7 x$ E#include <linux/leds.h>
8 r- g" S( X- S" U# W- `#include <linux/platform_device.h>
$ T( d1 M/ L' L- `- E; S. v
, O! }5 y: r, f* i4 Q. O#include <asm/mach-types.h>
1 d2 O3 k7 n; E0 T4 F, k& `#include <asm/mach/arch.h>7 j3 |5 N6 y x8 w& j
#include <mach/da8xx.h>+ h2 G0 P, |: a& }: w0 x
#include <mach/mux.h>
- w( I0 I$ j& x' L& X& {7 {' E
, F- {& l6 E3 U$ f: B#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
+ {/ `; n, F8 V" r- y6 b4 r#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)7 Y" \( E) c- y0 l! z9 V* E7 }/ \
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 t' c- q6 y; V0 g% @
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)4 |8 _3 b$ v/ ?/ ?9 t, {, v! T: e
: N- l4 U' E/ l& H7 O/* assign the tl som board LED-GPIOs*/! F; L5 _; c# p# [0 u2 H
static const short da850_evm_tl_user_led_pins[] = {
% @, o6 L$ c! y1 n2 _ /* These pins are definition at <mach/mux.h> file */
2 E2 c5 K$ \/ Y2 p; |9 r DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,9 ]+ C3 G6 @1 e8 }' C) [5 [4 A
-1
1 p+ V, s$ D, f1 I) R% _" U};
8 }% [( C, T9 R, x# [" @* y4 B# A) \( x7 }9 C
static struct gpio_led da850_evm_tl_leds[] = {
g$ k# M7 T* Z; O9 C {
6 Z. r1 V- J1 L1 x/ g .active_low = 0,6 | S. h8 W; B2 B% n
.gpio = DA850_USER_LED0,
5 Z/ Q! j" D& h .name = "user_led0",( S: l6 z3 i9 G# l; E/ m5 ?5 u
.default_trigger = "default-on",
; m) Z) X$ N# S0 z },' k& Y y6 x5 b$ W' Q9 l. y
{
$ V- f# L8 M8 m; e .active_low = 0,
1 W# V4 J1 z( F2 ~% I# k5 Z1 i# X3 I .gpio = DA850_USER_LED1,6 w8 F& N' B% l, ?1 u& @6 d% u+ F
.name = "user_led1",
# [% N& Q, W2 Y; f9 F9 Y .default_trigger = "default-on",4 P8 U% B+ ~4 P, l
},8 ~, G) j4 l; ^) T
{
3 n" z$ X5 z% C# g; n2 N6 K .active_low = 0,
- s9 n }9 W, P; j$ | .gpio = DA850_USER_LED2,
9 Z* M8 g) u9 v6 b7 ` .name = "user_led2",8 d: ^; [% X: E' @
.default_trigger = "default-on",5 s2 \+ g7 @5 a: z
},/ Q" L G2 Y) A8 t
{) K/ k! U3 e/ j$ K# F7 x0 n8 x
.active_low = 0,
5 k5 ~5 E# t$ ?' ~ .gpio = DA850_USER_LED3,
' F, `0 y/ @3 K$ q5 _5 z ^ .name = "user_led3",1 u# C) B2 f1 N$ z7 D3 u& C
.default_trigger = "default-on",$ J) n5 k$ R6 D! l5 h8 X0 j+ Z
},
+ |( d5 V0 O7 @& |) V( M};( [ z& {- _% Q: O# T* Z2 j
- Q- Q0 C! |- L+ T' y3 E% tstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {; P* V+ {$ Y0 i7 _& |
.leds = da850_evm_tl_leds,& \6 n6 q1 s$ k. l2 m+ y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
+ B* s! a k; Y! S1 u" J};# o4 D+ G9 v: a7 J9 a- M
4 b# Q- ?( y+ P
static void led_dev_release(struct device *dev)
- h+ m. F! n! o A{6 S6 `! U0 Z' j% @ {
};
2 X( D& w# z% O9 b u; q, `/ [' ?* f, ^/ v$ l4 K" F: O) z3 y
static struct platform_device da850_evm_tl_leds_device = {
- i r2 |3 W# m: I5 t .name = "leds-gpio",+ E# P2 H% ^9 C& ]' A) d1 s
.id = 1,: V- h6 V0 \/ }/ b$ d+ x
.dev = {
) d2 E) v, t2 {* I .platform_data = &da850_evm_tl_leds_pdata,
' E4 B; d) d5 S, h6 b/ ~ .release = led_dev_release,
8 [6 B, z3 v9 S3 G6 P! X' \ }
0 K- y; V1 _& W2 Y8 }};3 u( Y5 a& Q8 M* Q9 C# p9 q
8 a9 F5 Y1 a( i l3 S) \# bstatic int __init led_platform_init(void)& T* R) U+ i+ D3 ^( ]. u6 h! a3 U
{
3 K( Z- ]" C& C3 [ b1 \ int ret;
" W& v z& ]6 }' S" C$ g#if 0
5 a4 Q7 K w% k; }8 h" L ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
+ f" G7 J# O% k( Q7 J0 v% Q if (ret)
" k& X; |& }( k. {, j6 z8 r pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; P1 ~8 S0 z' r
"%d\n", ret);" z) ?# f, J) @, ^- O; O4 N
#endif
( j4 _2 L2 W8 x. o; x4 z ret = platform_device_register(&da850_evm_tl_leds_device);
, r% B$ g+ e* Z% B if (ret)
' D, \3 e6 E7 a- m% v pr_warning("Could not register som GPIO expander LEDS");
4 L0 H6 \$ j- l, E3 f5 | Z" c else
9 G& U6 t1 \- E q% L5 Z6 P: d printk(KERN_INFO "LED register sucessful!\n");
! s5 Y/ Y- x7 r7 h) s4 F2 c( o/ R$ e0 z. T
return ret;# w2 S. L6 ` K( z
}
0 e" _2 }' I) y* M/ a. N! f' l8 e
6 |- s& K- f8 v* qstatic void __exit led_platform_exit(void)% V4 t$ R3 @' B& ]4 e8 [. x B
{
; P4 m. H, |! q, e$ q+ W7 }. \ platform_device_unregister(&da850_evm_tl_leds_device);+ H% y! \# V1 ^9 x. d( J! R
6 B- \: m' G2 n8 E, V printk(KERN_INFO "LED unregister!\n");% ~( ]) L; b- I& y. K S1 H7 o! k
}
0 O4 \, Q3 V8 Z- P' W- J" Y) k
" z& D4 F! ?0 P1 B3 Lmodule_init(led_platform_init);/ m3 h' [' m, i$ C. [4 ]' \
module_exit(led_platform_exit);2 @0 p2 S: c& ^, Q
/ p2 M7 @, Y$ _. P
MODULE_DESCRIPTION("Led platform driver");3 L, N( m: H- r3 e) k+ E# J
MODULE_AUTHOR("Tronlong");. U' W- I0 H. ^! b+ n" R
MODULE_LICENSE("GPL");" M# z5 E9 v5 Y. W6 \4 Y1 h
; N- j, m+ |% J& [) t |
|