|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 n' `* L8 f, p+ R; Z( D
#include <linux/init.h>
' U9 g$ K e+ W/ H& J; y3 \1 _#include <linux/module.h>+ n x x- A0 t* i
#include <linux/kernel.h>/ S# d3 e0 s3 o/ o+ Z0 F) Y$ s
#include <linux/types.h> x2 N9 G5 z1 M* I$ ^
#include <linux/gpio.h>" B+ H7 _+ s, r9 Q. p3 \* _
#include <linux/leds.h>
, E0 B. c. a7 `% X$ x#include <linux/platform_device.h>3 |* n, T8 H% R+ \( ^& |, m
2 n- B& B* ^: c" b& m* z. `#include <asm/mach-types.h>5 ]/ K9 X' b; V- `0 t3 T0 }
#include <asm/mach/arch.h>. l+ o" x0 T+ Y% z- u. c9 \
#include <mach/da8xx.h>
% r' i2 ~- S8 Z# ~6 V#include <mach/mux.h>( b) S$ n" ?. B
. g5 ?. F0 P% j/ X# s7 c5 J; t
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 ~2 N* y' |% p. l; n. V, I
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 e9 Y( N( l1 D. v5 N8 l) `#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). b2 P2 G4 N/ q) S. G! U6 r6 y
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 s3 V/ l" o' D! [% d; l) y2 o" X4 z) N0 E# D" f/ R, F
/* assign the tl som board LED-GPIOs*/3 M3 g+ c' y' H* t' E( t
static const short da850_evm_tl_user_led_pins[] = {+ s- r. k: y* ?& d" [+ b
/* These pins are definition at <mach/mux.h> file */( C6 Z) |5 J5 Y0 K
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
* \# q, h4 d" X4 Z' U -17 L; Y1 `: ~$ \; y- `/ v6 f
};. S" H- o- j5 G; U3 m- r, X
5 X; {" o8 o; f; n4 d! V4 ~9 h
static struct gpio_led da850_evm_tl_leds[] = {
/ I/ H4 X4 i" a! C4 A ~! w9 S {1 r' N# o7 _, o1 c( q* S: y7 ]
.active_low = 0,
) h, \' F; V) c .gpio = DA850_USER_LED0,% h0 d0 }% _# g) j
.name = "user_led0",, T: p1 \9 Q# |+ l
.default_trigger = "default-on",# ]2 y; A1 l( I( u' s9 ?8 [
},& t' E$ N, w) m4 O( T
{; q2 W0 S: N/ `! K" Q4 p
.active_low = 0,$ M1 f. g! K5 N$ B u
.gpio = DA850_USER_LED1,
" l* T" w9 [: W- D0 R/ S/ ?$ p3 x Y( A6 K .name = "user_led1",
$ O6 Q, q& M$ [% _" Y9 A .default_trigger = "default-on",
7 N& C% ^0 |7 a( q/ ` },0 V% n3 r, L! n# M: W$ Y
{
$ V; d5 R4 K x: y2 ^. `, c' q .active_low = 0,3 O {+ p1 p; \
.gpio = DA850_USER_LED2,
) G% B8 I- f' X* B' m7 w a .name = "user_led2",
: K$ i6 R3 a" i: V {# C .default_trigger = "default-on",3 l+ F0 f' c X% s8 ]) H
},
7 f4 Q7 l& O7 w2 w {7 j7 _8 S2 y' ~) e7 w" N
.active_low = 0,
! u6 r9 y, _; Y .gpio = DA850_USER_LED3,
+ `0 c& U" P9 ^ .name = "user_led3",6 F6 r6 r3 w2 X w+ \
.default_trigger = "default-on",
! d4 ^; F5 h8 {( } }, B6 l* l0 ?+ {: E) L
};
: W5 R0 o& J1 r3 n* H
* C& c) M( M+ ]0 Vstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {$ `1 F2 S4 Y$ p2 Q1 G* W8 F: c) T
.leds = da850_evm_tl_leds,
' C" m: \1 h- T' D. D5 b3 L" q .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. R7 u0 { I/ o& [ h5 l};, b/ _1 h9 a( H$ o0 |1 _1 h
% z2 A# \; _, T0 o. |& a' k3 ^8 {static void led_dev_release(struct device *dev)
# x! T D4 n+ [- D" i# ?{
3 q7 {% T+ c U+ x [! Q+ ~4 E};
6 l8 l$ ^) f6 g2 I
# G! G. j* z1 O% fstatic struct platform_device da850_evm_tl_leds_device = {* z& {! |0 y+ \8 ^6 R5 ^# k! }
.name = "leds-gpio",, l, c4 D5 o4 l$ v. Y2 ^2 V+ ~
.id = 1,
4 F' t) i/ C, p ]/ L; X .dev = {
# A: P2 ]. G- B, Y/ I .platform_data = &da850_evm_tl_leds_pdata,
$ }" g6 z% ^0 T0 A. T .release = led_dev_release,% C* I1 T5 J5 b1 I
}4 H D2 ^: z$ F, z8 S, G
};
" P" s. U6 x, A" y! A2 f: G
/ \- Q6 z/ t, c. c; u4 pstatic int __init led_platform_init(void)7 T$ d d* H) i% ]+ x
{
?! F/ V% |+ a int ret;
$ b+ g% Y0 e) _7 v, {#if 0# q/ H4 j' Z) i" ~% C
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' O" d+ f1 @1 {) p) T if (ret)
6 @1 [ z% X1 ^% }5 b pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; u2 q% ^: }/ u1 J( j" k2 _
"%d\n", ret);, ~& j4 \2 M- u7 S
#endif( C3 |% h: _8 ]7 _) q- c) L
ret = platform_device_register(&da850_evm_tl_leds_device);
+ }8 y8 {: P* ^; B* X if (ret)
# b E/ h1 x9 J+ Y' N) j, `) Z pr_warning("Could not register som GPIO expander LEDS");
. a2 @+ f+ P2 F, f- c4 X else
7 T9 ?/ K& H% w. c1 J' L0 ?3 K- P1 W, M printk(KERN_INFO "LED register sucessful!\n");
! z& X: q4 }/ c( p+ V! \5 r7 r7 P w l1 z
return ret;
' o ~$ \& E( g! Z9 r- T- E}! i, r- ~0 s, [1 j$ E: U
. f& w2 T4 C, d/ K6 [( d5 X
static void __exit led_platform_exit(void)
) f% |$ V8 I F' @5 Z5 x& Q; p! q{
5 _* j/ m: B: M3 f platform_device_unregister(&da850_evm_tl_leds_device);
8 f2 _/ ]& P$ U' i. |, b! u
- Y" x6 L9 M9 ~* R d0 F$ K; I printk(KERN_INFO "LED unregister!\n");
8 E0 d( h, K% Y$ J9 d% c4 t5 l}
2 |1 d. u# T* X6 t6 I6 D [0 g$ C. K
module_init(led_platform_init); |" g& R# v7 I$ j5 }, u% {
module_exit(led_platform_exit);3 G. |9 R7 g5 t* ?2 J/ X7 r
( E% f" Y# B4 C6 kMODULE_DESCRIPTION("Led platform driver");
8 b# ?+ n/ b. }9 b9 Z$ zMODULE_AUTHOR("Tronlong");% f8 N! U$ J: Z5 }5 G
MODULE_LICENSE("GPL");
# q$ d3 w9 {* u4 k) R- G: v9 c# {' S/ X1 e
|
|