|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
$ P+ l) b4 E5 `#include <linux/init.h>
/ B) h7 ?% L3 C* G. k. k7 f#include <linux/module.h>
, p! ~$ P( X0 X0 ?#include <linux/kernel.h>3 p: A1 \ {; z9 C3 v4 U2 o. w
#include <linux/types.h>
. I4 I# `3 g) W; i$ k7 W/ [#include <linux/gpio.h>1 ^$ d. i- v9 ]7 \/ h
#include <linux/leds.h>0 b- P1 W4 O7 O7 ? f' _, d
#include <linux/platform_device.h>
, O o. D. v+ l4 U% G0 X# w$ i# M
" w3 F1 y; h6 C- _8 R7 U7 p4 S#include <asm/mach-types.h>8 j |" A/ v# o* A$ j
#include <asm/mach/arch.h>( e) X4 W/ W) b' f" u
#include <mach/da8xx.h>
5 `6 Y7 o' W- U' I#include <mach/mux.h>7 Z. F9 C4 O5 F3 v6 p
. l, T6 Y6 R7 b Q- f
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" M6 Q6 |' g% K. v- c- z1 Y
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)- t7 F1 e& n9 y) U) T& T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
M5 i) A4 v9 ]' w#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
6 w' ~+ }4 C; R. Z9 Z4 b/ o: [* u- b; L( @ ~
/* assign the tl som board LED-GPIOs*/* u0 G& X/ Z3 }3 e" J. ]9 L' L
static const short da850_evm_tl_user_led_pins[] = {
2 t9 b: e: l% w0 | /* These pins are definition at <mach/mux.h> file */! l9 n4 M. }0 f7 Q
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,7 e/ c6 O' u4 A$ I. p
-1
) I4 O/ t4 M+ C8 j5 |5 D4 @ E) m};0 {! h/ [' w# r7 T* w
( p6 J ]- d) Tstatic struct gpio_led da850_evm_tl_leds[] = {
- N/ p) Q1 n4 C) ]$ a {0 v% y' E9 i% S
.active_low = 0,
4 Q7 v2 A# s$ R" V& f. x: m! o .gpio = DA850_USER_LED0,% e' }; @, `! F' M
.name = "user_led0",, D+ w/ l- V# p
.default_trigger = "default-on",3 U* ]6 D. }3 H
},
. E3 E2 }$ }* D* q {
8 X1 ?7 i2 Y3 N0 H @ .active_low = 0,
9 P# f4 X2 X" I! |7 u3 v+ N .gpio = DA850_USER_LED1," V6 ^, {( |, |/ O' X
.name = "user_led1",. I3 ]8 [( `' n
.default_trigger = "default-on",, o0 D3 {2 W' j
},
- K4 q) w. T+ v o2 K, G. b! R {( V: [8 G% n) h3 `, F; `
.active_low = 0,
) y+ w8 N0 v( ?, k0 L X w7 e# K .gpio = DA850_USER_LED2,2 N0 i$ R* V! p; R5 q
.name = "user_led2",, P$ z4 _5 ?/ u4 R
.default_trigger = "default-on",3 _9 j( D! x2 Z
},& |& i% ]9 W5 P0 V. d
{4 o/ N* ^' [# [
.active_low = 0,
; }8 T1 n8 @2 v1 S* h7 { .gpio = DA850_USER_LED3,7 O2 A9 L. B0 F6 l
.name = "user_led3",
2 k3 i% J- E1 ^# p2 S .default_trigger = "default-on",
4 D2 I, {% G; i# j) Y) U },
3 [$ L2 v, s/ r3 K6 y% f& g};, p$ q6 i* x/ d4 p" G* ~
O f: E& G" a" l
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
3 u7 n9 ^4 ?$ r# E9 c3 p .leds = da850_evm_tl_leds,
% V( ~' R5 R$ \ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 N# G* h6 l7 f6 P) Y: _
};
+ ?% k- v; ~+ J6 Q6 o. \, c
( W8 \% E9 s) ?. K$ A6 zstatic void led_dev_release(struct device *dev). t3 d, @! R4 I, G& w; K
{: C2 ~% R3 t5 _/ f5 f* n; f
};( V. R, D ?0 d% E
( Y Y% L0 E8 n
static struct platform_device da850_evm_tl_leds_device = {/ X3 [% Z4 ~+ e6 [' [& G
.name = "leds-gpio",
3 I6 D6 c4 ]# d8 t3 {4 X5 n .id = 1,8 ]2 l4 Z* [8 @0 _
.dev = {: J1 M/ x6 Q4 v% m; K: ^9 t8 [
.platform_data = &da850_evm_tl_leds_pdata,6 B: u7 f) w. J5 i1 p: e
.release = led_dev_release,
3 S) m' a! [* l' q# Z/ J }2 `8 C' x% w" n% B# g
};* @5 E8 ~, N% Q C' A6 P
- L W3 J; F, r7 bstatic int __init led_platform_init(void)( I+ I; T8 R, R# P, ?2 K
{" \9 l" x4 J: A+ p; ^# O5 }" W2 Y
int ret;
6 [ U1 I$ c; f( C7 P& ^& m#if 0' x! B. Q9 P1 A" C
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);* A+ }/ A, p4 E1 W8 g7 x
if (ret)
) {+ _9 M$ E. h! G3 ^: ~) f pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; N y* g3 e; ]3 e8 X ~6 j "%d\n", ret);* K# p" R y5 v/ V
#endif
+ I8 l! J* j4 M! a- N9 p ret = platform_device_register(&da850_evm_tl_leds_device);
" F: N1 ?+ p4 Y if (ret)3 @& F4 z' l0 G" f9 e- }
pr_warning("Could not register som GPIO expander LEDS");4 c' T0 L" K# i* T- K- G1 v
else/ k; S7 Y4 Z0 |# R" x
printk(KERN_INFO "LED register sucessful!\n");
7 R2 A7 F" X- X3 T% V) w- V
# Y1 ^: A6 d, @% B' E4 q; j$ ~ return ret;( v; o0 K' d+ _ ?& i5 W2 e
}
+ p$ t2 ^" D3 s8 |: |+ ^# s! {+ F% h) i6 ]+ v) B
static void __exit led_platform_exit(void)& Q8 i0 q" M, m) c6 _7 e9 d5 ^
{/ Z2 a4 J8 W( A! I
platform_device_unregister(&da850_evm_tl_leds_device);- Y% m# R5 d6 a
% } Q+ X: [; {4 z6 ]; t printk(KERN_INFO "LED unregister!\n");1 I9 s4 g' j' b& t
}
, ? k& e+ j: _# N6 ]3 n( Y7 p2 [- K, B6 u: Q
module_init(led_platform_init);
5 ~" n3 Q# f* \2 C/ y& Rmodule_exit(led_platform_exit);
l) u! |. T# G# d
3 m/ q' ~- k5 P- {. hMODULE_DESCRIPTION("Led platform driver");
* ?6 T; h. ~3 m2 XMODULE_AUTHOR("Tronlong");/ u/ U! t) \0 P- ^' s
MODULE_LICENSE("GPL");
9 M3 h( j; e- s8 n
1 |' `# ~7 Z+ k) N2 W- z5 @ |
|