|
|
求大神给下面的程序做注解,请稍详细些,谢谢。( U$ L1 r5 M& l( W9 h
#include <linux/init.h>2 k6 @4 x- ]+ `3 T g0 T4 |' S
#include <linux/module.h>+ U9 }# f; {' ]; a5 l, `
#include <linux/kernel.h>2 ]- I$ C" W6 m, a
#include <linux/types.h>
) [. B1 S: l! }#include <linux/gpio.h>: \) I$ G1 ^3 w% W
#include <linux/leds.h>- Q3 B: N% ?& R* V: X4 W
#include <linux/platform_device.h>
) J8 o+ |+ ^1 y$ E3 n
! G% O( i( Q0 G$ d#include <asm/mach-types.h>5 V, J5 f0 z( d" A+ T4 j9 L
#include <asm/mach/arch.h>! `; e0 q' Z$ X6 W
#include <mach/da8xx.h>4 ~- O/ b' y. `; e" U! b, t1 U) v
#include <mach/mux.h>
6 m- c, \; e# @) L& [! c* T3 a- F: n; x% O4 d# }8 _7 J# M" K+ r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
3 N+ \- N/ G0 W#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
8 v1 M8 D" `( h& {( Q! Y#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
& X- `; @# ]+ ~2 L#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)3 M3 u1 Y: a N9 B
0 d9 h a# U) s( h, L/* assign the tl som board LED-GPIOs*/% V9 K3 n$ `- N4 f! u. Y
static const short da850_evm_tl_user_led_pins[] = {5 n; e% t5 Y! Q# G, n
/* These pins are definition at <mach/mux.h> file */7 C( c( i3 k. A# v
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,( |( E x" S9 ]6 E' J. v
-1, ?2 _" Z9 T% [' B+ j$ ~
};" w5 _: k+ o5 t; |, @5 C
+ C* U' `7 X, t3 y3 astatic struct gpio_led da850_evm_tl_leds[] = {
0 U7 m7 T2 a; _& s% G9 T0 L {8 X6 s a* c2 C) ^3 L
.active_low = 0,
5 d- z. E; y" w- Z1 |% g .gpio = DA850_USER_LED0,
. P2 w h( [$ a1 k/ M .name = "user_led0",' t" s; W$ E& {$ n0 ^8 T
.default_trigger = "default-on"," J# b/ c+ b) }0 a+ T
},; v' |- i W- _* P0 I/ z9 W
{
0 T% O u! e1 A; j .active_low = 0,
8 l+ ]& r+ ^; M' Z .gpio = DA850_USER_LED1,
, D' @; E0 V: q9 {3 F' N" _9 I# O .name = "user_led1",
% @8 @ Q; i4 S- l .default_trigger = "default-on",
- V. C8 D% }' t },
8 t0 ]5 y* L2 a+ @; J {
! h; N0 _" V' G .active_low = 0,
) I/ _- I m e. D {; Q. x, } p .gpio = DA850_USER_LED2,# u$ O) Z2 `# t# P# {8 ^8 N( k6 u
.name = "user_led2",
( F) n0 Y3 @ C; x" m: ]& ] .default_trigger = "default-on",# E/ a$ u! D0 Y9 i
},
- W2 V0 [/ R2 o {; q1 W h8 E# ^' X6 e u
.active_low = 0,! m5 B/ T5 |4 F, j
.gpio = DA850_USER_LED3,% E3 B( ~3 {1 B3 K {
.name = "user_led3",. ~9 A H8 h0 H, Q% I. ^' r) W" j
.default_trigger = "default-on",
) y+ V/ ?% e7 D },% }$ M2 z/ [: `; A# R
};- C( K! Z+ n+ ^2 X k
" Y0 u( L' n, U6 b* G/ S4 m! E
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {" j' x/ ^; g# m. `; W& ?5 s( j f0 q
.leds = da850_evm_tl_leds,+ @, s [8 x. h6 o
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ z& n5 _( i# y4 O, t Y! e};
' \8 r$ p& s8 o3 M3 [3 d& e8 ^0 F3 T8 P8 t
static void led_dev_release(struct device *dev)
( ` H3 H; f0 E8 y' T{* h, l$ R# }: r9 h
};; N* f! c6 `0 y% t! d! s. O
* o$ K( w7 h/ Ostatic struct platform_device da850_evm_tl_leds_device = {0 g. G9 |- T% m% `$ @& N+ ~& `6 S3 N
.name = "leds-gpio",
( k5 G' t( V! j( \4 a .id = 1,
0 a. \5 E9 O( o2 O" m# \" _) B .dev = {
0 {: B9 R6 h& X5 A0 ?- J% ^4 d4 l/ ^" c .platform_data = &da850_evm_tl_leds_pdata,
! ?/ Q; P) i5 e" @% | .release = led_dev_release,
$ B3 ?& F4 G7 n: S) ~! I2 ~1 h' Q9 |5 t }" C& Z1 t# R) Y) E
};
9 L w2 O& J( [# @" m1 d& U/ s5 N- c# |% k' k( k% |0 E
static int __init led_platform_init(void). L/ z5 x0 D1 u: b3 E& v
{# M$ v- }* z! ?+ y0 A
int ret;
( I8 |. i/ t+ u2 Q* |8 {. P#if 0
* E- [: l& e6 H( L ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);& B5 X0 B& e5 a; u
if (ret)
! H3 c8 a0 B2 g7 l( P* ^ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
, u+ z, Y( L7 ^+ P6 L) V9 P7 d! S "%d\n", ret);
& [+ e' x2 p" {8 ]' n#endif9 V* I5 w+ O, w5 G5 E+ A, V
ret = platform_device_register(&da850_evm_tl_leds_device);
7 B0 a9 T! N# `* U, s+ w5 d if (ret)
" C* O g: i! Z0 u4 m pr_warning("Could not register som GPIO expander LEDS");
0 \( P; Y5 p3 d. I+ c; c4 I/ W* \ else" ^' Q5 `" @/ P: p- ]; C
printk(KERN_INFO "LED register sucessful!\n");
+ |8 v0 _$ Z( m% g% o! t# n: V2 n) T
return ret;
i) [8 Z/ r5 I! p5 f$ `}& S, d5 I0 F# w7 m7 Q% k$ v
! ?2 `4 o6 y, {
static void __exit led_platform_exit(void)6 o% v4 N8 B9 F, Z q
{
" @ d. a1 }0 q8 C: X# V3 K platform_device_unregister(&da850_evm_tl_leds_device);8 C4 v" L+ o8 `5 Y
4 W$ W9 z1 z* H/ p8 N3 d printk(KERN_INFO "LED unregister!\n");
$ y) p/ |; P" l9 h- m9 f) ?5 s4 X Q}4 o& j3 s% v. k) c }
; n9 Z: Z x% g# y8 ?% k$ hmodule_init(led_platform_init);
1 X( H' u' Z* u1 Pmodule_exit(led_platform_exit);
1 v. Z! Q5 V" K7 a3 K
, h' J& Q1 s6 t! a' x! aMODULE_DESCRIPTION("Led platform driver");
" T( v ~' ]; d. L6 h# U1 `MODULE_AUTHOR("Tronlong");- d" P) R2 ~) q$ s/ C
MODULE_LICENSE("GPL");
$ |' v; x3 F- ^6 h+ f3 u* t
; s& Q$ p/ {( v6 O |
|