|
|
求大神给下面的程序做注解,请稍详细些,谢谢。( g5 U d7 ]1 Q/ `( C+ B2 ]1 L
#include <linux/init.h>
5 g( K }) ^+ ~2 Y#include <linux/module.h>% f5 m# G5 T6 j+ n
#include <linux/kernel.h>
; n: v- @& S, ~% E#include <linux/types.h>% U" H1 n: k0 \1 J5 K/ Q
#include <linux/gpio.h>1 p% |+ U# c8 V# v' y
#include <linux/leds.h>% K5 n0 T, a/ c4 t( {% m
#include <linux/platform_device.h>$ z) L6 c! }* w6 D: g7 }0 s3 j' k
# ?$ W9 e: e+ h% `3 E
#include <asm/mach-types.h>
. {. c m& O5 w: N5 q) g% `7 u3 i#include <asm/mach/arch.h>
: P; z; O; M2 A; i9 c#include <mach/da8xx.h>6 ? T2 G' W- u
#include <mach/mux.h>
U' K8 e2 }6 [: X& N# T+ ^/ x h2 ]9 c1 Z7 v
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 J! c8 L# M! Z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
( [1 @ ~4 Q9 X! J& c5 x' V- y#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)6 C4 @/ }& {2 b( Y
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)! ~2 {. v7 h4 h& x: X- x
2 ]& ^% h* N% Y: w* J. N
/* assign the tl som board LED-GPIOs*/! |' J2 Z. Q# v" ?" h K! H
static const short da850_evm_tl_user_led_pins[] = {
$ b" S7 J! Y/ a+ S: ?# t1 v+ v4 L /* These pins are definition at <mach/mux.h> file */
: _/ b0 Y( m; _" `' T6 ` DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,, A# ?9 u- b2 E, A
-1
5 _$ ~+ X- J2 _7 O};7 S2 {+ _5 v6 C" a, J5 d- F
. F: F! Z( ~$ h$ d
static struct gpio_led da850_evm_tl_leds[] = {
8 I# m7 u# F+ {2 @" n {
7 f8 i7 Q2 ^3 R( }9 Y+ k- t .active_low = 0,
8 j p, N5 ~. r9 W# O2 _ .gpio = DA850_USER_LED0,* A0 k6 |# G, f6 O T+ H' }: x
.name = "user_led0",- p' K. y7 K7 g1 p1 O7 {0 @, l
.default_trigger = "default-on",
~" {1 q2 ~/ o- [5 V },
2 ^+ W+ N2 g; A3 v$ O/ J4 C {3 E1 H- s; t6 G# \- q& c; D4 ?
.active_low = 0, m& e$ T& S5 F, n4 D O$ a
.gpio = DA850_USER_LED1,% o" m5 R- G& v) p+ O/ K
.name = "user_led1",
+ W1 V; G( V& t- K5 Y* ~' J6 e .default_trigger = "default-on",$ x6 t; k% R, b2 Y) h }
}, U% G7 J3 v: F9 p
{
' W5 j) V1 I) t .active_low = 0,
; S; P3 U0 @ r, @/ K1 l8 e' w5 T4 S .gpio = DA850_USER_LED2,
5 l( t L- r% c1 b; q .name = "user_led2",
5 z3 y$ U K; }' D6 B G .default_trigger = "default-on", h$ B' F6 E8 ?7 U$ k7 h. i8 t
},# ]* V. L$ P& l7 d2 _; _. |: F( I
{! `5 Y3 N6 m" F% W0 `6 \ I
.active_low = 0,
- a+ N2 u7 R) H) W$ c, t4 K .gpio = DA850_USER_LED3,
4 W s3 B* `8 w4 z( L5 M .name = "user_led3",9 ^* j4 K, g% v
.default_trigger = "default-on",% f+ Z. |+ D. b) n. J7 V* S
},
, J5 F5 M' t" r3 C};% T+ }; ?0 o4 Y
; L, [: F. u5 ^9 L D9 ?8 f% E7 Wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
- S2 `5 L' S5 w& C/ u .leds = da850_evm_tl_leds,
9 o# x5 X; k0 V" p: C2 @7 S, p .num_leds = ARRAY_SIZE(da850_evm_tl_leds),& k; {$ v, K2 C# Q
};
8 D! f; J6 h5 h( Y4 R3 }- {7 D, v. k' L- _) L
static void led_dev_release(struct device *dev)
0 e1 y+ k( G5 Q) H- X- M" W{7 @& N1 T1 I: n# [% W, z
};
* W" E; S- U _: j, Q5 F
( X( d- n8 k' n) q. O. S" Y: [static struct platform_device da850_evm_tl_leds_device = {
) U% n7 ~7 D* S1 O3 y9 `; } .name = "leds-gpio",5 K5 K3 T) l# A
.id = 1,
& U5 K+ C: l2 w: q .dev = {" B& ~/ `/ {/ R+ t4 v
.platform_data = &da850_evm_tl_leds_pdata,8 G' I, n6 O7 `) a/ Z
.release = led_dev_release,
+ Z$ f( p1 X1 |) {' d }
+ @+ r/ o8 q3 m ^};, d& k0 u- A( Z; I! \+ K8 F) q
& d" |5 h1 E; C8 f% kstatic int __init led_platform_init(void)
" b( b3 R0 P. L+ `{
2 q' j$ X* X# \1 Y* O2 I, A/ _; A int ret;
# E5 g4 z3 O3 C; d3 q2 z#if 0
' n$ j$ }4 p7 a2 C4 v* l ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);! W5 M# Q. \) {8 I
if (ret)
) L% W2 L& a ?% P pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; r5 p" _# g1 R
"%d\n", ret);6 J6 k: i) N2 @ d( e
#endif# m, t- G# B8 W/ o( o Z6 B9 h
ret = platform_device_register(&da850_evm_tl_leds_device);
0 E h* }/ P) R if (ret)
* M: I% N% e- i0 G pr_warning("Could not register som GPIO expander LEDS");$ p3 |2 l* d- g2 L: w; \ K
else1 l3 s& M* J* h f" M, P, Q
printk(KERN_INFO "LED register sucessful!\n");
8 J. C$ k% t! G- u+ {% Y
. j" m9 }8 ]( B return ret;# I, x) H: x' U7 Q, I: S
}
' E4 `8 v9 H5 p4 T, | B: E
( R% v8 @; w1 Y6 J5 \; Qstatic void __exit led_platform_exit(void)
; D: }; d* z8 Y6 u2 j3 l+ U{. G, Q% R# b" t; s
platform_device_unregister(&da850_evm_tl_leds_device);
/ S( f9 a1 E7 A2 W/ N6 ~
+ v5 [; E. s& q4 P; \* E printk(KERN_INFO "LED unregister!\n");% g ~- d; G% @
}
% n# S% Y3 H* P) N# H& V9 @
# s! C1 M5 o3 R8 }module_init(led_platform_init);
0 E2 F8 N' b( R# K1 B6 Kmodule_exit(led_platform_exit);; O3 |2 i }6 k& F# w! P
* k9 r3 E7 f. M5 K* | N2 c
MODULE_DESCRIPTION("Led platform driver");2 G- [3 b4 A" n0 [
MODULE_AUTHOR("Tronlong");6 k T: r' i7 C! ^- I! ~
MODULE_LICENSE("GPL");
/ X( A' a! t( S( r! z( ~; l
* d) g7 J# V2 @0 J& u |
|