|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: H) e/ q* S8 F# C ^. \* @$ b#include <linux/init.h>, m, @6 c8 U7 a, k# S9 {
#include <linux/module.h>
" R8 j* `) M) H! k# z! b#include <linux/kernel.h>) x4 _$ A) V* \7 `, l8 s
#include <linux/types.h>/ V( D- p, b" q2 L; E+ G
#include <linux/gpio.h>0 I @3 h1 n6 f6 X
#include <linux/leds.h>
# n7 M3 b2 P' m2 ~$ @8 H$ d6 F#include <linux/platform_device.h>
* z4 P5 c9 h& @( Y e
, D! i. e8 m. H3 N" @5 y' s9 g#include <asm/mach-types.h>4 o) z& ]2 |, I3 h; m( m
#include <asm/mach/arch.h>, l* Y$ _. C# v0 a; w9 [
#include <mach/da8xx.h>
8 Y9 n. N# V/ t" X#include <mach/mux.h>$ r+ T5 I( j, [6 q
4 ^) ~& t, v; L& D8 U J/ Q; y#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% ` y6 v% B1 {0 o: F5 ~$ m& J
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' S7 F" B2 n& z+ X( K# ~+ ^+ Z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! [9 k, Q3 r0 R2 s! e#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# ^4 Z5 r2 {7 V, W$ z
* {. ]0 k* t+ e- Q% G
/* assign the tl som board LED-GPIOs*/
1 a, P! l# j* B, M( B" P- ]( h. vstatic const short da850_evm_tl_user_led_pins[] = {
) q$ p. J( x7 j" V+ a% X, N& g% k /* These pins are definition at <mach/mux.h> file */
N# x% g. k5 L/ v, e5 N DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 D; P) W4 K# `0 ?' v5 S! q
-1
$ e. Y& }. m4 K; p, y$ p. W5 B, ]};
8 h# B5 p1 Y3 Q4 x
3 x2 l* q3 s/ K1 U4 t; V# W" h1 cstatic struct gpio_led da850_evm_tl_leds[] = {
- l& b: k2 m/ |+ U) S {
! o' V8 @! {' J( [4 M .active_low = 0,
$ _/ D# b2 o) H V8 z .gpio = DA850_USER_LED0,
9 \% Z* z7 h$ x4 c, F .name = "user_led0",+ }& \2 q+ _* O9 A
.default_trigger = "default-on",2 ]+ t' V6 r i& O2 w- ~
},
3 E3 A& C( s$ J: f5 R4 W5 b {! z M. v. [8 S- _5 w, \
.active_low = 0,' ?& u3 y7 R9 l1 H) U
.gpio = DA850_USER_LED1,% Z% h! Z5 R% p b- H* H
.name = "user_led1",& _2 s& W7 B q* ]6 e& R
.default_trigger = "default-on",
+ Z' q* a2 N9 n; y3 s9 U2 c: m6 L },
. I6 r# H2 Y2 ]' i! ^8 E) D k {+ U/ d; ^" B4 W( Q' U/ f* I
.active_low = 0,
& E+ `3 d8 I# _9 p P- [ .gpio = DA850_USER_LED2,* O# i) ~, ]' _5 ]: }+ ]
.name = "user_led2",
1 ~& L2 \: E( { S) c .default_trigger = "default-on",; A0 D0 e/ c3 m: h, O: V
},
* a8 [: R! f& {) B, [; D& B {
! h! Y6 _4 I5 n7 F4 n* E6 E .active_low = 0,5 ~( R; N4 P/ H$ f3 t: K a; A% {
.gpio = DA850_USER_LED3,
% T8 H. x X1 y! B+ Z .name = "user_led3",- o7 o4 R# X) w2 i/ P3 l
.default_trigger = "default-on",5 k$ x3 W) [, t
},
- u9 @" X0 i6 p9 M7 f2 I" s- \7 S};
. B" b6 E9 d6 K- G9 z
/ C/ _9 @7 P- v9 f8 |# T2 `static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 V: C- F( ]5 V, n. U( i .leds = da850_evm_tl_leds,1 ]* e/ v" x9 F( V2 ]1 C z. {- O
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ z* \' k% c3 M/ H8 H! P};
' @" G: K M: }( D7 E j3 E8 h" E! P' S# U j' U7 @% ]: A6 |$ g
static void led_dev_release(struct device *dev)9 z7 d0 w3 `% o5 Y+ Q4 Q2 x( S
{5 O Z5 U' Q9 n- J3 a: D* }
};9 T7 e9 Y. c6 }5 S
) q" t/ W) r3 ~: c1 d X3 R0 istatic struct platform_device da850_evm_tl_leds_device = {
! y R+ g+ |8 T .name = "leds-gpio",# y }& w6 S3 Y
.id = 1,
; e) `1 @0 F/ p$ M6 H8 S' ^ .dev = {9 X! x+ p: q" K6 g2 p8 o$ q$ \
.platform_data = &da850_evm_tl_leds_pdata,3 k+ a! F" K# [; c
.release = led_dev_release,( @! n3 ?) S9 u' d; A# e% `& ?1 N
}
; X* R8 s! g7 v, {1 Q5 q) Y) h; H};
- I1 x# K0 L, x% ^! q% w. \5 n5 {! o, N9 l% w3 `2 Z: Q
static int __init led_platform_init(void)0 ^8 Y- z+ m' o6 ?* l+ }/ r
{& a, v5 M9 L: `1 G6 D, Q. \( h
int ret;
7 ~- C& G2 a; {3 T8 j, U% r#if 0
. e* N0 x7 M# T: ~" ]( }- W$ J ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ o7 q' O; s0 r, V3 S
if (ret)
m# {+ }) S1 @4 k# [+ E& P pr_warning("da850_evm_tl_leds_init : User LED mux failed :"8 f- x& h3 w: O7 P$ g, `% B
"%d\n", ret);
( v# }9 V: K. V3 \( w#endif5 K5 ^6 g/ }2 U6 e7 {5 V
ret = platform_device_register(&da850_evm_tl_leds_device);
. `) E( u4 ^ _( G if (ret)1 ]5 n: P q v- x; ^
pr_warning("Could not register som GPIO expander LEDS");& E: r' | m4 R. Q3 I: d3 a
else
' h7 W! G6 ?( e$ F7 i1 | printk(KERN_INFO "LED register sucessful!\n");
8 X; v5 G. p9 j/ `3 C; J4 H# f
% d# r* r" S( {, t return ret;
) n( O1 U; C, _! l; ?! V" h q}
i4 T ]# ^& C4 }: C w" i, Q! a; }* b; o
static void __exit led_platform_exit(void)
1 {/ M# K' M+ A, f7 D2 c{3 D7 I/ x/ r6 B4 N$ o( X
platform_device_unregister(&da850_evm_tl_leds_device);$ z! d( O0 p: c
/ l) v+ p% q( [4 ]! V# }. M
printk(KERN_INFO "LED unregister!\n");
0 T# k" {$ Y; E4 Q/ r0 Z* T/ {& [}
! v. _, T* N# q% M2 V
3 @, F: p6 M& C& Bmodule_init(led_platform_init);
" e1 L& R" T- l9 C9 c( Dmodule_exit(led_platform_exit);
, Z& U" H1 H& D4 v& c/ f1 l
# W5 U# ^5 W: f8 Y* dMODULE_DESCRIPTION("Led platform driver");
5 v* P1 k E* F( |2 v0 Q5 e- b/ s, L- w4 SMODULE_AUTHOR("Tronlong");
+ N/ P9 j- ?% ^, D: j3 M5 eMODULE_LICENSE("GPL");' n, T& f& N4 R! M
8 Q6 R" M% t/ T* W1 c0 j7 k
|
|