|
|
求大神给下面的程序做注解,请稍详细些,谢谢。, ^2 d8 Y- m. T( W& T+ Y
#include <linux/init.h>
, z0 R% Q+ W$ A' N( T0 Z! |3 S/ o#include <linux/module.h>
$ P8 W5 q) Y5 s/ L. z7 x: c" z#include <linux/kernel.h>. j# ~; B5 u5 [6 p9 k* [; g7 H0 e
#include <linux/types.h>4 a- m" e- Y7 \
#include <linux/gpio.h>
3 g# U( p t. m0 L1 E K#include <linux/leds.h>, `- L% d; e: s# t0 e# _8 w9 I( h, |
#include <linux/platform_device.h>+ Q2 y3 s5 }8 o" N3 T2 ]
1 y( R. S R: C0 x4 W
#include <asm/mach-types.h>
4 u0 Z: p3 D E) G! ^#include <asm/mach/arch.h>
$ f9 ?1 W+ n; C' Z" [#include <mach/da8xx.h>
' f9 I. @: [5 t2 I, h( r7 G#include <mach/mux.h>
, `1 e1 _! A- L* V2 S X0 e! L
: Q: u; b4 l% n) {; h H. ?' R#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ }9 f$ e% i& D1 C: P
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)7 |; j+ ?$ {8 B' Y6 h
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- j0 l; y2 ?! _3 G: \$ f- z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) o$ w- ]$ ]% T) b$ a& M2 v3 v. B, w% n" G! a. e
/* assign the tl som board LED-GPIOs*/; ^/ ~' y: @' s1 s% Z
static const short da850_evm_tl_user_led_pins[] = {
E# }3 N5 M/ x @) w: u8 i /* These pins are definition at <mach/mux.h> file */
* V5 D1 ?) g0 e4 B$ Y3 ~8 i! g9 \ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 U$ U" }( Q/ U, J7 _" u
-13 y: r% B: p O
};5 ~, `4 T+ |9 X" B5 m# w
) J9 e' a9 P3 s; e8 ostatic struct gpio_led da850_evm_tl_leds[] = {! y0 C% D2 A- N1 V5 R
{! C0 D. z2 d- u9 `; K: y- l# J$ L
.active_low = 0,
# q5 U- h5 G" j8 j0 o: S .gpio = DA850_USER_LED0,* S8 ^5 E y( _) K7 z1 ~
.name = "user_led0",
% w" a! y8 o& J: n0 M .default_trigger = "default-on",( q2 v" [- _4 ?1 n& d* C
},. f5 z- `# a; y* t) P
{7 c7 _, Q2 K) ^4 x* p
.active_low = 0,- D$ _, e: V5 I' Q V$ @4 Q, ~
.gpio = DA850_USER_LED1,
& j8 v* q3 c8 R* _ .name = "user_led1",4 J4 a# y0 n) Y* H
.default_trigger = "default-on",
5 S$ S8 @) L9 M/ h5 U* N },
( V* \$ _3 }+ F F {
1 d9 O' p5 L5 @9 l u3 N2 u .active_low = 0,
4 d9 B. `& e+ w2 `( ?% C .gpio = DA850_USER_LED2,
4 M, G& N; c' X .name = "user_led2",
* R% G- w: M; L2 o/ H; X6 r .default_trigger = "default-on",/ i; ] l8 d+ S) F* {
},- k- G/ ~0 r! D7 A" r8 S
{1 b3 p& o) V4 n! q. |& n0 o* W
.active_low = 0,
7 g& `: `3 i! D, R) N0 p .gpio = DA850_USER_LED3,+ Y* }, Z" ^4 c+ Y9 l
.name = "user_led3",
2 b# u9 p3 m; E1 i. ~& b .default_trigger = "default-on",& D4 h' q) L2 L" Q+ `) {* W( Y0 a5 C
},2 X% D. F- C2 d1 M7 W0 j
};, `% p7 n* ]* ?5 [
6 m6 Q# q8 Y/ o
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {3 a6 U: M! z# j/ X- V2 E' L' g
.leds = da850_evm_tl_leds,/ d+ L R" z' R) Y" n
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 q0 ^0 Q. s& X+ N! m2 Z- m};6 U" u( o0 ^5 N* ]5 s" {7 f
: w. c( n1 e* P- E' V9 _static void led_dev_release(struct device *dev)
8 P( Y3 V" |, L9 | `' t# ~{
: Z. }" k3 b4 \' G5 y/ R};' \9 D4 t. P2 z5 C. s6 o% X
/ e; ?* {5 \7 g5 Estatic struct platform_device da850_evm_tl_leds_device = {; v/ v7 o; e; ~2 P( G
.name = "leds-gpio",/ ?0 `4 R9 I8 n7 e# q
.id = 1,
8 L g9 t! {1 d8 U7 _+ I .dev = {* ^0 g$ Z5 m+ k3 i; a7 J
.platform_data = &da850_evm_tl_leds_pdata,! e1 ?( [3 b9 m
.release = led_dev_release,
: x. [( I: c6 M0 T }" a3 f4 o4 ^! g$ h
};
; n- p& W- K) M# I' x- T% j& }- q* Q7 f. g5 m4 j
static int __init led_platform_init(void)
& A, C! i7 g0 L) ]6 ^. I{* t; m- p4 [- @5 z' }% ^- F, q- U
int ret;
* Y3 z" Z$ V X7 \; j o. B#if 0* }1 C. b1 c. t
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
0 H" {4 m7 r$ K* P if (ret)7 g8 u8 b6 y0 g- P3 `" Z0 Y- u
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" f+ G- |" j# Z, T p
"%d\n", ret);
# i; X G' J5 D z" ?) `9 f; ?/ i$ c#endif
* U* J0 q. \* Y9 |. | ret = platform_device_register(&da850_evm_tl_leds_device);& U0 T- t( v6 ?
if (ret)
/ U2 ?% b/ W1 ?; L pr_warning("Could not register som GPIO expander LEDS");
( e4 @9 s- ^ \6 w9 B else2 o ]6 Z! i- U. D! q( ^- U' {9 p
printk(KERN_INFO "LED register sucessful!\n");
0 @. G7 h$ [6 Y; d6 X* Z$ c, A
% ^8 w4 E8 `+ S& B- z3 _ return ret;
7 V& m2 T5 v8 ^+ k* g: _: Q; `}6 [, c, W( f/ W S! K
3 u- V, w9 o A6 `. o
static void __exit led_platform_exit(void)8 K1 [3 Y. U$ H
{: _1 E$ ?) P* Z+ }" Y
platform_device_unregister(&da850_evm_tl_leds_device);& k3 w9 x6 m0 |1 Z, x3 J0 Z& M+ _
+ t: `+ e0 x) n printk(KERN_INFO "LED unregister!\n");
" X& N" O E) R* j0 z% q}
( b/ k" H* }5 h# E k! Y. l, i3 L' S9 m3 ~$ C" r5 Z6 ^
module_init(led_platform_init);1 Y! i; K, O5 Q; Y% _% `" {
module_exit(led_platform_exit);* P r0 u$ B, N3 P/ S4 V5 u! h& @
, y( Y9 n4 C E" I
MODULE_DESCRIPTION("Led platform driver");
/ J8 |! q1 p* t/ D2 Q v5 HMODULE_AUTHOR("Tronlong");
' T# B8 F1 J. G% f: J& eMODULE_LICENSE("GPL");) i9 z' [1 }; ^9 P3 ~
. C4 E, ^+ g% u, o2 x% x |
|