|
|
求大神给下面的程序做注解,请稍详细些,谢谢。9 f: L" r$ I6 ^) A
#include <linux/init.h>4 a" \7 f. L+ I/ s/ |) L
#include <linux/module.h>8 q3 [3 ^7 ]9 r
#include <linux/kernel.h>$ g f+ @- p' z
#include <linux/types.h>% H; E }) Q4 K3 _& E
#include <linux/gpio.h>& F* F4 q8 H U
#include <linux/leds.h>% H0 u# U) D7 C
#include <linux/platform_device.h>
' u' `" U: h ~$ w, w P
5 Y8 I0 x% B) H \3 g& A7 s#include <asm/mach-types.h>
4 Z8 z7 x' g; I/ z#include <asm/mach/arch.h>
9 K) p j8 d$ R$ z3 y#include <mach/da8xx.h>
: m8 t& Y6 n0 s" H0 m) K#include <mach/mux.h>7 h" l8 u& V" T- Y/ _5 V0 @4 ^
) D' [7 `) m! f3 |9 `
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
r4 ?( L+ a4 k: ?#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, d A0 r; I* L2 a! h; }#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)5 A5 y j. K5 h0 r* c0 p
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)+ c6 h7 [5 A+ e: O% X' I) o
P& t( b& _% Q9 T( f- e5 [/* assign the tl som board LED-GPIOs*/5 c2 J- C6 z5 }: p
static const short da850_evm_tl_user_led_pins[] = {
* t: z( B, H! ` /* These pins are definition at <mach/mux.h> file */) r4 x% R. n/ N: D+ G& A
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 W7 {8 L& G: } -1: g' x; a# ~$ K' W- `
};( o# f1 A- S/ g4 u
: Y" K2 m! }* \. u3 [- e
static struct gpio_led da850_evm_tl_leds[] = {2 p& N" H% a @6 [7 c0 u$ i
{, u* a$ K' P: U( k9 h. q3 O. d
.active_low = 0,
6 h; r. ]$ t0 G2 l .gpio = DA850_USER_LED0,
3 P) f3 u. W% R- o. g# ^ u .name = "user_led0",+ p" H. @( K) q, x' G1 U
.default_trigger = "default-on",
- C) g* e, I; Z },; O4 c- M/ }# @, {# L. r
{
4 e, k/ x( K; M: H3 @: J+ v .active_low = 0,6 V3 S! O0 ? ?3 m8 M" g- f
.gpio = DA850_USER_LED1,5 }9 L( q- c3 m, j1 R
.name = "user_led1",1 n0 [# g" z8 }4 G4 Q- m
.default_trigger = "default-on",
|& f) P5 Q4 {: S/ b2 f },( Q. c; @6 J3 g I
{4 ]+ q0 S; O7 w8 V& q
.active_low = 0, e) w" c1 F' m" u. y
.gpio = DA850_USER_LED2,
T) f( X+ F) { .name = "user_led2",: ?& U# }0 s! t D2 M8 \
.default_trigger = "default-on",2 x% X$ I" f, ~3 f# ~. |
},
# B! u9 V* F* s- C1 b3 g+ j {
% l: t9 i+ _" c: e/ Z( Y .active_low = 0,6 t* V6 B/ F0 j' T3 ~: G
.gpio = DA850_USER_LED3,
1 j9 [5 b! f( p# N) L5 g .name = "user_led3", \. z8 R" V4 V
.default_trigger = "default-on",
5 b; K4 C' p9 ^% E3 l },9 [+ O% [* f+ E [
};
# P: G F9 _; C! \& T6 L3 t3 e5 X1 w( L4 S
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
[: I6 b9 R* Z# K5 q2 _% M .leds = da850_evm_tl_leds,/ E# o" E% m, m8 T4 l2 K; ]! E
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),( ~: O8 f' {+ H/ W' j
};5 o/ g- F2 p. n: E
1 w' Z. _$ z& J
static void led_dev_release(struct device *dev)* S+ ?$ W8 T! ~# |& x
{6 J; L3 m# K; |2 P
};" H }" _3 t) u; b
) X# E. j" S0 C, d8 t, @1 P
static struct platform_device da850_evm_tl_leds_device = {
0 e0 ^1 R3 z- H0 Z, D/ t .name = "leds-gpio",5 e/ G8 \1 o6 J v% Y
.id = 1,
9 {4 i# I0 }& b+ H! q/ n& _ .dev = {' V3 z0 q, l& R
.platform_data = &da850_evm_tl_leds_pdata,
. F3 [. H' t; u/ R7 }& I+ r" }7 { .release = led_dev_release,
9 }' K, D6 [) S$ A5 f3 X }$ Z, R, Y1 i8 G+ \
};+ W3 @6 h% I9 w) }, o4 z3 @! K: z
4 Y. [9 \# P$ S" S* sstatic int __init led_platform_init(void)+ A, \0 c5 D9 c+ u
{
- [! M. z% @# o: X; N5 u int ret;5 Z3 q2 b& ?+ H+ ?7 I& Z; Z
#if 0( t- [" X9 b7 g$ W8 w
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ b M: S" ?' q* Z
if (ret), D7 ?/ `- {; l/ ^
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
7 ~6 E, C% x N- v5 r6 c, | "%d\n", ret);
* t1 ~8 g& e, r w H0 p$ a#endif
# g5 Y/ X% v+ g; d5 n. |6 |: S0 b2 X ret = platform_device_register(&da850_evm_tl_leds_device);
0 L& t1 w( G6 W# f7 D4 I& o# k if (ret)1 A$ M; C) c+ }& }
pr_warning("Could not register som GPIO expander LEDS");' u7 u( p2 U) Y6 m9 _
else# ?6 C5 N1 d* N6 D
printk(KERN_INFO "LED register sucessful!\n");
3 |7 c; _, Z7 l3 I$ n4 ^
# v) N. f X* C' h/ E return ret;
! X# j6 T# I- ^' s9 R* \}2 m2 ?* Y6 s8 `9 q) z1 H
: V& P) s) W3 N. \3 h: m5 v
static void __exit led_platform_exit(void)
A( x1 p" n# R1 T{
( I0 H. M% x+ g) w# Z platform_device_unregister(&da850_evm_tl_leds_device);( s$ f4 Z# i% w
- x; z$ g, [6 H# s% }/ a printk(KERN_INFO "LED unregister!\n");6 b0 Y; g, W% I0 T6 v; i
}# \# H8 P c* m
4 M, ?9 v* V+ v6 ]6 E! c
module_init(led_platform_init);
+ H& Q9 m& |5 G- u: Cmodule_exit(led_platform_exit);7 R! d' r+ `- N _0 g
2 X5 {0 K" D, s0 k3 L- G
MODULE_DESCRIPTION("Led platform driver");
) u5 k) i+ |4 R% RMODULE_AUTHOR("Tronlong");
2 |3 O8 `7 d0 \/ w- q: @# |MODULE_LICENSE("GPL");% T) m7 x0 {+ S9 v- i( a4 V! j; @
* U! P' u+ n$ _6 ?- X" [1 f
|
|