|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) o# L9 n8 ^( [8 C: `9 D3 G9 P. ^: Z#include <linux/init.h>- V9 b: i! j1 H- u4 m8 j9 j/ |
#include <linux/module.h>& R6 w; n" n: V5 y z! f- @
#include <linux/kernel.h>
$ B. }9 M% |, ~( Y4 I- s$ h#include <linux/types.h>% f- [) @4 W' e7 T# v/ G" A' F
#include <linux/gpio.h>
# N1 S: r1 \' r# M#include <linux/leds.h>% B" o+ w1 Q w8 Q+ t5 T3 K6 y
#include <linux/platform_device.h>
% r8 f4 m, o4 z9 w
% w! A( m1 C+ I4 j. x% u, q4 p#include <asm/mach-types.h>
1 Y$ i$ m R9 g2 t2 c7 `0 ^#include <asm/mach/arch.h>
. ~; ~( A% O) U/ h#include <mach/da8xx.h>' k. F" j4 S" O
#include <mach/mux.h>' l6 k0 p( q) N- P1 O- _# {
4 _& J' j0 e% j) Q9 x#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& L- B$ v3 S5 i8 m, [2 f+ ]+ b
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& S u# r+ ?: Z; i
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 c' c" V8 B) @1 j/ E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; f/ Y/ M" E" d) r
A2 |2 [0 x& g2 `* o* _/* assign the tl som board LED-GPIOs*/
* N: k* w1 u' O+ Kstatic const short da850_evm_tl_user_led_pins[] = {0 F- A \9 P0 P8 Z# S3 H# I; m
/* These pins are definition at <mach/mux.h> file */8 K9 j1 O' Y; c, g0 L. s
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
- X8 b& Z4 z/ _5 f" I -1+ `) q. N7 z3 g7 F* b H; a3 u
};
/ M7 o$ Q* l7 w! [4 E1 T+ U4 o( p) w) o1 {& D6 a+ o8 C( j
static struct gpio_led da850_evm_tl_leds[] = {6 c% s( B/ m# j. ]% E
{; R' W3 k6 Z9 k: S0 O5 J# |
.active_low = 0,
* }8 S! |& d% X! [1 t .gpio = DA850_USER_LED0,
{1 R7 g+ z1 w& F .name = "user_led0",# @9 d' [2 E5 Q5 N
.default_trigger = "default-on",
# }1 K, Y6 H/ h+ `. w k! \ },
: b/ t- u+ D* @& C0 s {4 C8 g4 ]+ d$ J9 A6 Q3 y# a7 C
.active_low = 0,
, |$ B! P- w) L' o7 L .gpio = DA850_USER_LED1,
' P: K8 S. B! h7 i. c8 r( J0 h( F .name = "user_led1",) A$ s3 y4 [4 ?0 f
.default_trigger = "default-on",7 x: }. g- c& }' x4 j4 I9 Y: z3 `
},
8 J& |8 ^/ q: j+ G7 E {6 W" Y5 A7 `% C: r$ G) O
.active_low = 0," f. c/ m' Y/ v \, W
.gpio = DA850_USER_LED2," @' O9 O O- H1 o: `4 V: R
.name = "user_led2",, h* ]. b$ u; p
.default_trigger = "default-on",! R4 R5 p# G U& [
},
. W n7 g- K5 U. f; W. N {5 }1 n; K2 v1 l0 ~; o, X
.active_low = 0,
# v) {5 ~8 b3 s6 X0 k5 E .gpio = DA850_USER_LED3,
7 S- Z' i N+ b. P- D% d7 d .name = "user_led3",5 `" x, G4 S* Z9 u t# f
.default_trigger = "default-on",
3 n% ^& [2 Z N },
5 x$ ^' @4 d8 d4 A* ^- I};" |6 `9 E' C* K6 `; M5 [( T
8 T3 h- \; g$ A- p
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 y" O: q, A1 ?" O n/ y/ v# |
.leds = da850_evm_tl_leds,' ^4 W% p- Z3 q1 Y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 V" h+ E0 K) X0 r- @% }2 i
};2 l8 P8 P0 A! C: c
. Q% Y9 y% r( Z' E
static void led_dev_release(struct device *dev)
, a+ h1 n. |* L{+ y% X7 `9 @ P# p4 d
};3 q: U0 |" C% B0 D5 ^: v# S4 K
- e4 O. @( \( {& z3 B9 l* }7 d
static struct platform_device da850_evm_tl_leds_device = {+ f6 P% [7 c2 c' e9 x" ]
.name = "leds-gpio",! I4 {% d% C5 `6 e
.id = 1,
7 g" w0 g! ~1 t! r .dev = {
' P' X+ f4 h9 B- `4 l# R; D .platform_data = &da850_evm_tl_leds_pdata,
5 y9 V, p' x. s. k/ ^6 ~& p .release = led_dev_release,
5 M* ` e8 Z# o }
: E# h$ y2 a$ N; O C- Y};9 A4 v0 _0 G3 i7 [
0 p8 n4 J: H2 n+ j. \; x! A
static int __init led_platform_init(void)
6 K( S4 \) L U, i{
* g( C+ A" Z4 K int ret;
4 i/ F L! V; @, @$ D#if 07 j- a; P/ w2 {. q# Z/ J8 v9 ^! _2 G& r
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 }# O# }7 d# P) z9 I
if (ret)
) X8 h8 q4 g2 ?- K! y pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
" s+ d# c+ ~& i- P6 ^$ P "%d\n", ret);
3 Y5 ~, f( I9 \) p#endif. i; m9 j# k% B& Z! \
ret = platform_device_register(&da850_evm_tl_leds_device);* J) a$ l3 y# p$ Q; \; Q# X0 W
if (ret)) D! P( f$ y% Q Q$ _4 \4 k) e
pr_warning("Could not register som GPIO expander LEDS");: h- T7 ^) o' J% w# n
else2 R! {, j! ?9 m& l4 p& M% X
printk(KERN_INFO "LED register sucessful!\n");
" I- z. {9 |0 f$ t' s8 r
$ v; [- @# I0 @3 _ return ret;8 \% [# @7 @3 `$ O
}
: `2 L% }/ k7 ], w! e* z# T
7 z# E' `0 I7 r' }7 k% g+ J# p- @static void __exit led_platform_exit(void)
) x$ p6 w: C! P5 m2 g{$ c1 f( q- c# u! \6 c
platform_device_unregister(&da850_evm_tl_leds_device);
5 Z, D% X/ `* S5 w# w5 ^' g7 `1 c+ Y5 ~) c0 H1 W" `
printk(KERN_INFO "LED unregister!\n");
/ v: E! K. A9 A1 Z6 K+ m2 r' H9 j}$ j. [7 s! @) D3 E1 h$ o1 u
m$ G# c. O9 f0 i5 ?: s
module_init(led_platform_init);! f. Y! x9 f" h% ?
module_exit(led_platform_exit);2 M) f M! g! u% A' P2 H3 W
4 g0 G+ ^" q1 [" i: M# t
MODULE_DESCRIPTION("Led platform driver");6 i8 g; p+ D4 k# E, U |
MODULE_AUTHOR("Tronlong");
$ K9 s" d! z& ]& ~" MMODULE_LICENSE("GPL");. N2 w& u; ~# U% H7 A
7 z* B0 g9 |5 C6 R% z
|
|