|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 h/ q) H/ { z( Z1 `% [
#include <linux/init.h>
* p" o' y; x( B. K1 E! [#include <linux/module.h>
( a+ z Q8 u$ q1 B. x _$ u#include <linux/kernel.h>* {( {7 V3 D# B1 u( T/ u
#include <linux/types.h>$ h, [( n, |" B/ D/ [
#include <linux/gpio.h>$ {* y" B1 L; B! D7 @
#include <linux/leds.h>
" L; ]; L6 g/ X( ?% w( ]1 m3 x2 h#include <linux/platform_device.h>
: @- Y/ _" r! E) A P* B) b4 u6 k1 x8 X$ A) `# ?
#include <asm/mach-types.h>
6 D# ^5 i7 i d4 [8 c2 g#include <asm/mach/arch.h>
2 z7 h* I9 K5 p r#include <mach/da8xx.h>' i: c8 r0 S! m0 y
#include <mach/mux.h>
+ x4 o0 o: |7 Q! k) D5 O' D+ {# H. h$ X
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ @( V4 T8 b, o8 c' \* D#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& |: S6 C/ ?+ C; J
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)/ {2 D) ]( a7 }% @7 d6 v, _
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)4 x6 A) K8 s: H, @
, C6 t# ?1 p$ M6 }1 h$ G9 Z0 _; X
/* assign the tl som board LED-GPIOs*/
, j" _* ]* c/ dstatic const short da850_evm_tl_user_led_pins[] = {% Q1 X" B M1 L% G m/ d; y2 F
/* These pins are definition at <mach/mux.h> file */, \1 i. Z, N& p0 x7 c4 K
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
, n! { K+ a0 |5 |; n, I# j -1
& b6 A# x; `; @1 R# I' `: G/ D3 P};
9 _1 \$ Z# f- k8 y2 D- F2 l: L
1 C w! u7 q; I h: ystatic struct gpio_led da850_evm_tl_leds[] = {
, r9 Y7 i) C1 {$ T! C. `1 y, L1 G {: T4 ?( d6 k- ^. p# t: I- o* W& T
.active_low = 0,
, i* M$ B- j5 T3 h: x* ?* }# j" s .gpio = DA850_USER_LED0,1 J. g2 ^4 i: g) L+ {
.name = "user_led0",( n* s7 F4 o6 _6 e% [1 W) h: w
.default_trigger = "default-on",7 M$ a* D! J% `! A% K
},
8 ~9 |8 y6 _+ `6 b {
, [% i0 Z! D/ E! X0 S .active_low = 0,$ z% ]! @$ j2 a! I0 V% K
.gpio = DA850_USER_LED1,
8 T6 t# ?9 u% n6 }& C, k .name = "user_led1",8 _ A, R5 q8 O5 P3 Q$ h
.default_trigger = "default-on",
# s/ s6 a1 ?% ]/ R }, q1 Y: F) c" _- ?. m
{' ~& \+ u& |3 z9 [" ]) M
.active_low = 0,
" |( \( u. e% B6 i# w, i( t- @ .gpio = DA850_USER_LED2,
/ h5 @0 D% i: S0 b .name = "user_led2",
) t) Q5 f8 g5 g% g* g8 @ .default_trigger = "default-on",6 O- i: f5 ?* y; M
},
' v' F9 h: }# q, B {- I! I9 n+ O, w% H
.active_low = 0,
3 N1 R4 B) C: G4 L0 Y* m .gpio = DA850_USER_LED3,
* ~) C5 } a0 Z .name = "user_led3",
4 @5 L$ c! u3 v# y7 ^. m1 I, r .default_trigger = "default-on",
. Q: u5 e$ N, @ },
- L- k# c; f8 S, n6 E* t$ F};) S' R8 V& V& b6 n1 d& S
6 x: [# D9 a. L& T4 g
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {4 q- T3 v: ^2 Z/ R
.leds = da850_evm_tl_leds,
0 W9 q1 B; W* O4 k: k .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
0 v$ `$ b' y( y2 j* g+ a% w};
" G T w8 E! T3 f1 i: O' O* q {0 n+ W
static void led_dev_release(struct device *dev)
' F' n% F: y* p, P6 t- V- c$ W/ G{
" o# M. ]# Z/ b4 t- a3 H};/ l( Y! {+ g) V% Q! d+ I# F
' z! l6 A) I. a; J- H, Y# T
static struct platform_device da850_evm_tl_leds_device = {
# y& w* u- S8 U .name = "leds-gpio", r( s) a" x: |6 o/ |) n
.id = 1,0 W: d2 D) s* F0 ]0 j
.dev = {4 B" D7 m+ Q8 x8 q9 ]! }2 F: A* R
.platform_data = &da850_evm_tl_leds_pdata,
, J. f/ E, \, k- a( Q .release = led_dev_release,6 r3 \ R2 a, s9 A, l" _( @
}
M0 ~ y0 H0 T+ }5 l7 x};
3 ~ B! U$ v$ B% K' J
$ Q" T0 f6 o5 R4 O5 p @( q6 Lstatic int __init led_platform_init(void)
# t, L, g# a) {% a0 q{- z. k& }4 s8 u4 W+ Q+ I
int ret;
. W' Y7 X. T7 Y6 y( [; U( R#if 0. Q( ~1 C/ Z" {# i
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);6 z- D4 H5 |; z: T3 y0 u/ W, w; ], t
if (ret)
, Q# f& u! u, o. v7 t+ e pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; ?7 { }# a! f9 m( X
"%d\n", ret);
% Q7 d$ H4 ^* y$ ?#endif
9 D$ r5 t& i& D ret = platform_device_register(&da850_evm_tl_leds_device);
( S- V1 r# p1 k) g! H, S- g! X if (ret)
9 D, _7 a/ [, ^, A$ { pr_warning("Could not register som GPIO expander LEDS");
6 D& x" P, `" r1 c else
$ q' ~/ b% W- H printk(KERN_INFO "LED register sucessful!\n");
: D! }" b3 v* o$ n* m$ p( K9 ]* D2 u+ O' Q8 i2 P+ ~
return ret;
) k# t; ~0 }6 F}
* x0 n" i7 f7 B
' b, m" v$ n1 U. H! ~6 p: Kstatic void __exit led_platform_exit(void). d! y+ Z% d' y8 N7 ~% ~
{
2 d7 J+ e8 C T! s* T# S I8 s platform_device_unregister(&da850_evm_tl_leds_device); W" A7 ?: @2 O8 z1 b8 s
: @3 F% S* [4 B printk(KERN_INFO "LED unregister!\n");
% m+ g5 s2 d H7 L# p9 u2 c, \}
2 T) o) x6 x( L: D3 [& ~4 b9 T$ E; n8 ? w" e4 X) }$ d
module_init(led_platform_init);
$ n0 R1 [5 A8 @# Z4 m8 Xmodule_exit(led_platform_exit);
+ L; j/ ^9 I q* @; S& Y: S U( `- [8 Q9 |, ~. p; n& Z( S+ `
MODULE_DESCRIPTION("Led platform driver");# S. `. O, R; ^( D
MODULE_AUTHOR("Tronlong");) O8 c! B1 h: f- L& N" L2 B
MODULE_LICENSE("GPL");5 j" I% h% n: @2 |
: w# @9 b. }' _7 G2 U
|
|