|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) v/ {3 t( O1 I( Z/ M: k) v#include <linux/init.h>
! ?+ B; ^- [! a+ E7 s1 Q" z5 e& F#include <linux/module.h>
5 a( S5 ?0 X k3 M$ b#include <linux/kernel.h>. A( T1 @" ] j3 f
#include <linux/types.h>
9 c( e0 E7 f+ c' p4 X, X3 h#include <linux/gpio.h>$ ~+ a n4 o# V
#include <linux/leds.h>
9 j# t, J/ O% _2 r* i#include <linux/platform_device.h>
! |, Y0 o; Y' o4 q; f/ m; `1 v. ]% @! v/ m4 J( h: l
#include <asm/mach-types.h>
9 g+ j/ D# U& J#include <asm/mach/arch.h>
; ^0 D( g+ A) J, y) \$ o" E& B#include <mach/da8xx.h>6 [2 C/ e6 e% T
#include <mach/mux.h>3 M9 C9 S! }/ C3 s3 R c+ ^/ E
# k) V3 c& Q, o, Z. c& z#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* j* ~3 g! f- u4 C+ E
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 O/ q! Y, D- A' D#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). D6 ]% f: F9 H8 w! Z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2); `" n2 Q2 t5 n: h& q
! \! N9 ]4 ~1 j* F# c$ t
/* assign the tl som board LED-GPIOs*/7 U& \/ i4 ~" Q: j1 [& W( T) o
static const short da850_evm_tl_user_led_pins[] = {# Q1 e) i* s6 j; |, h i6 {
/* These pins are definition at <mach/mux.h> file */8 b. D4 z& j! \( l
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
! s- y, a' p$ d% {0 x: f -1" @' Z* j4 Q& E h( l2 D
};6 b; q* l" s& s* M+ j/ u
5 X' {- Q' q* C2 W
static struct gpio_led da850_evm_tl_leds[] = {( X$ L6 c$ _$ W+ d! m
{
" w( u; D% ~) ^4 Q! g, g .active_low = 0,
1 }+ P6 [! y. n/ h .gpio = DA850_USER_LED0,
/ r# i" Y: J2 _0 s: e2 X/ s .name = "user_led0",% y! ]5 G" Z: O6 \, A- O
.default_trigger = "default-on",
: K* p [- p! _1 @: Z9 C9 m$ R },* W+ V) T) V% \. g
{/ ~6 D# H3 ^, ]5 c4 ^; e" v
.active_low = 0,5 L7 E7 g+ ^5 ?+ @3 S% N. M7 B
.gpio = DA850_USER_LED1,
9 i b6 Y0 ^0 A .name = "user_led1",! V& _8 m' W4 p4 V
.default_trigger = "default-on",
* t0 u3 _; R) k7 t1 G+ l },
$ g3 c/ p+ B- M! K) L- z: f {
3 R5 f8 Z, b( n8 m, i6 O- I .active_low = 0,; T9 ]+ a5 Y- G- e6 d1 \$ w# {
.gpio = DA850_USER_LED2,
7 e' l( B1 k. c: ? .name = "user_led2",; Q& o6 M& D5 w$ J* N5 R/ O
.default_trigger = "default-on",
* B/ d' `! c q2 Z9 h5 Y },
# F0 W$ w1 }1 h7 T# e {
2 \% n: u1 s) [+ `/ U* N9 C) Y .active_low = 0,5 ^# T y6 ]! J I. h" ]7 I
.gpio = DA850_USER_LED3,. Y8 E7 o" a, n) o9 P' d
.name = "user_led3",
# Z! A, K+ P _; Q# P- E .default_trigger = "default-on",; l# L5 R4 H1 F
},
& f" |. {6 d, I$ M};
0 d n- x. i$ @$ l. E7 ?1 \7 y7 ^
/ D; E. q7 B9 R) @# p2 B: nstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
. @4 R- x+ ?3 i( X; A$ g8 h- J .leds = da850_evm_tl_leds,
# y7 ]% L/ h i .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 q: _# k% h+ ]# k( U8 r; N};3 Q4 ?+ n7 I$ @4 Y
" u' \" ?! M: C9 i9 u2 @8 t( j
static void led_dev_release(struct device *dev), p6 E, m; C8 E, L. U' [
{1 }3 U( a7 Q `$ n. f5 l# C
};2 a W" V" c! j* c9 M" K
/ L) b( Y$ @. R9 \- ?2 N. gstatic struct platform_device da850_evm_tl_leds_device = {6 `4 w" S! i' @, M. r1 S
.name = "leds-gpio",
3 a/ Y9 v( x' a! V .id = 1,
) \* \6 l' a; k' c4 z0 A1 O .dev = {! U) U. ^( f" j" @3 S
.platform_data = &da850_evm_tl_leds_pdata,
J5 f3 t, j* {3 ~4 J' ` .release = led_dev_release,. q- K7 c% j9 j, U
}
2 b0 J' y a8 @}; } x' Z( }, o& o. U
" K8 K, m7 J$ j$ S
static int __init led_platform_init(void)
" C6 G. G) Z# ] m4 p{
3 q6 u: g2 ]9 h9 K& F) G int ret;
' M3 ]& r5 y( c5 j6 O& q$ h#if 0
0 D; @. \3 F7 @9 ?$ `3 h4 Y ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); [3 u' _+ c5 d4 f
if (ret)
. o1 w$ p. i0 i6 F pr_warning("da850_evm_tl_leds_init : User LED mux failed :"& R$ I* x& t* Z/ @( N
"%d\n", ret);
* D# p1 n; y+ g, r2 |* t; ]#endif
5 X% X) P, }2 g0 K+ K ret = platform_device_register(&da850_evm_tl_leds_device);
+ ?. F3 D& C7 p' n% } if (ret)$ ]& T7 T9 u+ y! J$ R$ O/ }
pr_warning("Could not register som GPIO expander LEDS"); A# O4 {% J8 W% }: v+ D
else! j- z. y7 `3 H) p
printk(KERN_INFO "LED register sucessful!\n");8 o& @9 B$ k( m3 R
( I# {. u7 g$ g2 h return ret;# t+ `. s# P. _: L3 G' i: ?) R
}
% z* ~. z/ E" C) P8 _) G
' p( Z& `: d7 V$ X2 X% z/ z4 ?static void __exit led_platform_exit(void)$ ?! f* M3 C$ l
{0 Y4 |& Y' w9 @" S: p
platform_device_unregister(&da850_evm_tl_leds_device);- ]% v2 m6 w3 f4 J0 s
& t9 R) Q) N* W8 H printk(KERN_INFO "LED unregister!\n");, s9 Y4 G- ~, ?/ G3 P9 s* N9 S) b
}6 [: \0 d; b5 @ W
) n" B' E; C& B: n5 [8 W% A
module_init(led_platform_init);0 C- N# n1 \# S6 m) T5 q+ `
module_exit(led_platform_exit);, I) J' T+ x' `& V/ @) P
3 I: @2 i7 @! cMODULE_DESCRIPTION("Led platform driver");, y5 }# q B2 V; u9 q3 a: y3 a9 j- G
MODULE_AUTHOR("Tronlong");
' T+ Q8 u8 k% b0 a2 K& p/ F8 R# lMODULE_LICENSE("GPL");2 D! H( \# u0 h+ c. a4 ?$ r
) n9 e# z, L N7 ?& D
|
|