|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) F5 m/ x' o3 w C0 p#include <linux/init.h>% }% t$ Y7 v# n: b- t5 {0 @0 \
#include <linux/module.h>" |. n3 Q! \% d% D% y5 ?) X
#include <linux/kernel.h>
2 E! m4 o7 M$ {% `+ i* ]+ i#include <linux/types.h>" Q' f3 }+ c9 i' R
#include <linux/gpio.h># g9 F6 `) `" F' ~6 i8 `" ?3 Q
#include <linux/leds.h>
" w2 {: d4 L/ c8 Y8 W( p#include <linux/platform_device.h>& _& |# z+ i# X( J/ i
% d1 x- E9 K1 {4 F! I6 H A Y7 z
#include <asm/mach-types.h>4 _6 G8 L9 N" p% W
#include <asm/mach/arch.h>
" M8 m6 e! w0 ]#include <mach/da8xx.h>
% [# { M$ D3 y0 k# n' `! W#include <mach/mux.h>
& L. W( h( j; k( X$ F- s t6 |3 F, h3 l. r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
: ~8 `, q4 H; c7 V; r& P9 C#define DA850_USER_LED1 GPIO_TO_PIN(0, 5); ^9 W% h$ \ O! ]: {
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)7 B( X; q$ E. ?% m: h3 r- m
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
4 e: @. Y0 S( B( V! X( x/ n) w( Y& y+ H) u
/* assign the tl som board LED-GPIOs*/
: }( m0 z- E& a; ^* a9 lstatic const short da850_evm_tl_user_led_pins[] = {/ c4 h' c% o* S4 i# f! l! `8 _
/* These pins are definition at <mach/mux.h> file */
# ], l, z4 F0 Z( f' \7 L DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! P$ U1 T4 ?- d
-1
$ \5 N% D0 z1 _" \: Z( S};2 h4 d& m2 c; y) Y
6 s; g% q8 }- y4 x! P2 @5 Gstatic struct gpio_led da850_evm_tl_leds[] = {
. S7 L& }" Q' |1 r, }4 D {
/ r3 h9 d) s* U3 O9 U- ]* g/ E .active_low = 0,. a! }3 p; D9 A/ _
.gpio = DA850_USER_LED0,- L) B& m$ X7 ]' \$ A
.name = "user_led0",
* p! h# a+ d6 C* R2 v .default_trigger = "default-on",8 f q, G# D* B
},
" p- e8 j" N1 G5 H {* f7 H2 @) K: a* i- A( F5 A7 D, {
.active_low = 0,
* _7 H2 s$ V5 c& u, V .gpio = DA850_USER_LED1,
( j! `" O9 i& O7 q5 M* ~ .name = "user_led1"," ~& I. X9 z* Q) `
.default_trigger = "default-on",
2 i4 V/ t7 o W' R6 | }, u& E3 h0 E6 ^# J8 Q
{
: \) b) v8 M( r. d .active_low = 0,$ I: K+ z, t, J3 Q* Q! e% j6 R) a+ \
.gpio = DA850_USER_LED2,
/ ^$ p' M% [! V) t# _+ C3 Q9 f .name = "user_led2",- P- ]" U0 h- H* o( r2 p' v
.default_trigger = "default-on",
, t- b) K* B$ o3 v. Q },
7 d4 i8 d8 M: d y7 z8 L) g {+ t* q# d2 o- c
.active_low = 0,
d1 D) A" v2 I0 Z* x; a .gpio = DA850_USER_LED3,
% R: V& w' ^4 |& M `9 `: X8 x1 F .name = "user_led3",
; ^# x; v3 u! d6 e .default_trigger = "default-on",$ J Q" X) P1 K; g W
},. p( _( A8 ^! R R5 D
};- @3 t9 J9 d5 U* _
7 J1 @7 Z6 e! u4 o/ y/ u
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {; o) i$ s) d3 E
.leds = da850_evm_tl_leds,
7 ?. J1 ~' F! @2 @8 n( m. ?, s* J .num_leds = ARRAY_SIZE(da850_evm_tl_leds),! K8 L- T/ O" \& T9 @; T0 }
};6 h9 i6 I8 T2 d0 `( e0 f
4 r- h; a7 h8 b* G) |8 G' dstatic void led_dev_release(struct device *dev)
7 }8 c! @8 O8 Y/ T{
0 g: x4 n0 ]- w9 m};$ J% x1 I8 [ i- p
/ \' r% B3 G. k1 D& L9 }- pstatic struct platform_device da850_evm_tl_leds_device = {
) r; q' [- H* f% Q .name = "leds-gpio",% q9 S1 {8 a z( p& C
.id = 1,
8 R+ G! b: K! q! h' Y7 `: G1 B) m .dev = {
/ e' [5 z; C+ l f/ _! h8 u" } d .platform_data = &da850_evm_tl_leds_pdata,1 l( j& Z+ Q1 s9 z4 ]6 s
.release = led_dev_release,
4 \! b F6 ~2 r% d* W0 i- e7 j }$ T/ E* K% B" T( C5 y9 l
};
+ d; \. z6 ^( @7 s
6 q1 P7 T5 O. ?9 \) I% ~: Y7 [static int __init led_platform_init(void)# k: T7 ~3 A7 Z8 L- L+ w: x
{# J2 }- z" u- @$ A. a
int ret;
# b, I+ j* X7 F2 [* A, t: C#if 0' o. ` T! I4 O V9 p9 X/ x
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
0 `) l8 o$ K8 y5 I2 N! D; R if (ret)
, k; D' m) b2 Q; [* `) w* R7 y pr_warning("da850_evm_tl_leds_init : User LED mux failed :"- C( p" u7 e0 [+ D5 }. N
"%d\n", ret);4 d8 b" t; s3 h- a# ^# M
#endif
# O* M8 r) @8 O) l/ | ret = platform_device_register(&da850_evm_tl_leds_device);
1 M7 I" l2 D1 s if (ret)
% K& @7 H# A5 s1 C6 H( B5 S pr_warning("Could not register som GPIO expander LEDS");
/ [6 ?; |" o) e! ?3 |& _ else
l7 x0 ~7 R9 J printk(KERN_INFO "LED register sucessful!\n");% y' D1 V2 o" g. D8 |
" S& ?* A5 h B7 v1 K5 ` return ret; R6 i$ ^* ~3 ~9 H1 g1 K% M
}
U2 z. V9 F- V& u# I2 s. z) D- I& f3 @+ S- z9 I
static void __exit led_platform_exit(void)
7 i3 T& W4 M3 C4 P# w/ M7 n{
( g/ J9 {2 X" j4 D/ y5 G- b) b platform_device_unregister(&da850_evm_tl_leds_device);
( ]9 K, R b$ s! c8 b, q4 L7 o: j# i8 k& h
printk(KERN_INFO "LED unregister!\n");' |$ N! T, r4 v- h& f7 t
}/ w3 u% h' R p% ^2 [8 D
k0 h' b+ \ L& }. R
module_init(led_platform_init);" w- K% Y( j3 A, J( A! U' N
module_exit(led_platform_exit);
" V6 R4 _ N1 F# e& t8 V! b3 r( B6 I; F8 k" z$ @0 b
MODULE_DESCRIPTION("Led platform driver");6 c; a- x9 v, s
MODULE_AUTHOR("Tronlong");
* P: i1 X: G- VMODULE_LICENSE("GPL");) R5 y; S% R: P1 |$ L; o! d
5 ^" `& n* ~( }8 j G- e7 } |
|