|
|
求大神给下面的程序做注解,请稍详细些,谢谢。: M' q: X# q5 B* u* @7 X* t
#include <linux/init.h>5 E% R1 |) [7 _0 {& X
#include <linux/module.h>
" n0 b3 o H4 N#include <linux/kernel.h># c$ E+ [8 [; V/ G; R
#include <linux/types.h>
8 a- w) ]3 Q4 Z' V0 b" p#include <linux/gpio.h>( G. K" H: o) j7 I' w1 m
#include <linux/leds.h>
" p& [( c" b: C6 I, E& g% }#include <linux/platform_device.h>' E( K5 Y7 l8 d* U4 i
6 j W$ G# N) P X: s4 r+ l
#include <asm/mach-types.h>
3 C: t0 j) o! R) |, q* H#include <asm/mach/arch.h>7 `$ g4 L1 `6 Z" S# e F" B
#include <mach/da8xx.h>
# o/ x3 F, }4 D; X2 ?4 ~#include <mach/mux.h>9 v% M" m' @+ C" B5 U% t
( [7 O! t* Q6 l: h% j
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* c0 C/ J: a- t
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)3 `: t N0 Y+ M! `7 [, \
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1), J; u; j. N; I3 G
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
i' E2 e; B0 D$ U: q; N
+ w& S* M9 H4 v2 z+ T1 C: H/* assign the tl som board LED-GPIOs*/
, o. Y [) {+ ostatic const short da850_evm_tl_user_led_pins[] = {
+ n# U$ I$ C" l0 |. }( @0 w /* These pins are definition at <mach/mux.h> file */; N1 T" D% G6 ?$ [' H/ S
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,. K0 `% g) L" E; g
-1% a5 D& i j0 X( e
};3 \) h9 `) B& V# e8 m% X
" w0 H, {; n& L! ^3 N3 B
static struct gpio_led da850_evm_tl_leds[] = {
0 P8 y% e" I& J8 o {& l. X: ]9 O9 f8 \1 E
.active_low = 0,9 Y6 g5 G' l5 v$ [; x( [! @
.gpio = DA850_USER_LED0,5 y0 D2 v- R/ I- W
.name = "user_led0",; y& X, V8 b7 s" m6 c
.default_trigger = "default-on",
5 t5 S5 V7 z0 }0 r },1 G5 |. d# R7 o- M7 r$ V
{, [7 V1 F# i$ A# a
.active_low = 0,# L# i! q/ u% }
.gpio = DA850_USER_LED1,
B5 v/ k& f; L0 r8 y5 k8 f .name = "user_led1",
5 d, `7 P9 @% k$ v: m. F .default_trigger = "default-on",1 L7 ]/ X; n) D& D7 E
},6 U( ~. N. C% O- x3 J
{
/ b& V1 ?! l* `/ X4 }1 Y* c$ d; M .active_low = 0,
' D* f" V( F$ | .gpio = DA850_USER_LED2,
7 |- b# E7 @5 H; @ .name = "user_led2",
7 X2 i! G& y: y& |6 z3 V+ V) c& y .default_trigger = "default-on",% S. r0 W. \2 Y6 @, _0 X
},+ u2 X- D) b. H! }2 B
{; V) z$ E" g, Y
.active_low = 0,
' I/ a# c7 W" Z8 ^2 u9 f3 ` .gpio = DA850_USER_LED3,8 w6 {2 b5 G: P& V$ x! ?: M# t
.name = "user_led3",2 |) C, z! u& R$ T
.default_trigger = "default-on",% X+ \2 U+ @. Z! z
},
% ]" N% a7 d) p. j};- h2 d+ g" l5 |4 X3 p
( }1 W. R( A$ o u2 j9 t% M; c! |
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {& M+ _) w# N9 i- C8 @$ L
.leds = da850_evm_tl_leds,
! m# }' r* K' g! g .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ |( u/ v6 T: r};
( v: j0 V/ p N* Y# T
/ s' K, i, d" @" G1 p! A) Hstatic void led_dev_release(struct device *dev)) k% v+ Z' Q7 ?4 b) Y" F% [+ k2 g5 S
{6 s$ e" U& T& G7 F- s: x
};
( h6 n: Q* O! | v. z
/ C3 i1 x4 {! V; B V' v& @static struct platform_device da850_evm_tl_leds_device = {3 |0 j3 {; Q1 o4 [7 D+ h
.name = "leds-gpio",5 |' H' ^6 J) ?- e8 m1 D
.id = 1,
# u& a; |) a+ x- n' R .dev = {% j( }5 o3 l g: Z9 v
.platform_data = &da850_evm_tl_leds_pdata," r. ~" f, d6 f( \, x/ U
.release = led_dev_release," J* L3 ?7 M0 z/ l+ U6 I+ J! }
}3 J% w2 s' Z" n! P. j0 h7 n: ?
};
5 T4 p5 d, b# M) O
8 ?( S0 F6 q# C. ystatic int __init led_platform_init(void)
1 O6 W) p8 h0 K7 Y' h$ s{3 H& F l& ^$ a S- v" l
int ret;
2 y/ l" p0 w0 K#if 04 V& Z! |6 n0 }
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ ~: j4 ~( F8 t$ X/ @
if (ret)
) w9 G' _" d/ A7 h# J pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
" L8 m) |+ u0 ]3 I "%d\n", ret);/ v5 g. c1 ?. V: U6 |
#endif
* O2 [4 i1 h1 y' T L0 x ret = platform_device_register(&da850_evm_tl_leds_device);
0 j ~: o: L8 h% P if (ret)( r7 ^1 T0 S6 c/ } a$ Y
pr_warning("Could not register som GPIO expander LEDS");
% N3 @) `, o# z; f t else& E; v: A# E) ?$ M: \: Z
printk(KERN_INFO "LED register sucessful!\n");
" T6 ^+ `0 |0 c6 @# Q. c' Y8 b- Y p3 p& C
return ret;" |* }' m8 L2 V* G0 D2 {
}' m; A3 j, v/ \6 r7 K6 y; J4 H) g
) W! h8 ]. ?6 a6 p4 A% Wstatic void __exit led_platform_exit(void)
`3 X8 J8 @" A$ e* \3 N1 n{* @6 i/ d2 ~3 ^2 ~; W! v( G& j* Q2 c+ n
platform_device_unregister(&da850_evm_tl_leds_device);- e0 s' {: F. B- D, {
4 Y& a4 w- ~6 h+ l9 x/ T' p, U ~
printk(KERN_INFO "LED unregister!\n");" W. B9 x( |& K0 ^5 j0 ]! ^
}2 E3 v/ y- ]& _4 [1 E' X# q2 E
' X0 ]3 u9 {2 h: `
module_init(led_platform_init);, y, n8 z2 }' x/ u7 L* ?+ y
module_exit(led_platform_exit);' v# x. f. Q: u& @
# b1 a3 J# v2 x" T/ H7 t
MODULE_DESCRIPTION("Led platform driver");
& D; @8 Y$ M( m5 q3 q3 S- rMODULE_AUTHOR("Tronlong");) c7 l: f, a$ \3 v
MODULE_LICENSE("GPL");+ ^9 X! n- o1 Z0 W
4 x9 {! V6 g- x' _+ T1 R7 R |
|