|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
" ]6 s( f8 j9 J. P#include <linux/init.h>
7 r1 K! o7 B4 ~; F. m& D#include <linux/module.h>
& Q3 g, h0 t' }6 h) O- e#include <linux/kernel.h>
& m2 _# p' `2 D: i) O#include <linux/types.h> U" X% k# J* V
#include <linux/gpio.h>
5 p5 l1 j! z* s V9 \( G#include <linux/leds.h>
" y9 _' ^% P a/ n#include <linux/platform_device.h>
) D: u; @, A' x: e6 {
2 c# `: x! T/ W8 z#include <asm/mach-types.h>) b' Q) y T) S. b
#include <asm/mach/arch.h>( b9 l; N) S7 J) f! o
#include <mach/da8xx.h>, t$ a; u1 n& V! _1 j% v( f
#include <mach/mux.h>% b; u2 Y: F" _+ i Y
1 Y, ~( r4 P9 y* t
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& J, G- h! z, V, Q1 L2 u) M: z# X#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ ?* k9 k3 U( `( ]* r6 F, f/ P& }#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 U; a% U( @8 s9 ^$ C
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
& a- Q$ ~5 K4 e. }& |5 `3 _% i% ?! k+ z4 [/ x+ A! I& F
/* assign the tl som board LED-GPIOs*/& i# a4 Q1 z) N j# B: m
static const short da850_evm_tl_user_led_pins[] = {' I# o& ` z5 a; c0 W7 Y; i2 q
/* These pins are definition at <mach/mux.h> file */8 V0 d5 W; }7 m
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, y# q- a& x% p
-1 t! }) J- f/ ]
};# W% p7 Z& T/ `$ b& f9 z( j
7 j! l8 U; l; W" Q/ Z7 \static struct gpio_led da850_evm_tl_leds[] = {1 n6 u6 Y; H o2 G( ~) f5 E; U
{/ _! L8 w2 {: N: M
.active_low = 0,6 J* M& U% G( s! N
.gpio = DA850_USER_LED0,
0 G# G* p& p9 p) [" V; i; n3 G9 k .name = "user_led0",, `6 r$ Q" ^8 O) z7 Q' v; u+ Q
.default_trigger = "default-on",% G& f0 t# f, z, Y. W
},
) x( {* t- C( `0 c8 b$ ~* R {
/ ~9 v: z4 ] }& q4 l* A7 @$ R .active_low = 0,
6 W; P; J" P) w( I0 V- B .gpio = DA850_USER_LED1,1 @* R& r. [4 d6 i8 {
.name = "user_led1",5 _4 B; M. b3 c& V7 L
.default_trigger = "default-on",1 B3 E" [1 o' Q* ?
},2 }9 g8 J6 |6 o5 i- ~! L5 q
{
* S6 N# @1 k% O .active_low = 0,
6 ]. K; S/ I5 e* l1 w# G1 p .gpio = DA850_USER_LED2,
0 _+ @4 q' R* m* M b" N' `/ Y .name = "user_led2",
) T3 n. v0 @( s: F2 K .default_trigger = "default-on",
6 v$ _, r' L- w( n: |7 w; n0 J },
& I7 g) z$ a: N/ z$ ?1 x% _6 z" j {1 x; p, _! W. ]1 r. J9 J( Q, K
.active_low = 0,+ [& c P( r5 ]0 ?1 d
.gpio = DA850_USER_LED3,
+ c5 q/ F' i4 X .name = "user_led3",
+ p5 U& t+ J* ]) X .default_trigger = "default-on",% T0 n/ Z1 f4 ~4 Q0 A# z
},
, l7 J3 p8 B" J7 u. k: e3 c# Q, K};* A. E0 ]' u" e# l! h% b. y% Z0 C N
. K) O, @/ C" ?
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 C/ v" n" v% [ .leds = da850_evm_tl_leds,; |! a. J2 e" G' t6 Z5 U- l0 \( \
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ u1 O: L+ A6 p};
. ^: m/ n+ k* B0 c" T5 g/ E/ z8 S8 v& ~( S6 {- _8 L
static void led_dev_release(struct device *dev)$ Z, V+ Q- r5 s) q# N
{/ n1 S. k" x4 Q: S) Q
};. b$ A i& i/ V" N, O2 S% ?
" _( Z0 i, b) u% S8 @' S
static struct platform_device da850_evm_tl_leds_device = {
4 [% |& x! r) R# N .name = "leds-gpio",
% T M' [& |2 V" k .id = 1,) B& J' _4 U5 \6 B1 D7 F
.dev = {
( \! y, R* Z# M9 n" F+ { .platform_data = &da850_evm_tl_leds_pdata,
. ?! t; J! B- i- O7 j) \ y( _. o .release = led_dev_release,( ]6 o: B! ], g4 s N6 v1 m
}' C; n" Q+ \- ?+ R5 U
};. l. m# A& S! Y) M2 g! H H
% n' Q) T* v9 ]5 k. P# G- wstatic int __init led_platform_init(void)
) P% B9 D p4 a& I7 z{) F. i4 ]& [1 n d% B( P% ?* z8 N
int ret;6 d8 ]* o3 f( L! {
#if 0
: y' A; U% D' y/ _2 W ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 r+ I5 n0 c3 @" v2 y& y/ a if (ret)
- {" ], |! o; B3 g6 o0 d8 f pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
8 m8 C5 D+ w7 R7 c4 h "%d\n", ret);
: R- ]0 V3 ?' J$ F& ]! k#endif
- v* A9 b9 X7 j3 m7 o/ p1 e' K' { ret = platform_device_register(&da850_evm_tl_leds_device);
# V" p5 H0 S. ]" J9 v0 @ if (ret)! e' \: j7 a. L7 H
pr_warning("Could not register som GPIO expander LEDS");+ T: J! b/ O# y8 _# s8 @, D) N& H
else# D0 s% K3 ~' B8 Q+ v: Z
printk(KERN_INFO "LED register sucessful!\n");( n- ]6 B# T# d/ i. d, i+ Q
- `) f# X0 Z3 v! R
return ret;
; a. [& b+ K4 @$ e, I}
/ K5 Z* D; C8 @" g* H) C3 I1 Q6 B; D: L1 N' M% c. m6 i t# c
static void __exit led_platform_exit(void)
" @4 r* @% d9 E, e3 r6 @1 \, v& Q{; z* y" \$ N+ F! @
platform_device_unregister(&da850_evm_tl_leds_device);$ ]4 h9 y% E" w$ v% X. a/ D$ B
# g5 z/ r5 }& w1 L
printk(KERN_INFO "LED unregister!\n");
; d) G U6 d3 u}
5 q1 ^0 A8 }& H+ r- r- W* l( v8 u. Q3 i; g6 p% c+ _8 V
module_init(led_platform_init);+ _% n% w# _/ }1 X" Z+ F, g; [
module_exit(led_platform_exit);
+ D1 v, Y3 K' a B" q" `$ y8 ?( `$ u0 v+ }: W
MODULE_DESCRIPTION("Led platform driver");
& d- W2 @4 v( @0 a0 f3 y+ @) rMODULE_AUTHOR("Tronlong");
/ M" P& W/ [( W6 @- C/ B; gMODULE_LICENSE("GPL");7 @( r" W5 C/ T4 L- V. Z
( s+ ?' \$ r+ Y& S$ K |
|