|
|
求大神给下面的程序做注解,请稍详细些,谢谢。1 }% b( D2 D6 j( B: ^2 h
#include <linux/init.h>
3 G) E/ z5 H) I5 ^8 H' M/ i; t7 F V#include <linux/module.h>
6 O! d* J9 C* y2 b4 T#include <linux/kernel.h>' F3 F8 b+ O- I# v# F
#include <linux/types.h>
/ r% F5 m2 Q* t7 d% G) }#include <linux/gpio.h>
( z" w$ A& f4 @) Y1 O0 `3 ?: ?4 s1 u#include <linux/leds.h>
. \0 ^2 v$ _( R4 D4 e7 q# l#include <linux/platform_device.h>2 @5 h1 K. n% D4 ^
5 I4 K; t: I7 Q% i, ^6 n4 q8 s#include <asm/mach-types.h>
$ M2 e+ j- l# V. L9 R- q, Q#include <asm/mach/arch.h>
, f; {$ u% u% K/ s9 L' z#include <mach/da8xx.h>0 M( V" \& ^ k: U+ v
#include <mach/mux.h>. k1 w" r+ i( F/ d' }
! ]$ m- |# U9 ?8 A# a7 n8 t: @
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)) _4 T3 M$ o2 v6 y8 \ F; b4 }. ^
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 t1 @1 J0 T/ `
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). L+ h* w7 z3 @2 W; W, t
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)" v; Z# {" x. l D- w0 B
* P: F' \/ s. Z- Y- a- q/* assign the tl som board LED-GPIOs*/9 R3 J; P% ?& Q' q
static const short da850_evm_tl_user_led_pins[] = {
7 ^# J4 J; ? L/ O Z6 D6 p- t /* These pins are definition at <mach/mux.h> file */
2 ^% a0 G. d; W7 G$ P3 _# v* ~ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' r* A, g& }! ]9 _+ @
-1
* ~% N4 A& L( O7 r+ N1 G( Z};
6 ^4 c; |8 h2 u- G- q# q$ h m& Y+ y- M) w
static struct gpio_led da850_evm_tl_leds[] = {! }9 e3 }: x5 N% Q6 ?
{8 X$ H+ C- K/ k8 F- H# L
.active_low = 0, ^3 r8 e% T$ M0 Z( F, ~
.gpio = DA850_USER_LED0,! e, Z9 ?4 w% O; d4 f3 J+ d
.name = "user_led0",5 W" L* q: F0 e
.default_trigger = "default-on",, Z; o. d5 j* E
},+ \! K+ B( P/ C: Y o$ g% o: f/ ]
{
( a8 P3 x/ S5 E+ f! S .active_low = 0,
) j# x% b# w" C' [ .gpio = DA850_USER_LED1,2 y& P8 o8 E+ t3 _1 `& E
.name = "user_led1",1 m$ p1 K% U4 C; U" x9 N% H% ^4 n
.default_trigger = "default-on",
* V% A" [; Q. |1 Y },& C' e/ p; [$ O% ~: P6 P
{
& X- H( b% M v- t .active_low = 0,
9 u/ ]. O" j# H1 _" t3 H .gpio = DA850_USER_LED2,9 M4 e% ~' l3 W0 M
.name = "user_led2",
. y# ]; ~8 i% X0 O9 O1 b; | .default_trigger = "default-on",4 w7 W7 c6 j. u4 L/ v
},' i: U8 Q/ L- G( S
{
+ U8 ^( G* n" P) L. q z% n/ X .active_low = 0,
k" c: ?: P" S u .gpio = DA850_USER_LED3,
, `- ?7 Q0 X) F A* [) [2 q .name = "user_led3",
' f- i1 A Y% @# ] .default_trigger = "default-on",1 S8 d7 H% ~/ ~( Q. s/ d: P9 \
},7 e) k# b1 ^2 }
};
) _) l& M) \3 t0 K
" W! N( N, K! H( a3 istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 k3 F; O0 ]% Z+ j/ L .leds = da850_evm_tl_leds,
4 L% w/ S$ L( ?. V1 w2 L2 L .num_leds = ARRAY_SIZE(da850_evm_tl_leds),2 y$ L. d2 z3 l8 [
};
) m* \' w6 X/ m( E( v+ n& l) H3 O9 D4 s4 f0 X) d1 |$ @
static void led_dev_release(struct device *dev)
7 o L; X; ?+ X' p Z{/ f7 r8 N# K+ _' g
};! m; P6 z6 D9 l( f W! L- e3 w8 ?
& L$ P7 J3 d! a3 B$ G
static struct platform_device da850_evm_tl_leds_device = {
/ M: }* o3 G+ O, y/ I3 E .name = "leds-gpio",
# C0 Y3 P* P! L0 z' @' a .id = 1,% U7 Z t0 M9 z0 Y0 g! L
.dev = {% J: G- a& E) L3 R
.platform_data = &da850_evm_tl_leds_pdata,
/ R0 P" r1 f5 G3 A .release = led_dev_release,* B* M, o) L- D& D
}7 u8 c9 Q2 H5 y# G' y9 H, {! o2 u, E
};
" \5 o0 ~0 X) g) W" O& V. c5 q7 g! {+ [5 z1 n
static int __init led_platform_init(void)( H$ z; X' j+ {
{) f. r2 g. f) ?; w6 ~7 P0 H
int ret;
9 K8 M$ b5 t% g+ w1 N' y2 Q#if 0' s8 X, {& _ d2 a& C0 `
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
2 w+ e* J+ n7 s* q2 o H) d/ @# j2 | if (ret)
1 A! A5 a: S8 V$ t pr_warning("da850_evm_tl_leds_init : User LED mux failed :"- a0 i/ _& i4 i% |
"%d\n", ret);! z9 B' }, V: A. o, F4 D
#endif
% o4 n3 H8 @ x+ k$ R ret = platform_device_register(&da850_evm_tl_leds_device);2 H% H' w% N) H5 g3 \ F' f. _
if (ret)( |$ Y8 h6 k2 [/ g6 p6 p
pr_warning("Could not register som GPIO expander LEDS");/ [. C/ ]' v. ?+ [
else
5 a6 `. F, U0 e6 a, ?/ m0 m" T4 H printk(KERN_INFO "LED register sucessful!\n");; N( V# {6 b# a! {% {1 N
0 B1 r( m* T `; Y! x' J
return ret;/ A/ _5 T6 _: O; p1 a0 |; P0 u1 w
}. D& A8 i, B* v& T* z$ s
9 T! N5 {$ j! a4 y9 w
static void __exit led_platform_exit(void)
7 w/ w$ A# W& _$ s* e5 p) [0 j4 W{; `! P3 g& M9 J" S( A5 {. q
platform_device_unregister(&da850_evm_tl_leds_device);
/ X& s5 Y9 q' j6 ?2 D8 d9 L2 H$ `
1 v$ ], ~" p, C) u- o7 } printk(KERN_INFO "LED unregister!\n");: L, |2 X% w3 c K
}: q8 l) D+ c$ n/ M2 @
* S6 d6 J2 V6 [
module_init(led_platform_init);- u5 C$ p/ x2 T0 B
module_exit(led_platform_exit);1 P; A2 j7 F1 f8 a- R2 y
! j) A4 \2 l+ v- ]4 q5 M( D. |
MODULE_DESCRIPTION("Led platform driver");
% j8 @) W$ x8 t4 d+ NMODULE_AUTHOR("Tronlong");- p6 [0 [" `" A& i8 j
MODULE_LICENSE("GPL");: Y7 F, I" Z9 O3 I
5 F/ s$ Q! k3 ~) { |
|