|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
. S2 s" ?8 _7 Y: _ c) Q) q; K7 O- ~#include <linux/init.h>
4 d- \' z7 u' ]: e/ F% k7 _#include <linux/module.h>: W( I# L; @7 S! y) [: m# f
#include <linux/kernel.h>
; x1 P5 \6 r1 _2 a& Y1 d#include <linux/types.h>
+ ^1 ?! D/ w9 Y+ d o' P! K#include <linux/gpio.h>
+ l( [' h1 [ C+ ^- s8 o#include <linux/leds.h>8 N V) G( [3 L' @" K
#include <linux/platform_device.h>( A+ L, S, P0 K) h5 C, ^! W5 H6 u
. i1 M z; w; k# x' c# V7 h#include <asm/mach-types.h>
5 _; R/ u: t1 ]% V+ l7 V: X#include <asm/mach/arch.h>8 u" N& K- q0 ^: E: G8 ?! j. c% r
#include <mach/da8xx.h>' {; {4 X4 t1 y/ |
#include <mach/mux.h>8 r7 k) x& R$ N$ C5 t% N
2 M2 V/ W; e6 Y
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ W8 h" I$ g( A* l#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)# p9 ]( K0 e' d+ K
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: O- J5 ~9 `+ r#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
* f8 d0 R% G e5 g' E8 U3 A
& K$ n3 Q* ]/ y8 T/* assign the tl som board LED-GPIOs*/- N K v8 W2 [! V# k: y
static const short da850_evm_tl_user_led_pins[] = {& o/ b2 T5 t& r$ X5 A4 B
/* These pins are definition at <mach/mux.h> file */
3 g7 D3 P4 m8 X. n( y1 \ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 u5 f+ h: A4 j! ~! }/ G* R' Y -1+ N N) }4 G# `. T/ p7 C
};7 A, Y7 x1 w8 j8 t1 m1 n/ M
( t6 U( k0 D l/ C7 Z2 u* a
static struct gpio_led da850_evm_tl_leds[] = {# \9 O& `8 ~6 `/ [% }
{' `, o1 E. O+ p6 A( q
.active_low = 0,
! Z" T+ q4 o' l! i9 L' | Y .gpio = DA850_USER_LED0,5 ]& s( z3 m* ?1 P/ z0 `& q- N, G/ b
.name = "user_led0",
* y! ?9 S6 Z! ^; D* `4 b" z .default_trigger = "default-on",
7 D# }/ v% Q$ m& M }," Z+ h( n: v; _# D& A
{
6 v8 C" O1 N0 Z- e3 P9 r .active_low = 0,1 M: J) n3 b/ x3 w- U$ X3 }
.gpio = DA850_USER_LED1,# {5 m) e, K8 o0 Y3 y. j% P3 M
.name = "user_led1",
6 v1 R, P! W2 k, S) x .default_trigger = "default-on",
0 M# `! }! _9 W) `; p },
0 Q' g9 L# P; O {
4 v- V7 T- D1 v" A& F/ K+ j .active_low = 0,
# l" }2 Q" X/ a$ I: J .gpio = DA850_USER_LED2,
- |7 j/ e* ]; @' W& B6 Z .name = "user_led2",# M$ S M. P( R2 x4 u$ s
.default_trigger = "default-on",/ s2 H/ ^0 t: j' g$ B. e( z
},! ]$ }' Z& X4 ?$ r
{, M3 t( S1 G& M! c7 a3 C
.active_low = 0,6 r( _8 m9 E3 v/ h# v; {4 q8 D
.gpio = DA850_USER_LED3,
: p- r$ C x; r8 q! y+ ` .name = "user_led3", M" u, m- P6 ?
.default_trigger = "default-on",
& A4 i+ z" }$ D },. @" w7 g9 f( w* s' G
};5 b9 T+ W- {' Q+ E, Z5 J
2 ^9 b+ f+ N- _
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {5 |, x1 a# }* Y
.leds = da850_evm_tl_leds, E3 G o! p0 s6 v2 K& Y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 e: F' J- G0 O0 ~, ?0 T};" Y+ p% N) P8 L# R# A; C+ t
- \, A) r( P: d3 j2 ~# Z8 Sstatic void led_dev_release(struct device *dev)
1 C8 M) [( ?+ E{
, v8 z2 n; i" {8 h};1 q" i& m' F2 O2 U; [0 P, T
2 E* S7 E4 \! _0 `3 m$ cstatic struct platform_device da850_evm_tl_leds_device = {, e9 C$ v6 u( G
.name = "leds-gpio",
, U5 k6 |! q3 x2 _4 S. \# q .id = 1,4 G: W" E1 x6 g# Q' O
.dev = {# s; b m! v" i* o
.platform_data = &da850_evm_tl_leds_pdata,
' I1 M# A4 \/ o. W7 g2 k: I .release = led_dev_release,
3 A' c. y+ y C! X3 Z }
7 y* _2 f7 u/ x v9 u};( P5 J c; s) S# O
" A' t6 _6 }; i7 @7 s. a* x, E" k6 Tstatic int __init led_platform_init(void)
+ E, m: a& T' @- Q, M{
5 H' C" L% h' p4 N- Y! c4 F8 A int ret;
* o1 V, T9 J* H#if 0# l, f. f7 Q% }% V% Q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);2 U4 s7 n9 P0 u E6 I. m
if (ret)" X. r/ u4 I! _" ], j6 p$ a
pr_warning("da850_evm_tl_leds_init : User LED mux failed :", |% @( \3 ?+ i; S/ r
"%d\n", ret);
; H7 d0 ~5 @, f, m/ A; w$ P$ F#endif& C8 a. L" P' ^
ret = platform_device_register(&da850_evm_tl_leds_device);% [( [" o2 [: J; u% a' ?4 `* N% X
if (ret)
6 K c$ k/ _, t f1 A5 h pr_warning("Could not register som GPIO expander LEDS");2 N' F( v( d! b7 H
else( ^3 \* q; U0 o. R1 C. A S
printk(KERN_INFO "LED register sucessful!\n");6 V4 W/ Q0 _& a% y8 ^
$ r8 n5 n+ l' s+ D: r7 @: I( s% h return ret;
' ^" [* q% x" [3 ]3 c}/ q: \# I8 V2 c
2 z2 B: w0 k: Lstatic void __exit led_platform_exit(void). }, r( C, g4 o
{& w# {( [' w1 E& \% u
platform_device_unregister(&da850_evm_tl_leds_device);) S. I1 L$ z' R2 R4 T6 ^! _4 T
+ P3 h- a4 x* N8 g5 }0 P printk(KERN_INFO "LED unregister!\n");
$ c6 p& w4 y$ @" N. J: A6 P; I X! c$ f}$ I9 N/ @$ ?2 F1 h# J; U9 j
5 G! I. u! p. j: E* T5 [% F
module_init(led_platform_init);" [* w9 p* F1 T! n6 |+ @/ L+ @& A+ M. W
module_exit(led_platform_exit);2 |; m8 U6 V+ d* h: G& S; r# y
0 |0 l D# j+ h# F8 W1 h/ f
MODULE_DESCRIPTION("Led platform driver");
3 Q3 d6 ~1 Y( X$ K3 eMODULE_AUTHOR("Tronlong");0 Z+ `' \3 n8 b+ x0 A& g, L
MODULE_LICENSE("GPL");
$ Z) ?+ O/ t& P/ `. w. Y' o N9 N
6 K* b3 O% ^& h+ v8 c |
|