|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 x0 `$ [: L/ n1 B' q% N#include <linux/init.h>
- \( b* E$ t& a#include <linux/module.h>+ @8 F& X" Q4 l0 x/ S/ q
#include <linux/kernel.h>& a. T' M0 c& H* B% n% S; \
#include <linux/types.h>1 Z5 M: W8 h' M' t/ P$ G4 Z8 P
#include <linux/gpio.h>1 P: E f* z- M' H6 Z! v! S
#include <linux/leds.h>
5 s+ n; B8 z4 N#include <linux/platform_device.h>
4 v2 b2 L: \ x( n
- j" [& `) N: j b- ?+ W#include <asm/mach-types.h>& `/ k: P4 N# l8 ?7 W, c
#include <asm/mach/arch.h>
1 d5 ~+ \7 {, x#include <mach/da8xx.h>3 J7 z# I" E0 J9 O$ v3 S" P
#include <mach/mux.h>. A: ^6 F! q& ?4 j" w
& T! [6 q+ U% K; f3 X5 d
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
- G. z f( T7 @$ d#define DA850_USER_LED1 GPIO_TO_PIN(0, 5), [. F! y3 E6 A& ]
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
4 o! q8 {9 W9 C4 X% X- B5 y7 f: V#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)1 l6 l% ~6 `/ _4 R B$ J' l, _( G
& a1 V6 X# H* r0 h) O \& Z F
/* assign the tl som board LED-GPIOs*/
2 ]: p0 h) C8 H% X4 astatic const short da850_evm_tl_user_led_pins[] = {
! [# ?8 P* g% s1 \2 M /* These pins are definition at <mach/mux.h> file */ p4 i. S) W/ l1 v+ ?! x- |
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
6 J2 m$ `- X- ] -1
9 O# v2 s) ~/ }0 Z8 n};- `/ k4 ~+ y" _
. K* _1 E% F! W2 f' |static struct gpio_led da850_evm_tl_leds[] = {$ N! ]- f W5 Q+ `* v
{
6 B. S' e+ A5 s# E/ a .active_low = 0,
- n& H9 ~+ K& b. _( I, e8 e$ m N .gpio = DA850_USER_LED0," z7 Q0 z ^& v3 e
.name = "user_led0"," w* i; y; o5 f9 R0 z. @
.default_trigger = "default-on",
! [! p; r& @3 A5 o, v },+ n; f+ H3 o+ w/ r* t
{
4 n+ f1 l( S8 o7 i- L .active_low = 0,: E' f6 F% @; C: E
.gpio = DA850_USER_LED1,
& q( V8 h' t) h; {* V6 I3 H' u .name = "user_led1",# w+ m3 c2 O/ _* N' l9 v
.default_trigger = "default-on",+ `# V' P1 H+ X8 l
},
) S+ ?2 _; c& B- I {. {" i' D8 A1 a9 n
.active_low = 0,5 I, H0 m* \- Y4 O
.gpio = DA850_USER_LED2,
! r6 o5 Z o7 O! {8 C .name = "user_led2",! U, \ G a6 Y& q
.default_trigger = "default-on",( m, t u0 ]: N( ]! D$ o0 c3 K5 l
},# E9 q# I: Y6 ^ |
{
6 S$ y8 y# q0 x6 a! o: F) V .active_low = 0,
# `! L0 o4 D9 U. w8 R .gpio = DA850_USER_LED3,3 G" | m; H. d9 U/ c8 ?4 g$ L
.name = "user_led3",
$ Q8 N( V! p3 W7 S6 R .default_trigger = "default-on",. p3 W; r% O3 T
},4 T* H# z# H; e& R$ O5 f# v; f2 S
};
; y7 I8 E5 { m- L; k2 J# `1 c- m
; {, F$ r9 M9 d) y9 Rstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( `/ F/ _% t% G8 E
.leds = da850_evm_tl_leds,) ?! e. J( z7 y) E w
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),) c6 b; T: F- q# {6 }$ \. K
};
: F; f1 g( M H: }, P
- s9 Y+ C7 j2 I6 d% w9 z% |static void led_dev_release(struct device *dev)
" I# i+ \# E3 R+ w3 ]. ?{; b! ], T& Z+ U4 g" F/ C; G
};8 @9 s, G; p% U7 H4 L- e. V/ S
, s& T S% K, w7 o
static struct platform_device da850_evm_tl_leds_device = {- {" E6 n9 V% X2 }/ `( o
.name = "leds-gpio",
# k5 |" t% R; |1 {5 J1 |' N4 { .id = 1,+ i w# J. p4 K4 j. I4 z! H
.dev = {; z! K$ D6 A4 x, l
.platform_data = &da850_evm_tl_leds_pdata,+ Q3 D) p6 t) b, j1 B2 B
.release = led_dev_release,8 c" r; U% A4 t5 Y
}
3 y* p+ n, V. B4 R- E};
6 k) \9 p7 h$ B7 d% e3 R7 m. Q. i# o# |: w5 n2 D
static int __init led_platform_init(void)3 Y7 C1 u: u/ j/ {
{
8 s$ Z \7 c1 I" v! G int ret;& K6 a% l/ y4 Q9 B, r& t. X
#if 07 q! C# a( Z$ S" F0 k5 q. K8 d T
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
" f3 o* |/ k6 t" A1 N if (ret)+ c. h2 v; h0 u$ K7 v6 _0 b5 H
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"# B; u, I! M& m: n/ D* `' Y6 M
"%d\n", ret);, V5 j/ R& H5 a
#endif
/ B5 ~ s4 b& t& k5 \6 V1 ~ ret = platform_device_register(&da850_evm_tl_leds_device);
. J. V8 P. W: `4 b% A, T( W if (ret)
: t- p' h8 z3 a$ A3 S+ u7 q: V pr_warning("Could not register som GPIO expander LEDS");
7 w+ \6 h& R0 ~0 R3 u+ i else+ m/ c6 t. W) j f+ N
printk(KERN_INFO "LED register sucessful!\n");5 q1 H, K7 |8 s7 P g
' s \% ~3 g! a" a return ret;( ~5 y J" p8 r' h& G) [. {$ r
}
8 A, g/ L% m$ O2 w7 u1 |
/ Y8 k9 e9 B; Fstatic void __exit led_platform_exit(void)7 X$ G& P/ d) \" F, r' S" J
{- q, O" ^! i. U: Z
platform_device_unregister(&da850_evm_tl_leds_device);* B, i8 _3 x, k6 j
1 k8 M2 T: s( Z& c* }1 A printk(KERN_INFO "LED unregister!\n");- U' P' z+ r) s/ u d5 {
}' h% @! f/ c/ c( }6 F4 J4 t. a1 R
0 E; v J9 Z1 i E1 |( e# E X
module_init(led_platform_init);
3 n/ a# {8 B- T* lmodule_exit(led_platform_exit);; Y3 \3 l" i3 r+ `% ~9 c: O6 ^: r( R3 E
! n& ~$ Y% \0 J% R" X" |
MODULE_DESCRIPTION("Led platform driver");
8 ^9 v1 C4 `; `" R2 WMODULE_AUTHOR("Tronlong");$ f# `# j. p$ |/ N! v
MODULE_LICENSE("GPL");9 B5 j3 C/ U1 z% b( o+ X
. H, \7 o0 M& d6 G" f9 c |
|