|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
, _( P9 }: ^0 S2 l) \0 @#include <linux/init.h>' W6 S0 o3 A. S& ]+ j% g# L
#include <linux/module.h>
) e% J1 ]. T) p* c2 J/ Y#include <linux/kernel.h>
- E5 a* x- W) k5 c9 H, u8 e* q#include <linux/types.h>! O1 S, o' `) {+ y$ o4 y z
#include <linux/gpio.h>0 r) J e! v: k' @* J+ V, x" O; d: o
#include <linux/leds.h>
3 T1 E" m% G/ ^0 |8 N/ r' X3 @#include <linux/platform_device.h>, [' m; U! x2 l9 Y6 V. ~
# [& I/ L" t$ h6 s) p#include <asm/mach-types.h>& w9 n7 I0 f1 x& w3 p- j
#include <asm/mach/arch.h>
5 J& X3 } l2 D4 j" m#include <mach/da8xx.h>. B% c5 H7 n3 D1 O! ]
#include <mach/mux.h>
( K' l7 }. R' P' i( q6 R3 z6 l- r0 l7 Y* `
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)# h1 F8 ]) u, Q6 {0 b
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
* y3 G; ~0 c5 I. Q1 A2 k#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)/ A! W# q$ J" ]
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): k$ O* b( t$ e/ m P
" z9 W9 u I$ {1 m/ W, i; D/* assign the tl som board LED-GPIOs*/0 s; s' H- t v0 s6 _0 W( V) e8 F9 @
static const short da850_evm_tl_user_led_pins[] = {
+ H: j+ a6 x8 \! B /* These pins are definition at <mach/mux.h> file */1 Z/ W H: K8 x" O( n
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
% T3 m: |1 U4 }9 Y( e -1( @% r" [8 X" V$ h
};- j0 R. k" ~( b/ z
; @8 r6 v1 h# Gstatic struct gpio_led da850_evm_tl_leds[] = {
, F2 j! i$ |4 Q8 \ {
. D$ F8 a* K6 a* W/ x& r) V .active_low = 0,
6 z. X O8 i" ~6 J% T! w .gpio = DA850_USER_LED0,- g, S. A' {0 F) M/ p6 r3 i2 Q
.name = "user_led0",
$ ]7 U" R5 w3 J5 D .default_trigger = "default-on",9 _9 T% S3 W3 _& M- L A
},
5 X1 g. Q" H+ k, v7 | X: V+ r {# Y* k, e& k, z+ o+ C2 O
.active_low = 0,# Z; l5 ]/ H2 [# A% N
.gpio = DA850_USER_LED1,
$ G- p# } P; D9 X .name = "user_led1",
- {5 W1 Q8 y3 Z4 M .default_trigger = "default-on",1 D! o6 }. q, u) @3 S
},
7 r& p6 j+ j8 B: i5 p {
7 j$ s5 J& i8 X2 w" {0 P, }# @ .active_low = 0,. B# D8 h8 @5 s' h; T
.gpio = DA850_USER_LED2,+ G. s" R! q& C+ l$ N/ {
.name = "user_led2",
! `: ?2 f3 }6 ~% w6 [) P .default_trigger = "default-on", l% ^" G6 T; A7 M0 q( S
},
% }; ^2 m [, `" D% @& L {
U) E6 f7 k% x) Y0 _2 \( O+ g6 C .active_low = 0,
& b- l8 s1 }0 g6 ]9 j .gpio = DA850_USER_LED3,' w: {! J0 T% f' P, w9 J) s9 w
.name = "user_led3",
: j+ H& X' F( G* B$ C .default_trigger = "default-on",0 [* p2 j/ h9 T9 ]$ @9 V
},# t3 c- n. d+ y1 i
};% q: y. k' L0 [7 b I& B6 s
) L6 n$ }, E2 j" N
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; G( P4 `0 N% O; n5 V6 v2 E3 |7 y .leds = da850_evm_tl_leds,
l1 V2 ~( Q3 L/ k. g( S .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ j& S4 T, Z9 R2 @+ w# v};* J& p, S% F9 [( _( u z# K* I7 V& B" l9 X
' [! w/ M1 N) q5 j. G: D" qstatic void led_dev_release(struct device *dev)1 D) X V3 Q( e9 F/ {" m, N
{
) G; c. {; V" P! a1 V};' l" k. [) v" }: f+ N3 m
: l/ f4 N6 R8 b
static struct platform_device da850_evm_tl_leds_device = {
E4 F5 E, q% j. N .name = "leds-gpio",8 x( n" L* g# `4 C6 v/ r
.id = 1,
% [0 Y1 K: l! t# C( C+ I .dev = {
u" C P* f/ k8 l* |0 G .platform_data = &da850_evm_tl_leds_pdata,
$ ]2 e3 Z: i" m- F, |! |6 L .release = led_dev_release,9 I) D7 f9 N- }) n
}) A: c" u5 T% g/ v9 k9 a! Q
};
/ H+ r% _, x9 f
: o u0 H" x* pstatic int __init led_platform_init(void)
; a4 b' r9 L/ s{
3 g5 y) O, Q7 | int ret;
% s7 r6 [( { B( f1 f3 V, Q& c#if 01 s9 `& | C/ s, i1 V$ q! E% y% J# X4 m
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 _% u; C7 a: T' p3 Y+ [9 U* U if (ret)
3 l3 y8 w6 O: x2 ] pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
/ Y& C% a$ B. x4 b; B "%d\n", ret);
# v% e5 A M7 q4 r8 H: w7 h#endif5 P/ n) B% B" Y$ X& i8 r6 U
ret = platform_device_register(&da850_evm_tl_leds_device);
9 ]8 z% {; o4 |6 [0 ?; N if (ret)
& l% g1 g" ]( C! D1 N pr_warning("Could not register som GPIO expander LEDS");* _3 V9 J& W2 W; l
else" j2 h! C+ n. B p' h
printk(KERN_INFO "LED register sucessful!\n");
( o7 P2 F7 g" S* b8 }1 d' O6 }* A+ S* B8 `8 M. Q
return ret;
% Q* l. A! J0 {% c+ v, [}
! N! ~% x/ ~ _% @1 X& q% O
. u9 F5 e2 U! Cstatic void __exit led_platform_exit(void)9 t) j& k' q8 [
{, d1 Y, W& j" R
platform_device_unregister(&da850_evm_tl_leds_device);
% N. }8 f4 G6 \! ~0 R5 O
9 q) B# _7 h! z- _. W. B3 j S printk(KERN_INFO "LED unregister!\n");6 t: {9 ~8 q+ [* u5 E4 C) Z
}) Y3 S2 N |; Z
8 f! D; O7 w$ j$ kmodule_init(led_platform_init);
& q/ C8 l$ M, t R) |module_exit(led_platform_exit);* U9 G0 q+ K) j. q* f
& u. U( C0 n- U$ j- j
MODULE_DESCRIPTION("Led platform driver");
7 B( j+ ]1 h, \. Z) V; Q/ eMODULE_AUTHOR("Tronlong");
F: z2 L3 A, q% X/ C, I) OMODULE_LICENSE("GPL");5 B$ c& k0 r, Z# `: `
1 R" [, E+ a+ P
|
|