|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
; X% L6 V- e( x% P) `$ E#include <linux/init.h>, J. t2 r$ V5 y$ T7 `
#include <linux/module.h>1 P$ h: s* t" U1 s$ ?0 c6 F
#include <linux/kernel.h>
" U' ?) V8 @6 ?- L3 E9 |#include <linux/types.h>0 V& o: Q+ \3 K
#include <linux/gpio.h>
2 u1 A) \. {5 C! a4 l- `- K' B$ S#include <linux/leds.h>. r3 V* i. F+ |" Q1 N
#include <linux/platform_device.h>
r) n6 C3 j8 N9 [4 ]0 s X7 t2 Y" X9 B a4 A! c0 K' _
#include <asm/mach-types.h>
7 D( D* x/ G# B0 A; k' l2 o; |#include <asm/mach/arch.h>/ u3 Q& i% ^& o z, ]
#include <mach/da8xx.h>
4 J" _% X6 Y$ F#include <mach/mux.h>6 o4 w9 h; u8 }" J
0 r, M! h/ @0 Z* D5 N! H#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* D1 O" c! l& K8 \
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)- B, E# j$ a2 Y$ t8 T$ X6 N* J
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
0 o# `6 k" ?3 P. R$ [#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# z. T; }) V, h* A4 S/ R
" W" `: h& Z {% k1 s* I, ?/* assign the tl som board LED-GPIOs*/
( h% f- O5 o7 d$ X4 sstatic const short da850_evm_tl_user_led_pins[] = {
# D& T- C+ k" F, {. R" ` /* These pins are definition at <mach/mux.h> file */
3 p0 a: x, {: R$ J( u DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
) Q% H' z( w$ G E( n! x5 S1 {2 b -1. y# i( i* l$ `( b% K; a/ [
};& {9 t9 q/ m# Y6 K n
) _3 Q) v5 T) L5 a, r
static struct gpio_led da850_evm_tl_leds[] = {
4 N- w' K- ]5 K& w: P$ O {( v" i9 `9 u* _( t0 v
.active_low = 0,
, [$ {3 g) T6 d' W4 [# p+ o .gpio = DA850_USER_LED0,
5 x# |' Q' {. L: `, E! ? .name = "user_led0",( f7 c( O) F: D; c* c3 y |8 b7 F
.default_trigger = "default-on",
+ D8 `( u* ?7 w },! M9 T. v, M* e) r. a& ?1 O8 d+ M
{
8 V1 ]0 Q5 |+ V4 t& m) o0 e: E$ a& r .active_low = 0,4 R& B" W7 f* }3 K2 V
.gpio = DA850_USER_LED1,
4 l" A4 x0 k+ k/ c- ^ .name = "user_led1",* y# K) J. r }# D4 h3 t# ^
.default_trigger = "default-on",8 d, ~ i! Y! z8 D0 k& `' A
},
3 b9 \. |; x! c0 j, W {: U5 x* }0 V6 T# a, ]
.active_low = 0,6 `& H' h1 W. h0 ~
.gpio = DA850_USER_LED2,6 x4 \1 W+ X- |) X2 ~ ~# g
.name = "user_led2",
* r* u* n* @- O1 R4 q* b3 M6 A .default_trigger = "default-on",' m, P* [8 n; e1 Q2 V- O, m ]
},% t. b& X( e2 z: |8 M. n
{ q* o2 X: ~- J' C- D6 p
.active_low = 0, @1 B, n- }) r
.gpio = DA850_USER_LED3,* [9 C% E3 e- y% K
.name = "user_led3",
" v' D+ ?4 z3 p5 ` .default_trigger = "default-on",: l* ]* v; D- q( K
},% J" l5 C8 e& k. L( Q+ R
};: [; T! q2 w+ `* H- o' ?
. Y5 B1 v( \# [" dstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
. i! m% X% S5 C5 d; q- ] .leds = da850_evm_tl_leds,
6 N* k- _' {# \, E4 n% w- f9 W .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* n/ V9 D2 o' u; w+ H9 y: F};
3 o. E" A9 w7 u! r# I! o( S, Z+ S
static void led_dev_release(struct device *dev)
' I7 I, g* G2 t. ?- G{
. X5 p& h" M9 b y9 c/ k};
1 U) F, i3 u0 B3 X( L5 F& Q3 u9 |# ^$ s: \- y* B
static struct platform_device da850_evm_tl_leds_device = {
3 v4 j$ ]& v- @2 n .name = "leds-gpio",- g; u& t- B& I0 q' K( d/ Y
.id = 1,
* w# g+ ^/ M( K5 t% x$ b& ` .dev = {# z- D" j; r7 B( d/ P
.platform_data = &da850_evm_tl_leds_pdata,
& l, s5 E! j2 t6 ]3 f, M .release = led_dev_release,- Q7 a0 i. L o2 R$ E
}+ \, s, X. i2 }
};1 ]1 ~% I/ Z1 N+ L( C6 J2 O: I5 V
* J9 F1 ^8 ~8 I4 A- j( r4 C5 Y
static int __init led_platform_init(void); G6 n4 W6 x. d3 z' y; t
{- Z4 B. i* z2 F$ c# x
int ret;5 f! G" i* `; j/ O- A; ^: [9 O, o
#if 0
, |( s' l4 X$ @+ m ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);# I8 m6 y8 s; U. o, \& h
if (ret)
' Y# [, Z: a( s. a6 Z, x pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
0 k2 Y5 E- y1 P- W9 u7 X "%d\n", ret);
& }! Y4 C a! m1 z& C4 w#endif0 f" s q6 v. Z$ @9 }
ret = platform_device_register(&da850_evm_tl_leds_device);
$ C0 b5 p$ ?' [+ q4 `9 H( S if (ret)
; O; F" l+ W$ l" k! o pr_warning("Could not register som GPIO expander LEDS");
D3 j& g$ X# W6 x" s( g* ]' M; @ else
1 n }9 Y) z3 c& p9 F9 ~ printk(KERN_INFO "LED register sucessful!\n");4 a5 U G2 u5 X, l7 @$ W
j' e0 p- T Z( G return ret;/ k8 w/ r; M9 q2 F5 D' P7 i
}
! T% K. v, U; Y8 G$ e' A" B/ c
2 \( q3 W2 z& P; B1 M1 N- A. Ustatic void __exit led_platform_exit(void)/ j( W$ M4 c5 O. ~' d4 _. W
{6 Y9 Q) E2 o+ |6 p0 w
platform_device_unregister(&da850_evm_tl_leds_device);
) e s+ s! Q6 l, n; K: ]
/ h! M9 v! l; K9 ? printk(KERN_INFO "LED unregister!\n");" z, K! h/ T8 N; d! A6 S; ^" f4 l. K
}
# t9 H0 @9 q0 y' k" }
. z6 O" d2 T& ~0 F1 omodule_init(led_platform_init);) F7 t9 v! s0 o! A6 J( r' N
module_exit(led_platform_exit);6 a# z7 M/ u2 L0 o) B* w7 B
, ^; ~( S/ V& @8 \- O) V) uMODULE_DESCRIPTION("Led platform driver"); ~& |" N: V4 r" v
MODULE_AUTHOR("Tronlong");
z* M% A M& ?MODULE_LICENSE("GPL");5 V( l9 d: c" m) ^1 s! x! F5 \. l
$ R+ R* N3 N7 p- w" B, g |
|