|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* S$ s: i& q& c) F; P. v% F+ v
#include <linux/init.h>4 ~ ^ G9 {4 c+ h$ t$ C& V
#include <linux/module.h>
2 Y! n0 n. N9 F#include <linux/kernel.h>7 n2 H& k' W x/ }6 W
#include <linux/types.h>+ e8 Y% n2 _' W3 @! n: L7 G/ u! H2 n
#include <linux/gpio.h>
( G. d7 ~0 U+ ^3 J+ W6 {#include <linux/leds.h>
$ Q9 w3 t# m: d9 r* U0 c- B, e#include <linux/platform_device.h>
- h" X5 B n6 p8 e4 v
# W" X7 X% e% V& k8 l#include <asm/mach-types.h>' Q3 F# t) J0 Z9 J/ L# ~# z; C
#include <asm/mach/arch.h>: K) p& p+ ~/ @$ P' X) K; t
#include <mach/da8xx.h>
- `4 h- B% W) z1 O. u#include <mach/mux.h>: t% [0 Y( u4 t0 E3 v
+ \9 V' S% Z/ w$ E7 H$ ]7 G#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( h+ f& B. X+ H0 v4 o$ ~1 V. H#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 T) d7 i. W2 R: l9 R) i* X. d7 u#define DA850_USER_LED2 GPIO_TO_PIN(0, 1): S/ C. {+ w5 U9 R
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 C3 ?! ~2 s$ ]7 P) D7 T6 o1 g6 b6 N3 P& K
/* assign the tl som board LED-GPIOs*/, b3 p0 r9 b& \' w5 j
static const short da850_evm_tl_user_led_pins[] = {1 q$ Z3 y) W' F. c- q$ ^, }
/* These pins are definition at <mach/mux.h> file *// e! f) ?2 G3 w5 ^* v$ g) L+ Y) e
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,/ b& P. _2 j. _8 H/ ~+ }
-1$ e9 L% `1 m# J) Z d2 L* d' N
}; N( \/ D1 x3 a9 O# O
$ A6 v- i/ F( ]' T" n' R4 N% x, tstatic struct gpio_led da850_evm_tl_leds[] = {* I1 U8 u- y1 A& `: w- l
{
) f* D" n- Z2 P# b .active_low = 0,
/ Q. h$ O. }9 n( E' g .gpio = DA850_USER_LED0,; u/ ^ Y% O. a
.name = "user_led0",
2 z) z5 R1 J* v" `' p0 Y* p .default_trigger = "default-on",6 w% `( x! S3 g
},4 d) a f/ S( N! U) A; N3 Y9 Q2 R
{
' f0 r3 Q, h* ?, k* B* } .active_low = 0,) O. p& j6 K! |9 J7 U% W+ w) Y
.gpio = DA850_USER_LED1,
! O4 x2 b) H9 t/ L& A .name = "user_led1",
4 K$ D D3 `4 E+ n) n! E .default_trigger = "default-on",
/ c. ^ V- g! m1 m' i$ Z4 g6 ] },! ?6 v* ]( b8 Q% @7 I! i% F
{
8 A9 Y3 x* z+ I3 u .active_low = 0,
2 d) w! Y# Y0 N: p$ q% ] .gpio = DA850_USER_LED2,
' r0 _' K8 g* n( p) x& \1 \( V .name = "user_led2",' R6 _" O7 D) i; I
.default_trigger = "default-on",
' q+ k6 K7 T1 X$ [ },7 U# ]% E8 h& U& t
{
}5 I; ]' p, n" O: C .active_low = 0," C2 G+ l. p0 t& D" r
.gpio = DA850_USER_LED3,, C9 G/ M$ S* z6 F
.name = "user_led3",
8 B2 q" i) {% e .default_trigger = "default-on",- |$ P; \% m! m+ j5 E& D
},' T7 J1 Q7 a4 e' O$ V, @6 z
};% C' ?0 u* m% M4 N
0 G. z" M( z1 w
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 q0 `7 g) s/ ]5 y/ n .leds = da850_evm_tl_leds,8 P0 `& X$ s8 J0 h# N1 \: C
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
0 N) ^. E6 C1 _- D};
7 W- c& `! a a6 ^" C; X* }% X6 n$ Y
static void led_dev_release(struct device *dev)& V9 X' \& R6 v6 f$ W
{
C" Z2 f& E4 Z$ i. V& K};
# _4 [- |, Z) H! b7 I" q: r! N' u; Q' n B2 ^2 ^
static struct platform_device da850_evm_tl_leds_device = {
_) x& C; r6 j. c6 H) |7 T .name = "leds-gpio", }4 d3 l. I9 c
.id = 1,0 U# \3 C7 H5 y+ d9 ?
.dev = {
9 ~; M1 Q/ o5 L .platform_data = &da850_evm_tl_leds_pdata,
1 C3 F1 _" y0 F' d/ f3 B }" v' f( c .release = led_dev_release,* n1 u8 I& \/ [0 E+ V7 s
}( M# u3 E3 \5 S2 ]( Q
};
; D1 a7 S) W$ j, b) |, y7 c+ Q/ Q; e, m2 h9 i- ^
static int __init led_platform_init(void)1 }; F" c: l& O- u( P
{8 | ]( `* \* H
int ret;5 ?( ~, }. [ O0 U: g$ Z
#if 02 W$ G& [ N! v% r3 r! ^- \# I
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
$ M, u1 {( [4 b if (ret): F3 {" f5 M6 _4 z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"4 ?- @: u* G9 @% y8 r* t
"%d\n", ret);
N% {3 u( a; k& ~/ A; Y/ l#endif4 e# C. Z7 D' p$ c; l& c7 z
ret = platform_device_register(&da850_evm_tl_leds_device);
& [8 ^1 A$ X# M) A1 M& Y, ? if (ret). C( u+ D+ e2 @0 x& b
pr_warning("Could not register som GPIO expander LEDS");
' p, E* e: ]& _8 p" `: a; w( z* B else
% G3 U1 G! l2 S printk(KERN_INFO "LED register sucessful!\n");
" F; m, o( l! E2 e; F7 T! |* k$ a1 f' x: X
return ret;/ D5 i0 U; y0 X- B V# B8 N3 I
}7 f/ G! d6 W3 h( O# _& u
. T1 D) u, i$ D6 b* U) {; @! c0 Q9 Wstatic void __exit led_platform_exit(void)
* ^7 t6 {( ~( B$ ^+ H3 _/ ]* t# Z# I2 \{
( x/ w% `& n% ^& s platform_device_unregister(&da850_evm_tl_leds_device);
; i& d5 |+ M4 {& I) |2 v2 Y' O* f
printk(KERN_INFO "LED unregister!\n");
/ T% w; N' i7 W9 X, Q}1 P( E/ q# B v. ^5 p
n4 ^3 [2 o( _1 a4 I: k4 Xmodule_init(led_platform_init);
: I' {) l! k) T& x9 ?; Vmodule_exit(led_platform_exit);8 [8 K b" k8 Y; o/ a
# z( ?- s4 \: Y0 Y, d- r4 D4 H
MODULE_DESCRIPTION("Led platform driver");; y( C7 m2 X' l4 t0 Z
MODULE_AUTHOR("Tronlong");& N6 |9 l! @: s
MODULE_LICENSE("GPL");. z. z5 J; |4 f! c8 @
: z4 ]% z6 N1 z$ F# P7 Y" V; }& O |
|