|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% k8 U' o2 u0 I4 Y% D#include <linux/init.h> M& F) ^% U) ^) J; A- p
#include <linux/module.h>
& M. o; [! {" J& t6 g% ~3 T: {, w |#include <linux/kernel.h>
; [/ b7 Q; ^, I4 o* v, L; a" k#include <linux/types.h>
% F: w: p% B, ]( j) }#include <linux/gpio.h>
. L7 W# p' O4 {6 {# U6 T5 {#include <linux/leds.h>
5 e, i# Q! v* |4 o5 @#include <linux/platform_device.h># X6 I$ A; d# S, q
1 B/ |0 J: Y K5 h
#include <asm/mach-types.h>. O( |& F t3 D% y& k! h
#include <asm/mach/arch.h>! i" s4 h2 ]! C: {; A
#include <mach/da8xx.h>
! T; O" K6 S3 k1 i2 ~! O: F#include <mach/mux.h>
9 Z, ~7 F( I, q* R
& o2 e2 h$ X% h- M: |$ N#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ F9 g: c( p1 O
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& x8 |1 O2 |8 \2 V" i2 F$ m#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- T4 B2 ?3 `. X7 `4 C6 \
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
& V$ P- A1 `; M
/ \$ w5 X/ O+ P$ [/* assign the tl som board LED-GPIOs*/7 E' g8 g5 O, E! M$ T7 Z) D
static const short da850_evm_tl_user_led_pins[] = {
$ [' M9 h# B: K# y s /* These pins are definition at <mach/mux.h> file */" ]+ D( I4 ~4 a0 m
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,- `0 {$ Y0 T2 Y3 Q! A* |6 a! `1 U0 b: J
-1
3 i3 Z& j+ t- p: p( V; E. |- O/ N};* P% q T2 j# v# h: c0 r! V
7 L3 [# |" e. _4 o
static struct gpio_led da850_evm_tl_leds[] = {: X& a' E O, E2 ^0 R7 }
{! F5 c8 p2 F3 O- W
.active_low = 0,
8 R5 a4 r* W3 c5 Q6 A% w, q .gpio = DA850_USER_LED0,. [, M7 ^# l B4 s
.name = "user_led0",4 v; I& }: c$ z5 v
.default_trigger = "default-on",2 o7 N1 F; j- [# |3 L: ]
},9 F+ E7 T6 y: S" Z5 A
{ B0 Y# E5 I3 }/ S' Q, }! A
.active_low = 0,* I( t+ y1 @# Z$ @" _
.gpio = DA850_USER_LED1,* _9 `) z2 Y- i6 [8 N4 h
.name = "user_led1",
0 {0 ~+ m2 a1 t .default_trigger = "default-on",
1 I. `2 ~5 K$ o; Y6 f },
+ \0 P9 s8 `3 M, t6 { {' v9 E1 Q! S) E& f0 u
.active_low = 0,6 m1 N- ?6 E2 b0 I; G' a
.gpio = DA850_USER_LED2,1 N, h) y- n: k% B
.name = "user_led2",
2 l6 P4 l* ?+ g/ N$ w3 N .default_trigger = "default-on",
H3 }; o, z9 k8 G },8 E& A: N/ y: ]) A8 q
{) }: S$ y" X5 V E7 s6 Q
.active_low = 0,
, h+ T5 W/ \% ?0 w3 Q2 l .gpio = DA850_USER_LED3,9 b: ^) c9 S- z; \# f
.name = "user_led3",
0 ?4 }4 l" H" }, v- ` .default_trigger = "default-on",
/ j3 J F$ d" ~ },
. }, m, @7 x4 @$ M; Z4 p};& }! A/ d" ~/ X2 ^0 @( A4 y
: u; R. C' M) k6 _
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
8 m# N: u% |+ o8 J4 v .leds = da850_evm_tl_leds,
3 R4 C, M K7 Q. } .num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 h2 @0 M9 N. I' b
};
- e$ K! u# \6 z6 l8 p0 U
9 d* [- P3 [3 M6 qstatic void led_dev_release(struct device *dev)
! j4 E4 I) N( ]% Q5 z{* n t, ~6 R u5 A# F4 V
};. V# H) Q1 H( n% g- @: i
/ _7 Y9 S; k) F* m9 b% X- P$ g9 g
static struct platform_device da850_evm_tl_leds_device = {5 Z6 ]: R7 R6 T6 H$ U1 r' K: ? k
.name = "leds-gpio",
' t) ]4 m8 X" a6 q .id = 1,- D4 x% w/ _! t; c7 x
.dev = {
( n1 \" ]- f0 G! i/ |0 c' M+ Y+ U; i .platform_data = &da850_evm_tl_leds_pdata,7 @3 s) Q- i% U0 f
.release = led_dev_release, K$ s; a' c6 C6 x( M4 S7 j3 @
}
4 |; l3 B/ p; d};
- ]% ?6 G! a D* l4 b: k z, [2 j6 V. Z# `, p: R
static int __init led_platform_init(void)
. y! v% k: o% m8 W$ x{; [4 H. _& d1 a: [3 S. z! B6 B
int ret;' w0 Z9 V' a% k" p0 o! j2 m
#if 0
" y# m1 p; C! S8 J' h' [ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); E7 e9 q2 N h9 D9 s& }3 { f
if (ret)
8 {' Y+ n7 p3 u: j pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ y( f( w; g$ A5 g6 i, j
"%d\n", ret);
% ^$ U$ w2 L' b& t1 x. e#endif- H# h% [( a" W! |3 P
ret = platform_device_register(&da850_evm_tl_leds_device);; }7 [# t! k4 O# q# G
if (ret)
- t& d- u- O, j& g4 g% F; j4 h( _ pr_warning("Could not register som GPIO expander LEDS");" s# _5 K9 q# E2 ]! K) Q+ z: p( z
else6 [! r0 W7 E4 H
printk(KERN_INFO "LED register sucessful!\n");9 U. Q& a. s/ U# Y
` [* S3 A' ]# L7 I return ret;
: |. e9 m' L. X% O) @& ?}
- l6 H5 T M% T3 R/ x9 p* m& L- X7 i3 E9 ~8 j
static void __exit led_platform_exit(void)
& f/ m8 X4 `' u{
- x& m* t6 I2 g platform_device_unregister(&da850_evm_tl_leds_device);
" E( V3 Q& J# A$ \# c2 X, }9 ]9 r* s# l! T
printk(KERN_INFO "LED unregister!\n");
( u% Z. P5 J) D+ [, B/ a4 _( G( V}
" r4 v) v# ]* K6 x0 x
3 [" b+ Z/ n( p' \% Vmodule_init(led_platform_init);
) X8 x8 ~7 E* ^1 N3 R% rmodule_exit(led_platform_exit);3 Y8 {: R) d% B3 q( d( }. i* _
% N- v- k Y7 Q; J, H% mMODULE_DESCRIPTION("Led platform driver");
1 |( F G+ |- V- Q/ \MODULE_AUTHOR("Tronlong");
Y2 k% I( z! _( p. AMODULE_LICENSE("GPL");* }+ r- Q% r, A4 k: M- ^' u
8 Q& Q9 d$ l1 q3 Q |
|