|
|
求大神给下面的程序做注解,请稍详细些,谢谢。- e j3 J H; }" C2 ?+ j! ^
#include <linux/init.h> |: j# i4 u p
#include <linux/module.h>
* [5 [7 R9 s4 K( G2 q% ]& B#include <linux/kernel.h>: o/ |! L7 n7 f8 ~' t
#include <linux/types.h>
5 p. {) P+ L& X0 W Q! {' H#include <linux/gpio.h>
% ^4 o! q$ I; r( \0 a/ k! R#include <linux/leds.h>- l1 [2 P" q& y y& k
#include <linux/platform_device.h>4 l; l& P. c3 P. I5 ?
0 R" I6 B( S$ i* S#include <asm/mach-types.h>
7 v# f- o1 T4 F. M; j5 M#include <asm/mach/arch.h>7 ], }5 I" J) J. m7 L
#include <mach/da8xx.h>; u' {: H3 ?" a" ~+ j: E& u# t
#include <mach/mux.h>2 M: r& t' z4 K" |
8 Z0 ]. B/ A% j' s; T
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
S/ V, V$ Y- P7 {) C#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
0 p; c4 p! y6 U n$ o$ G#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: J- y9 \+ l0 S% C) B E! N h#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
% K- ?5 m: w7 {
9 q$ {% G0 Z. Z( {/ a/* assign the tl som board LED-GPIOs*/9 T# @; o3 K ~, ~1 \4 \, b
static const short da850_evm_tl_user_led_pins[] = {* M" |3 m! S& [# k$ }+ L! T) |1 r
/* These pins are definition at <mach/mux.h> file */
. U9 {9 c! e) C {3 i DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,% L" ^/ h+ F/ E2 a3 b% K
-1
8 D5 r/ F5 J* z% }- N+ }5 S};
" }( n U5 i1 e* S: a
& W% d; `4 U' X9 T- k/ n% Astatic struct gpio_led da850_evm_tl_leds[] = {
( S0 @+ R# \# p5 D" o {2 |( `" P* f9 r; e9 U0 h, L- r4 `1 v
.active_low = 0,, b3 \1 q8 w/ p- ?
.gpio = DA850_USER_LED0,
# d$ d& c, a N .name = "user_led0",, I2 Z9 d6 F5 Z, c3 E0 _7 h; I
.default_trigger = "default-on",
! u7 B: s8 {' D1 E. h- G3 i3 J$ G },! C0 J+ x& ]6 P
{* v1 j2 U: r& m. u# J8 h
.active_low = 0,% c/ S; H l: Q m# W, \
.gpio = DA850_USER_LED1, N. Z+ y1 z7 O% G; \2 L+ `1 L
.name = "user_led1",
# R2 _1 R6 u3 U .default_trigger = "default-on",
' _3 @2 s# j" Q B0 b },
2 s3 G+ B$ K5 G6 y. c9 m {% I& l3 J2 S# @9 \; N, `
.active_low = 0,
1 P, l7 e0 P/ H/ A& k, J .gpio = DA850_USER_LED2,, P* P" A- g5 s _1 x
.name = "user_led2",. L/ v5 O8 Q' y& b2 y; ^
.default_trigger = "default-on",
q% v' G/ v( y% I4 t/ ~ },
( j! H) w* `) r, C) S1 @" J {
1 y% M0 @3 ?6 v' ~2 { Q* Y .active_low = 0,
) Y6 m g' I5 A T .gpio = DA850_USER_LED3,, }- p. }. C9 y4 ]- }- K$ V
.name = "user_led3",- y7 G8 p7 r( @2 g* M
.default_trigger = "default-on",
; Y6 z* ~1 h% i9 T% ?( { },
: A3 Q, ?8 @8 Q% B};: R- Z# K, Z* g k
! q Y' `% P/ _+ hstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {! k( B4 Q3 i9 J/ b: Y
.leds = da850_evm_tl_leds,$ W# Y1 V- w; \$ P) |2 R$ c
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),) w0 [7 ^7 \! Z8 {
};
/ v5 ^# l6 a7 |$ s
' E) a: E% \$ f& Zstatic void led_dev_release(struct device *dev)0 t9 B/ \: r M9 s6 K6 p# v9 B
{
4 b; D9 l2 J5 q% a2 X; }1 X};2 E( j$ ^, {: v* Z" j* U+ ?$ M3 @) m
% P* h% J$ q6 m5 X' _- b) R
static struct platform_device da850_evm_tl_leds_device = {
! T' S- D) F* W; V; ]1 K .name = "leds-gpio",
0 G1 X, u/ F% V* F1 w .id = 1,
4 b2 a9 e# K+ N& q; e' i* W' d% Q .dev = {/ g3 w, i& {! d/ D
.platform_data = &da850_evm_tl_leds_pdata,
1 h) O3 }3 @/ [. \ [" _2 R9 m5 K .release = led_dev_release,
; O4 ^% v2 T2 B F/ }) B9 X1 c }
& X( u/ e7 u; Y# K) R$ F* _" I};
0 y7 z) ^3 a; ?: i
' C# s' ~) W/ |static int __init led_platform_init(void)
8 n4 P* {& n, f4 @0 Q4 Q{1 F3 ?6 A8 H( b% H
int ret;
# i8 Q/ d9 y/ `7 K' |& r#if 0: k' X' X. r5 v4 T% Q+ ?7 p Z, X% y
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: p+ N3 O0 ^0 i6 j
if (ret)
1 J8 l+ N: j8 s pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; l0 b" v1 J9 [6 O' v "%d\n", ret);
8 d5 ^- J4 O C#endif
: p- m1 j" p7 c ret = platform_device_register(&da850_evm_tl_leds_device);: P5 C8 C3 ?& x
if (ret), O, X9 n" |4 X1 n) z) x
pr_warning("Could not register som GPIO expander LEDS");' D4 U F! m: z. N1 i
else
0 u, C4 J9 `4 T! y0 H printk(KERN_INFO "LED register sucessful!\n");
* ^3 Z$ u6 U+ t- u
; U$ g& }% x. ]/ b% U return ret;& R% a- w* b J) R
}3 E/ `. O W/ f2 v7 \. ^' U
/ A! K* K# R3 x9 k! P9 l
static void __exit led_platform_exit(void)0 o9 U, x( U7 R5 j8 h: T
{4 Z; D1 u4 y; a3 i8 k- R- x$ s
platform_device_unregister(&da850_evm_tl_leds_device);
~4 g1 ]$ ]% s8 t( Z2 Q" K/ m H
printk(KERN_INFO "LED unregister!\n");! {9 a6 d& Y! }
}
/ ^7 `1 B' V, [. N! {0 c
; R4 ?' l* j, s9 N2 N" lmodule_init(led_platform_init);
5 I( q$ D( h% a5 n% D2 bmodule_exit(led_platform_exit);
) G" l1 ?4 i4 H4 w, M% B+ h- M7 ?+ T- f
MODULE_DESCRIPTION("Led platform driver");
$ ~( h5 d9 k- dMODULE_AUTHOR("Tronlong");" ~" C5 [: ?( Q4 o
MODULE_LICENSE("GPL");$ l( O& P/ [# i# }- h" U* ^; o' [' P' q
% o1 k6 s! n. @' M, i$ s, Z |
|