|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
; u0 |9 m, @: D* e#include <linux/init.h>$ j# f) w( G& I8 t1 X$ A( ?
#include <linux/module.h># C% ~- U% l' p+ w' `* B6 Y
#include <linux/kernel.h>( f/ W& g) s; \% x! ]
#include <linux/types.h>) Q+ _$ Y7 @( ]0 q7 N! `, q" o
#include <linux/gpio.h>! U5 ~6 R! B8 I/ d
#include <linux/leds.h>
' z/ N7 R- D1 L8 ]8 \; N' n#include <linux/platform_device.h>
2 I, `0 P, X2 j" |0 e' A; B/ A7 B; `4 s/ }* s
#include <asm/mach-types.h>
7 E. }) X- ~1 m* \( j4 b#include <asm/mach/arch.h>
3 t5 k0 ^. |' Y#include <mach/da8xx.h>4 s3 T, R" P$ [
#include <mach/mux.h># \9 [0 a4 p) [: R& _2 O! L% m
4 t: b5 C! v7 [" e% ]) F/ m# j% R
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) p" R3 q- g- J$ i3 r. e#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 k7 q7 L" [3 m0 q9 t0 n) p/ K#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)7 O' r% g" \/ _- L( w. Y, j
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)9 D7 X5 d! ]. t4 y5 D& C
- }+ G; ?" I9 G4 o/* assign the tl som board LED-GPIOs*/3 ~* C( Y3 f* {" C# y
static const short da850_evm_tl_user_led_pins[] = {- x6 y- t& [- |0 ]/ O r% h7 d
/* These pins are definition at <mach/mux.h> file */0 ?/ j! O: t6 c
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 k7 `7 x1 H0 v -1
) k* a k+ S" g% h};8 v8 D3 R, I' Q1 d0 v/ U+ }
@- @# b8 L* o1 V7 A- o V
static struct gpio_led da850_evm_tl_leds[] = {, I0 B6 i$ F; z* r8 c# a% V; u
{
7 I0 o! k8 O J9 B7 t$ R# `* l .active_low = 0,: n/ S0 ^9 D( ^& {
.gpio = DA850_USER_LED0,7 R5 n7 W! J3 h( `9 E( z
.name = "user_led0",
5 t) B0 W v1 c9 _% F3 p' p# E .default_trigger = "default-on",9 o S& E% N+ y' a/ c2 J8 p
},
' X2 |# \9 `: B {6 r: ~/ @1 E; l3 U5 \
.active_low = 0,
! h! G$ X- c* e$ V/ H& x .gpio = DA850_USER_LED1,
. t z, ?4 h9 f0 t3 H2 P# \ .name = "user_led1",
# b, X7 E8 C/ h. ^6 ? .default_trigger = "default-on",
2 e9 `# o( p4 c7 A$ H6 n5 X2 ` },
3 Z* X2 ]) R4 c( t% R/ r2 i {# t3 T/ Z+ L* x
.active_low = 0,
! _ N* k4 E S8 O! `1 |* ] .gpio = DA850_USER_LED2,$ W% U3 ?, G# Y, x! P9 M! ]2 `
.name = "user_led2",8 c/ T! R* y, r
.default_trigger = "default-on",; C6 g& C. g2 v
},
0 I& Y: P9 ?6 {( B% ]+ K& \ {: W0 N8 R# C4 j& c/ w8 p/ B" f: A
.active_low = 0,/ g2 [4 \9 v6 N7 s6 Y3 _
.gpio = DA850_USER_LED3,
9 z0 y8 N! e: V8 X8 s% A9 P, ?& ? .name = "user_led3",
; o( h$ n+ V' j& R. m1 A& H .default_trigger = "default-on", z1 F1 D5 W+ i9 d, v* N( G4 v
},' A* U/ z7 i( V b% R
};" L! l. S8 v6 j! B, d4 g
: n1 G) M7 M$ A( }( V
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
. x' K2 d4 P% d, Z4 b .leds = da850_evm_tl_leds,
$ V; Q# N2 J8 m& \ ?% O .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 W' {" B0 Q; {/ P% E};& T: b7 n3 [/ j: R. S
3 R& D- q& \# P& }static void led_dev_release(struct device *dev)# o- v8 U; D) a* [3 x2 v
{
7 C, V; G5 _. A5 `4 C};: y8 p1 }, e4 s+ i6 S; k
" d/ g9 _4 q4 F
static struct platform_device da850_evm_tl_leds_device = {2 B& i& l" u0 D. N- _
.name = "leds-gpio",
' u+ R4 b$ @3 {$ e1 i! `. c) \8 c. n .id = 1,
. D& ^5 Y9 Q+ O! ^ .dev = {
/ M3 f5 d; I7 \, O .platform_data = &da850_evm_tl_leds_pdata,
' U# [- v- _, |! E4 X0 p .release = led_dev_release,
& l$ w; Z C p# _/ W }
2 ^7 x" T8 ~( b8 |& J% }1 h};
4 D5 p& {5 ~$ [8 ? n( \% `
2 G; V7 Y! z7 Y D ~9 fstatic int __init led_platform_init(void)
' w9 ~5 X' V; A9 i+ v" u' g W{
' [* n x$ B, L7 K3 M int ret;
9 H! g. d2 _: ~5 w+ g7 d#if 0! m% o3 h/ N, F, V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ |, D: \) U1 k9 _' Q2 V, v$ J Q1 s
if (ret) h; |; |. F, g+ Q2 k9 ^( H
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"1 ^, ]! J Q+ Y5 Q$ t2 L( H
"%d\n", ret);
8 P9 I& Q/ ?% c+ R, K( f& E$ Z# A0 i' a#endif
( M0 d. [/ a& x( C ret = platform_device_register(&da850_evm_tl_leds_device);# |0 i, m! o. y& w
if (ret)
+ A$ d$ I. N7 t1 b pr_warning("Could not register som GPIO expander LEDS");. Z4 k! E/ _4 f- A3 @; L/ Y" X+ j
else
4 y7 Y L0 M+ @! d printk(KERN_INFO "LED register sucessful!\n");
2 i6 s3 \+ E3 Q6 F- W" b0 C
: O% `6 ?9 o2 u6 y8 ^! |; W$ b& U4 t/ x: [ return ret;
& b. R, ~ }0 r}3 p5 `& ~' G6 N
/ F1 i" {! x r& q; r \static void __exit led_platform_exit(void) T+ h" h7 y+ f6 }
{7 t7 [0 h) i" o: e
platform_device_unregister(&da850_evm_tl_leds_device);
& R, `7 K/ r* _! r1 x
9 L; I) J, l$ Z T% ~) W1 u printk(KERN_INFO "LED unregister!\n");
# h; S) g9 E- u) _3 H1 Q}
2 M# p ^5 l0 ?; w$ |
" I2 q# K! L5 O# V2 zmodule_init(led_platform_init); k9 c( O6 t, J! \$ K. p6 `( W
module_exit(led_platform_exit);/ [2 e7 w' e3 i1 v" _( d" p
3 l5 x8 G* [/ E7 s' UMODULE_DESCRIPTION("Led platform driver");
2 l( ^ E: D6 K* {0 u' uMODULE_AUTHOR("Tronlong");: ]0 b* h& i B% f3 U8 B
MODULE_LICENSE("GPL");4 \: q- `4 v+ g4 ]/ [7 x8 b8 W9 W5 G
) g3 |/ H7 a, F! x/ p
|
|