|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 \- |% C: I" y) V% x; L, N4 V
#include <linux/init.h>8 \: D% m: Q* L
#include <linux/module.h>9 D, c$ |7 G0 d$ Y9 L
#include <linux/kernel.h>
' ^" g7 _) |, T1 j% J! Z" L#include <linux/types.h>4 X, v3 y% A& K: {( N. E/ I
#include <linux/gpio.h>! s# g8 Y4 v4 g* M: `
#include <linux/leds.h>
" U) E- F1 d+ ?8 ]# j0 k( k#include <linux/platform_device.h>( Y* N+ U* k- r+ y9 `2 ^# |8 K
! V4 }& U' h5 c \7 L; U. ]
#include <asm/mach-types.h>+ m! y: Z! c0 E9 |! E
#include <asm/mach/arch.h>5 [9 B% k3 y; k) X0 Y4 H F
#include <mach/da8xx.h>( d1 Q/ R: e8 s" }
#include <mach/mux.h>1 v* d4 M4 Q% G) i" ^. [$ D
9 @: }4 W5 G' U, g+ D6 S/ b#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* k2 d9 f! m, V' z* _, v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)6 S N6 |5 a k4 O7 L) \* l( O
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! ^8 p2 ^9 J9 y) ^9 i6 z3 k; ~#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# s6 x0 c8 d7 S
. J+ i/ R" S. `5 J3 r; ~& D4 l/* assign the tl som board LED-GPIOs*/3 w( f" ^4 B& d! {% I
static const short da850_evm_tl_user_led_pins[] = {
F1 ]+ I) n2 K6 Y /* These pins are definition at <mach/mux.h> file */ t3 T* v R$ Q, V
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,* E! G( S, G- C5 A
-1
8 T9 }8 P+ ?# l3 ^ j4 W- v};& Y, ~7 s3 }$ z+ L/ e+ z9 j
# g6 t) C( Q1 ~2 z* T
static struct gpio_led da850_evm_tl_leds[] = {
; Z" p/ [1 R: a* k' W {
( h* r p7 m; q _( U- t. _ .active_low = 0,: W3 Y* x* Y5 O4 q
.gpio = DA850_USER_LED0,
1 ^7 }" s( e& r6 L! z .name = "user_led0",
% N& W N/ V [( r; F# @ .default_trigger = "default-on",
% T- @$ I5 }. g% O$ r8 S6 v3 T9 X- R },+ X8 s$ J- L1 _- x* A, \/ b
{0 b. @ b( r3 z6 d" ?
.active_low = 0,+ s) t! Q; g: V! x# b
.gpio = DA850_USER_LED1,
0 t4 K6 }" F. o% D; `: K: S. t .name = "user_led1",
) b$ V4 d- D. B3 @& i: L+ L .default_trigger = "default-on",3 t0 E8 D( B8 S2 K. a! V, v: z
},- }" D5 x) v+ {) S; k# v8 i
{+ h! C( i4 Z: T2 ^
.active_low = 0,. x; ]7 [" f( ?# t, I1 f3 e8 w. b
.gpio = DA850_USER_LED2,4 f0 ]+ f$ g: y
.name = "user_led2",8 b( L* {6 P ^2 Z# H
.default_trigger = "default-on",1 m9 J0 N3 x, p* Z+ H0 Y$ t6 `
},
5 K c4 L8 k# S {
7 w- {" M3 ?! @/ n .active_low = 0,
' o7 y) [& D6 m- H o% B* a5 d& e .gpio = DA850_USER_LED3,9 x8 B4 r8 F3 N
.name = "user_led3",8 v& [- \, d# r6 X7 x- n) C: e. \( J" ~
.default_trigger = "default-on",+ ~! u6 P) f' f" v4 c
},
' y0 g4 l7 g9 R% `! n& t0 K};+ L8 B# f0 a) V( v/ S9 q/ X, j& G0 I
: q2 |3 k/ k6 Q; @
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ r7 `( Y4 o4 B. N
.leds = da850_evm_tl_leds,6 a& h r* W. S
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),5 L7 B0 l1 b! Q- l% u* a5 U1 B
};7 ]: l4 i4 D4 L) \/ A
8 V, C5 O& U4 x$ `/ ^' e* P* k( Q C/ ^static void led_dev_release(struct device *dev): ^! ?9 g5 }) a! A+ K$ b
{
: e8 {1 y. z j9 ^ ^};1 ` N" Q; i# a1 \
6 q$ P& I2 z. z+ d/ O
static struct platform_device da850_evm_tl_leds_device = {
* M* I& P7 ~& t .name = "leds-gpio", G& _/ D# |" p
.id = 1,
. f! M2 v6 x- B4 Q5 F .dev = {
! O% k7 `8 r" V- K; V# u .platform_data = &da850_evm_tl_leds_pdata,
8 _$ Y1 X; Z" h) Z z6 c* ^2 I- s .release = led_dev_release," J% T% l" Y7 l$ t: I& w# x
}; w- C. K6 A6 L* ^' k% f# k' C
};* K) ]1 E" d1 d
0 e" k+ H4 a8 C3 a6 K+ v( \) D1 nstatic int __init led_platform_init(void)
: j s1 s5 V3 c( _- b. C) z{
' O( S! z2 F. ^) P) H) p, [: \: f& r int ret;
6 k, N! n6 r/ `" P#if 0
+ Y. }$ u2 X1 I9 H& n! w ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);2 G) P) @! t' D/ W8 a
if (ret)
: ]6 r: B% i0 s% H& ~* n! ` pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
& X+ H% x I1 r. j "%d\n", ret);
& f1 {, V( p, c#endif0 ?/ u: ~6 _' {8 Z5 ?7 e
ret = platform_device_register(&da850_evm_tl_leds_device);1 U7 e. t% Z' z( q9 o" C
if (ret)
8 o! a# R2 Z V2 B! e pr_warning("Could not register som GPIO expander LEDS");: Y9 d% f% a8 t- Q& S- b6 m
else
% h: C7 V, ~$ h5 _3 g" c6 H) ? printk(KERN_INFO "LED register sucessful!\n");( t' C6 |6 i0 k1 |
# Z/ {) w$ U" k% j& G" P S return ret;- D; A+ m* T* e( ]( I# x
}
- l' f, M) P, A: {/ Z7 ]9 r
- l6 s2 t$ n. B6 vstatic void __exit led_platform_exit(void)& x/ r+ R: o6 M5 M, W; W3 \2 M. Z! S* c
{& Y; [3 E" T$ G$ x- b5 q4 J. I% c
platform_device_unregister(&da850_evm_tl_leds_device);
. f' a* M* M; Z: D! f7 q" y
% F; C6 G2 e: h3 J# D printk(KERN_INFO "LED unregister!\n");
% X2 n. E1 L2 Y9 S# |}
8 Z& Q. y+ V; \ @4 C+ V
7 F( m) }" G) D! V! m) w5 s+ v2 ymodule_init(led_platform_init);. B% Z& T5 P& d9 _4 Z
module_exit(led_platform_exit); u* a1 T3 J1 C$ w: I2 [: U( O
5 [* {, p, l; `! T( g+ `+ R R( lMODULE_DESCRIPTION("Led platform driver");0 |2 o1 v ], U
MODULE_AUTHOR("Tronlong");
& r& Y1 V0 o( |. T! @MODULE_LICENSE("GPL");: I# m T4 a2 q- c/ \
, O- f0 s f6 d
|
|