|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
5 r; W @5 c1 W6 a& a#include <linux/init.h>
0 b0 K1 R$ m9 X9 z#include <linux/module.h>
# r* ^, y# h+ o; g" w6 e" ^% W# Z7 U#include <linux/kernel.h>
0 R3 l) h5 [( j#include <linux/types.h>
( i! G) s, a$ z#include <linux/gpio.h>( k- m" j3 O- l# \; u/ H2 U; s
#include <linux/leds.h>* v& G# n2 Q6 m) A5 k
#include <linux/platform_device.h>
% I1 {/ Z7 o# `4 N+ u/ T* ]: B L4 J9 U* z! a
#include <asm/mach-types.h>
- _& x# F( L6 w6 h4 P: e4 O: y#include <asm/mach/arch.h>" I3 X% l* i6 E9 p V M' S- K
#include <mach/da8xx.h>7 e4 e% e; P2 \ q/ U* q9 V' E
#include <mach/mux.h>( t; N& s, o! ?& y
. k: W# e0 L& V9 L. s1 N- _! A* j+ [#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* b& A9 v- s2 E& n8 q
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& p L3 w% R/ ^( l/ ~
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 O7 F! V% y6 u% g Q#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 ?, Y# T2 F6 {# Y' U0 r
7 P& r" N; M. ]6 X! O/* assign the tl som board LED-GPIOs*/3 @9 V, [# X/ d d& D! a* _
static const short da850_evm_tl_user_led_pins[] = {
) U+ g( U& ~% h0 S& G /* These pins are definition at <mach/mux.h> file */
2 A- L( p: W# ]& |0 i' w DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
1 V/ \5 u; Y- b! M7 [- D -13 |7 r- i) T' a; ]& }% l2 E' Y
};, E$ E" W+ ]! X$ L6 C
3 E! }6 O" ]* a) E( S4 d/ Sstatic struct gpio_led da850_evm_tl_leds[] = {! j0 L% G1 n! V9 c
{# W6 V* W& o8 ?) H; Z
.active_low = 0,4 h- k! i& K# D6 a7 y6 H
.gpio = DA850_USER_LED0,
$ p* Y3 j; S) L7 h) x7 A' V .name = "user_led0",
/ B: X9 ~5 S" P) ] .default_trigger = "default-on",
( ]( h( d5 A* a# k },
* W( U- {* Z: \% R {! _0 l1 j7 F4 D$ ^# H1 W' M
.active_low = 0,) t$ @2 l+ i; {
.gpio = DA850_USER_LED1,+ C5 Z9 n; p: C: j' {3 D
.name = "user_led1",
& w- }' `5 j8 Y3 R6 _" q .default_trigger = "default-on",. o. b, W/ M: _3 [
},
6 E: J9 c x6 U, n! B% C9 v4 y {
3 X/ l7 A& G" F* n .active_low = 0,8 i [' X0 Q, M+ W
.gpio = DA850_USER_LED2,: b2 \; K1 ]0 l0 |
.name = "user_led2",: X8 ^$ K) ?( R' h& x! j
.default_trigger = "default-on",( ^" l! p! k: ?3 G! F3 p& `
},
5 q6 L, L; T" P( x& u0 A8 } {: x5 _* V/ C+ S, _& G
.active_low = 0,
: v0 \8 O; d+ ]) ? .gpio = DA850_USER_LED3,
1 j Q5 A! V! D4 M3 ?3 E( c .name = "user_led3",- h3 F# E/ G0 ?. V
.default_trigger = "default-on",: ? z: L* c' B& U
},
! D* i% m, S3 l, b9 F. D7 e};5 B2 \2 w! X) [0 v
! v# A/ P. |2 E0 h% ~static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; L$ M7 [0 S5 y- r* s5 P .leds = da850_evm_tl_leds,$ I/ u# |+ w" a. |
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),* o" \, G( b& {2 L( [% m
};
: d! ?# d6 U1 }( b" ~- ?! w4 ?) t4 f
( q* p8 \ D/ h+ B3 estatic void led_dev_release(struct device *dev)2 j* w* {2 e+ V e( ]; _& r
{8 {, x! C' K& f6 N0 T3 X( q
};
! a! G h/ u" X2 C, d* ~; o8 [5 e z0 W; F8 r8 ]
static struct platform_device da850_evm_tl_leds_device = {* C5 O+ m; U7 u/ B7 P
.name = "leds-gpio",
* p3 t3 e9 d/ R# T! @3 v .id = 1,
2 _7 c; c1 j2 D! a$ K6 f .dev = {' X. r# ]/ o* C. Z. m
.platform_data = &da850_evm_tl_leds_pdata,
, B7 b1 J9 d. W: ^; l b .release = led_dev_release,/ J4 m$ m+ z' y* P$ m' O/ V
}, l- o; d7 {' d6 L
};& ` r& ], `9 b& N! ?- m
1 r6 b) q7 D; Lstatic int __init led_platform_init(void)
+ u: J, p' z( y0 y# S' O{1 v' o0 t/ l! e5 f
int ret;
, F8 m6 l6 S T [% Z# R9 f" q$ _#if 0' V1 a! b) O5 a* f( ]
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
# A u) O* R7 j& n& V* O if (ret)
z+ u5 r- f( \ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
" h- p( P3 Z" W" ] "%d\n", ret);0 L( S" i; q5 z. f/ w
#endif, {9 K; t/ Q1 l6 }1 o
ret = platform_device_register(&da850_evm_tl_leds_device);
- o; K8 _4 v8 v2 P if (ret)
7 O; Z9 s2 R+ D" T4 a- C: G0 X pr_warning("Could not register som GPIO expander LEDS");
4 g( q! S/ j) K else: F) _$ C5 Y( Y; x" I5 | c
printk(KERN_INFO "LED register sucessful!\n");; l* E# l+ B$ n' L) ^ r0 k7 R
& [6 }+ t& e8 h+ L
return ret;
; R! g$ ~# Y: K! j! l9 ^+ F}" l) k2 g7 G2 G; |6 R& w
/ P' u4 J( h! S0 _/ J
static void __exit led_platform_exit(void)3 e& v6 i* |8 a7 m9 Q* H4 o; y
{+ @' K1 v# s4 n' b& \% g: j
platform_device_unregister(&da850_evm_tl_leds_device);4 r" i) ?1 I8 ]0 f. j) h: ]/ _
. n3 f! |+ ^9 }- f7 L2 m
printk(KERN_INFO "LED unregister!\n");
* v4 ?, H" m& ^0 n2 q6 O}
" B9 b' \0 H8 h6 r# r; B5 A8 O: N3 T5 h8 n
module_init(led_platform_init);
3 l( d' u$ n# Rmodule_exit(led_platform_exit);5 i$ w- {+ x0 U/ ?! f7 A V% ~
! |2 B- w7 B- d+ J( l& S, mMODULE_DESCRIPTION("Led platform driver");: M) O2 }! Y7 C C: M9 Z, h* v
MODULE_AUTHOR("Tronlong");& k+ r. h( O7 @1 W/ X
MODULE_LICENSE("GPL");
9 L. X8 C ]. v' {& Y
& i! R1 e) y- C) H9 w( y* B, O' t8 V |
|