|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ m5 k5 Q8 r: D) K#include <linux/init.h>& X- j; B" m* X
#include <linux/module.h>! ~/ U. J4 B* E
#include <linux/kernel.h>
$ E7 I, a5 s. s" O$ R6 E0 \#include <linux/types.h>
" m5 N$ y" f) g#include <linux/gpio.h> x, E8 w5 J" S. R5 y* a$ k
#include <linux/leds.h>7 b; L. n* g; K2 V" f5 Y3 g
#include <linux/platform_device.h>4 U7 G) ^/ n' U
# y4 w9 S6 @# S) j$ b#include <asm/mach-types.h>' ]5 C. c0 y8 A! e
#include <asm/mach/arch.h>, Z2 [+ |& ]) o
#include <mach/da8xx.h># C6 p7 I% ~" _/ A4 E a
#include <mach/mux.h>- W" o( \2 G- a
: o* n$ M* m* i" [ F7 P# M, r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ H% b+ x4 M. y) h9 n" [#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
* C1 ~% i* L( Q# F: Q) \#define DA850_USER_LED2 GPIO_TO_PIN(0, 1); O* o3 @& }) v, h* ]% H
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
7 L# v4 B4 X" M& S1 \: t4 c$ _% V0 Z' ~$ I4 e y
/* assign the tl som board LED-GPIOs*/) \& s! d) v U1 ^- t
static const short da850_evm_tl_user_led_pins[] = {- [1 y+ a1 e9 v: M6 z& d
/* These pins are definition at <mach/mux.h> file */
2 ?1 d7 G4 h, G, L3 }* @ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,0 u7 u# y8 J: h4 l4 h: v
-1
; @. [) R/ Z# q! d3 W; p3 l R3 F};% K# |. N( ]9 u6 J
/ b. n$ Z2 M. j6 c
static struct gpio_led da850_evm_tl_leds[] = {/ J( l& y0 @5 A5 M2 S
{0 }. W9 X- l# I' H1 z- o) |
.active_low = 0," ?6 M% l0 y; p$ m1 `% q
.gpio = DA850_USER_LED0,* Q7 P/ {- v" }
.name = "user_led0",
* D2 F) ?7 p6 V3 F( ?" f1 ` .default_trigger = "default-on",3 b, t% L. L" R
},+ @. W E! s# B$ j
{' ?2 a i! i; X3 j2 {$ ?% s- u- m
.active_low = 0,
3 t. Q4 G$ V# q$ G6 P .gpio = DA850_USER_LED1,1 v0 q+ b; B8 d6 C
.name = "user_led1",6 R8 Z. v. D! |! z% k; Z, ]! ~1 e
.default_trigger = "default-on",
- ^% r1 [5 z! z/ ^; @( k },
& h0 q2 z9 f5 h! A' l9 e {
& Z' U* H; _2 V* a6 E" E! X .active_low = 0,
. R1 L) P" ~. h; c6 t .gpio = DA850_USER_LED2,6 E( _9 M$ `. v' C4 S& L, N3 K3 w: z
.name = "user_led2",( _, _% L5 H' P* ~1 a
.default_trigger = "default-on",
: A2 |+ e N( c },
9 B7 i' V w* _ {9 {1 F, h* ~9 P* B- B
.active_low = 0,+ @. Y% o3 ? F I; u( K4 l& n5 m6 A
.gpio = DA850_USER_LED3,% S* V7 u; y q1 i
.name = "user_led3",
# c$ }/ K( x" c1 U# u* H .default_trigger = "default-on",
$ m" C- B8 n% x( Q) g },
8 G% Q- W4 g% T" O5 k};, o/ `) P. D+ ]% e& M4 x& F2 q) j
8 V- r _) A" @3 istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
2 F3 z. ]( S+ K. [ e .leds = da850_evm_tl_leds,4 [7 l+ o c) @, c, W
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),8 e. p+ }- s- ^
};
0 i3 o# I9 S" q6 w2 k- w+ z2 ?; \" d1 N" b, ?( i* k2 a! G5 I
static void led_dev_release(struct device *dev)
g! M" U9 N( F1 W0 o{! f- q" K! O0 p1 ]. Q
}; Q7 F2 o/ Q8 C
4 C) H F8 h; l
static struct platform_device da850_evm_tl_leds_device = {
) z- k" Y) T5 k9 M8 l& x; u .name = "leds-gpio",
7 y% H) D: W/ a, X% | .id = 1,
2 r7 L5 n& g! y! H% o! X .dev = {
" s1 V- N- |+ @+ X4 M3 \ .platform_data = &da850_evm_tl_leds_pdata,
& |& _4 e/ |, q% q .release = led_dev_release,3 `6 u3 ?6 o K# N
}
9 P/ [! w" m1 o! ^( Q. c2 g};; r8 c& z1 F. W, N" T2 U
" v6 }- ~5 H; p0 H5 L6 B5 J8 ~static int __init led_platform_init(void)
8 w: F' F7 z( h0 r- E( c) O4 G9 o{6 B- K: p, h% B& }: V) T
int ret;% c. w/ m% }1 e& \( h1 d% z5 j
#if 0
: W) ^: v- c# N) ]* j( P0 u% k ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);% P. o- H u |: h1 Y6 d
if (ret)
$ N6 _/ f7 C3 j. {4 `& H pr_warning("da850_evm_tl_leds_init : User LED mux failed :") f& |) k$ j1 F; Y V, o
"%d\n", ret);6 a/ a1 J: [8 {0 k) Q0 T7 c
#endif% R/ W8 |6 F# H1 U; q
ret = platform_device_register(&da850_evm_tl_leds_device);% Z) |2 n+ j% o/ \4 d3 {; a
if (ret)/ B8 A2 L7 m7 S, ~! {* A4 c
pr_warning("Could not register som GPIO expander LEDS");% g5 a, B+ y4 Q; j
else
$ E0 K- }7 T- M9 L printk(KERN_INFO "LED register sucessful!\n");7 d) O9 W4 c$ Y3 b8 \2 X4 p; T
( `) I. w( {( Y' s6 \" m return ret;2 t2 Q3 ]; q% v9 t d! q
}3 m7 k* L( m) p d" Q0 m
3 J- A! Q; m! _& [, A1 l
static void __exit led_platform_exit(void)
5 Z4 P. Z3 T; ^1 D{
8 ]; }- U q: Q5 e$ A platform_device_unregister(&da850_evm_tl_leds_device);8 a6 [7 t* T! K% E
T" O2 K8 u3 n: j printk(KERN_INFO "LED unregister!\n");
9 h+ k" s$ F% L) Z: {9 Z}
0 h- P% c2 [! r' ?( R' t9 D B: `+ ~; s6 q
module_init(led_platform_init);8 H8 f( E2 z6 R
module_exit(led_platform_exit);
* r5 x* Y+ a# C' q ~* l! h, v2 R2 Y' ?- P
MODULE_DESCRIPTION("Led platform driver");
: z1 I5 ]4 `1 u( V4 h2 O3 M0 y9 y3 hMODULE_AUTHOR("Tronlong");
5 I G1 D! ?2 \7 G8 F1 V: K4 g" _' gMODULE_LICENSE("GPL");9 L9 ^+ L9 V0 i; e! x
* D3 s5 ` a5 ?5 ?$ b
|
|