|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 n5 Y2 o% W- J$ ~- H+ w#include <linux/init.h>
2 w: y I" u; O/ E8 Z+ P: Z; `#include <linux/module.h>! b8 H# X1 o/ a! ^& ^5 _8 o
#include <linux/kernel.h>+ o6 N7 P2 F/ h; z7 J Q
#include <linux/types.h>/ v+ N* a& N6 F5 Y
#include <linux/gpio.h>, d' e* O. a+ o- Q7 A# U
#include <linux/leds.h>- e" o* q, g8 x" Y) P) B
#include <linux/platform_device.h>& u0 m5 O( P3 @! e3 d& S; |6 C
) H) s) k5 U ]1 S7 O#include <asm/mach-types.h>
, Z0 B5 r7 P% n! p3 e, Q#include <asm/mach/arch.h>4 P( ?$ `2 w; B) G0 {0 \
#include <mach/da8xx.h>
1 z8 c# G1 u$ x c; ~# O#include <mach/mux.h>
' C$ H5 P5 [5 @9 \4 d2 A. i
6 G z( R8 ]" z5 |% q5 j#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ z& |" z' ~3 `7 n3 L9 g8 L0 k
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
. T- m `2 R8 ]; v#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
8 t( C' Y, R3 \8 H* f8 m$ k# a3 P#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
0 w; B& { `( k& R* e* M, Y5 Q4 c
) U7 x5 F% Q! {2 i& Q1 Y/* assign the tl som board LED-GPIOs*/
) r4 M+ X& b: @& M# @1 Qstatic const short da850_evm_tl_user_led_pins[] = {" |5 F; \8 t- Q6 o* g5 _
/* These pins are definition at <mach/mux.h> file */5 m6 \+ m6 ^1 R/ \+ `' A8 w6 y
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
' V! G& ~$ V5 i) T9 | -1
# n: y& \$ P, L7 E8 L0 N2 G7 I};
3 V9 D, h1 g% p" g0 c5 Y2 c
0 g1 a$ T; M3 f$ K/ O! y: `static struct gpio_led da850_evm_tl_leds[] = {+ S8 G! t8 `3 f
{/ M: P- n2 H7 A/ S3 h- r7 ?
.active_low = 0,6 d2 B4 c0 V& Z0 t0 ^1 m
.gpio = DA850_USER_LED0,4 d- u$ z% ]9 Y! F, d" |
.name = "user_led0",
; y& J$ T( f5 w, q7 F/ I .default_trigger = "default-on",
, F5 T+ ~% o; Q7 q },8 ^4 r# J5 C# t8 ~
{
: Y" a% K2 y" F, e; s; y: j0 U, v .active_low = 0,
8 [& r4 C$ N- T# D7 R$ _- _ .gpio = DA850_USER_LED1,
% P5 w" T3 E( W9 A) \+ z$ n4 U2 t3 H .name = "user_led1",8 k2 Y" j+ s5 ?/ }2 }8 h& |. s! l/ |
.default_trigger = "default-on",
. b7 D( t( F; E- o! D9 Y" F },$ w- t, h( Z2 i; P. |( j ~
{
, E0 V W4 e1 t) t# M .active_low = 0,+ e2 f1 f8 Y4 h# |1 U
.gpio = DA850_USER_LED2,
% u' h7 Y; y& ] .name = "user_led2",% R8 f# n; g- b( Z! D1 t& k
.default_trigger = "default-on",5 t. C, Z# y1 i# F5 s2 h! z
},
( Y' d6 [3 i" ?- n7 S% V {
$ \% w; F" F# q0 S .active_low = 0,
; ^2 G0 r* ]3 d% N( }5 V2 f! F .gpio = DA850_USER_LED3,
& D M1 B+ ? b! { .name = "user_led3",
4 h z) y. [& A8 h$ a7 v" c( n2 O3 N .default_trigger = "default-on",
4 }1 B( Y; z$ ^. x5 Y4 W },
% L7 q9 b8 F; O}; A- r# G$ u) ^3 ~. Y! Y' f5 h
6 R9 X( `# }+ D/ Q4 s& O
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
O6 L: o% B# A! d3 @+ Q+ N4 Z9 ~ .leds = da850_evm_tl_leds,2 G. v4 q5 D7 o0 W9 c
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
# G- U9 O( S0 n' Y5 T( g C};
' V) O2 p2 F4 K4 Q! d( J
0 X' K8 Q! H% C( }! Lstatic void led_dev_release(struct device *dev)
& I0 z" i9 ? g{+ O- ^: X, M, `$ x( G5 Y
};
# d6 x k( Z( n3 V2 U! B4 k7 b8 r$ m! R9 h& ?3 A& _+ x. }
static struct platform_device da850_evm_tl_leds_device = {6 \9 c/ q+ O3 M7 n
.name = "leds-gpio",
0 y) o, T! {& L' W! M .id = 1,
( B2 C; l- j" X9 W1 z+ \% D .dev = {
6 z H5 o: v0 J: O .platform_data = &da850_evm_tl_leds_pdata,
. F% C2 P+ s% E' T% E0 o .release = led_dev_release,
: `/ f4 p9 ]5 K7 b }
, N$ H0 Z! b& J C4 U$ k( z};
3 ~3 a9 n( x) ]! R: G3 n4 u* I
7 ~3 m, F: B0 o. O4 Y7 T( dstatic int __init led_platform_init(void)
/ a- j v- _, r{
. K1 V% s2 t: u. g: O, u int ret;- v2 B w |! o: u0 K2 }
#if 0- s! o1 I0 _/ A& O/ {& ]
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);, y2 M2 J' y0 m
if (ret)
& \; v& `* {% ^9 f) j2 g. i4 S pr_warning("da850_evm_tl_leds_init : User LED mux failed :"0 H, C7 r7 W8 @. P' G4 `
"%d\n", ret);
* F7 |/ \ J* a4 c( @# H#endif7 \) G0 x. d+ f$ ~, Z: _- r( b9 e
ret = platform_device_register(&da850_evm_tl_leds_device);
) N2 ^3 \: S V& {4 G if (ret)
& v8 Q p* ?' e4 m8 J pr_warning("Could not register som GPIO expander LEDS");( Z& M# h/ E9 z
else8 P- ~; ~+ N+ T! }" @" O
printk(KERN_INFO "LED register sucessful!\n");3 i& L$ B' P# ]0 d+ h
' J, e. b% G6 N3 x( ]
return ret;/ t/ D6 p0 n2 O# x B" P& R
}
$ B% k$ w7 z/ [9 m5 ]- U" r, N* \" a' P d1 ]
static void __exit led_platform_exit(void)
( D5 N* V# C: ^0 u8 u( O{
, g# ^" M* T8 C' H# F8 h2 R0 |- c platform_device_unregister(&da850_evm_tl_leds_device);% f5 o- Q6 n Y8 P2 }" W* ~9 J
* `/ x% C, a; O* U* ^ printk(KERN_INFO "LED unregister!\n");
7 \/ g( [) D1 I}
2 L W2 W7 t) y0 X
* J# V& v; v' D4 n: q% s4 Qmodule_init(led_platform_init);
q2 R5 g" u% T2 X1 T- Zmodule_exit(led_platform_exit);3 {4 K4 F4 {% D4 d# R
1 q2 {, F5 N. U
MODULE_DESCRIPTION("Led platform driver");1 K7 R" E& e% Q; { E; n8 v
MODULE_AUTHOR("Tronlong");
1 z2 |% u T% |$ _ \MODULE_LICENSE("GPL");
& L* R+ U1 I _
# Q: p, \) V: Y& a7 b |
|