|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
0 a! U1 t4 A, a6 V1 \#include <linux/init.h>1 h0 _7 Q" r& O+ ]2 @( K& V
#include <linux/module.h>% {( b2 L0 w- C0 Q
#include <linux/kernel.h>
3 \* K- d) U% E% r#include <linux/types.h>- V1 u# ~& d9 }6 a+ y+ ~
#include <linux/gpio.h>% v! C2 C; Z1 g
#include <linux/leds.h>/ Y8 Q+ U( f7 l
#include <linux/platform_device.h>
; W2 v/ q6 U0 Y3 _$ Q
% \6 M, B% u7 t#include <asm/mach-types.h>
& \) h: ~9 |; R#include <asm/mach/arch.h>
$ Q( {% B$ _# f#include <mach/da8xx.h>
6 K+ ?; l H' i8 ~( R5 L) u#include <mach/mux.h># G: S2 A$ V& G e# L( P) E4 Q. _" k
) B1 Y$ V/ P' e8 u0 y ~#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
9 A; z( @- N" M5 i2 R5 I, F#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
! l7 x x. ~$ t+ [1 B#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 R q* j1 E- B4 A, E! P$ K
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): [9 n3 c) h, ?' r- {+ n% U
( c8 U* a1 _0 P! p
/* assign the tl som board LED-GPIOs*/
2 S: H ?& ^5 i1 V7 kstatic const short da850_evm_tl_user_led_pins[] = {
3 I' v; A, r) X /* These pins are definition at <mach/mux.h> file */
4 ~( D: S ?8 e+ y. o1 O DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,9 K& @8 R& s4 g3 K& O4 y3 V1 [
-1
% ~' x4 A6 J! N @5 W};" d' j9 z2 p7 {0 i6 a% [! d
9 k* x5 J0 O9 \ ]9 n3 m7 K
static struct gpio_led da850_evm_tl_leds[] = {
& x6 l* J. X b% H& X5 h& N, P {
9 \+ y5 ]; F/ {$ z .active_low = 0,2 x' U7 o8 E. [! Z$ C& v8 k9 |
.gpio = DA850_USER_LED0,
* u k9 G' `" j& C4 T# S .name = "user_led0",& [( H& J. x, H* `, E6 k
.default_trigger = "default-on",: V g! b z# Y- T
},
$ |% P9 [% F* g {6 K( z) D5 ^% b5 w! U: d
.active_low = 0,
+ s# q5 ^7 ~& W" U, j .gpio = DA850_USER_LED1,
+ p. D( c7 P: D2 h1 ]- z .name = "user_led1",1 g6 R4 v5 Q {' ~# _
.default_trigger = "default-on",
4 T+ o8 B* {# ] c) l) c& B },3 ]1 T O: c6 u0 K$ D5 `1 ^
{
" Y+ p) I4 N ? .active_low = 0,
( F& Z1 _& {- a .gpio = DA850_USER_LED2,3 V- y# i0 T5 m
.name = "user_led2",
$ T1 z7 F6 w9 O1 z .default_trigger = "default-on",& a7 w$ E0 H6 z9 s6 t/ s/ X8 O
},
+ i" Z. |6 I; X. i8 M3 L5 s {9 V# y8 q& {, W$ C
.active_low = 0,3 w& _ M! q8 R+ E$ k
.gpio = DA850_USER_LED3,
5 S- C# V q: e U- S .name = "user_led3",5 F. f3 Z# M# T
.default_trigger = "default-on",3 w, ~' T7 R$ z- X( n
},
+ C; W1 M# l5 N! C2 B' U3 @# Q};0 j$ v. k7 C! O& g7 }6 ]
) p9 W' T1 f$ T. M- h7 c& ^/ Tstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; A) Z+ C. `8 z .leds = da850_evm_tl_leds,, b+ l) b8 x1 u$ B6 ^3 |
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ e9 n* B* i6 r; E
};
3 c. r9 I" n3 R+ b
4 b3 S; U* ^2 |) fstatic void led_dev_release(struct device *dev)$ g& n T" \) A, j8 }
{; S7 R) M' F, [; v
};+ q6 @( X- R& z
( ?4 d% Z& r. {7 ~' P& m8 B3 |; fstatic struct platform_device da850_evm_tl_leds_device = {
- x* v/ Y- u% @( q7 T! K .name = "leds-gpio", N, O* l3 j( I. b7 z5 S0 d6 b4 ^9 a [
.id = 1,
9 K$ b E. |0 e" S N+ f .dev = {- h9 u; Q# e1 H2 z- P! V p& B
.platform_data = &da850_evm_tl_leds_pdata,
+ Y' T; ]; j- v. j8 S3 B; H .release = led_dev_release,
: K) A# b5 q1 Q/ R3 n+ F, M h }
" I( v/ z9 F8 ~ K( s) } L};& G+ z; g7 c7 Z2 w( k" M$ g
3 ~% C; O: S0 h6 K& X- t3 Gstatic int __init led_platform_init(void)
2 ?" R) C+ I7 C+ k6 r8 k1 ^' o{0 R$ U1 y. d# F/ d, I: h
int ret;: d1 p' K0 ]9 G3 ^' ?7 J
#if 0
# T G" A" I+ X7 @$ M0 ?6 T) i ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 A) e8 ~+ Q0 V$ V
if (ret), n: s/ _0 f' L. Y4 j3 u: J
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
/ ~6 @) a& F9 I/ [1 w "%d\n", ret);
: x; M6 Z8 w. V9 B#endif9 u3 }# c3 c4 O( w$ H. P
ret = platform_device_register(&da850_evm_tl_leds_device);
0 e4 |$ ~; O. Z5 u( k. S if (ret)8 }3 n! p% W2 Z( B: \. a
pr_warning("Could not register som GPIO expander LEDS");$ i+ m/ T( O/ R) }
else
) `4 I9 U$ G! W p d/ `% q! n printk(KERN_INFO "LED register sucessful!\n");
4 L+ G ]' R2 M( k4 i2 r/ F8 L, B" l8 d$ E/ e
return ret;/ G- ?0 e3 Z3 }: k5 J* |/ b
}0 O5 e! a$ K) S+ E% z7 J4 b
" m7 w: ]1 n4 N" K7 _* n4 a
static void __exit led_platform_exit(void)4 H; n, W2 s# R8 n9 Y
{
: ^- i/ M( H# j$ q1 Z- k platform_device_unregister(&da850_evm_tl_leds_device);
& _: R$ o8 y2 H4 [9 s; c8 {! `3 U6 ?2 h0 y6 k( o
printk(KERN_INFO "LED unregister!\n");! P! @# \, R5 D, ]( S
}
3 p. @7 D& E. T% W1 u4 k$ A3 h/ K- P- f& ]- r/ `
module_init(led_platform_init);% K1 B) n, X* G
module_exit(led_platform_exit);' ~% n0 n3 [, P
* T% h0 ?. I! i3 t2 A6 W! z2 H
MODULE_DESCRIPTION("Led platform driver");
' ?, _. y3 ^9 O" O! j9 qMODULE_AUTHOR("Tronlong");" B3 Q6 R, }+ }4 E
MODULE_LICENSE("GPL"); d: j, D4 l( k; s
# h) C, W' H) K: I9 f |
|