|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% c( w9 w5 @, Q5 W9 b" z3 }
#include <linux/init.h>
6 p2 H' H, n2 I. [5 I8 P- Y9 [! [#include <linux/module.h>
2 E. Y5 z) L, i8 p3 I$ L3 G- [#include <linux/kernel.h>
b5 R8 I, w& t. I G9 r1 P5 M#include <linux/types.h>8 y |* j+ V# L& R& n
#include <linux/gpio.h>
& T ]5 B' x3 T" k, _#include <linux/leds.h>- z1 Q" {: M- ]7 v: J& m+ {; l
#include <linux/platform_device.h>
, F9 J3 R9 \3 N O( ^% @. v S8 `- H1 O; ?
#include <asm/mach-types.h> r b: R+ @! z8 ^9 U
#include <asm/mach/arch.h>
' o. R- G' {6 X" B7 A9 |#include <mach/da8xx.h>- n. {) {* H D9 D! n& f- B' S
#include <mach/mux.h>
, I8 e" t5 `" L+ a9 ^
. F# u& `( O* ?/ s* B#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 p6 W( K0 N3 @ u
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)1 I- m2 O1 n+ Y& d3 n
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)6 h" U! M2 [6 A) {
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 P3 A: U6 ], V3 f4 D2 l+ P5 p' {5 y& j* q1 q5 T' H; h
/* assign the tl som board LED-GPIOs*/& [* t0 e' X- Z3 F8 g
static const short da850_evm_tl_user_led_pins[] = {/ D" b- Z3 G% h$ a# J$ t. E
/* These pins are definition at <mach/mux.h> file */; V1 `) R2 S+ H! m3 S! i, d! J* ]
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
7 {: c8 r. m+ x, F5 C -12 ~8 ^2 e, e& e
};3 ]8 `2 X. c8 V9 y" \3 _( S7 H
' K. Z4 i6 u! s- G* ~# P
static struct gpio_led da850_evm_tl_leds[] = {" n4 R- Z$ u$ w
{
# \1 v, Y, O7 l7 Q+ r0 m .active_low = 0,* B& R! }2 A) \! ]7 e
.gpio = DA850_USER_LED0,
4 g# w( [$ V" y .name = "user_led0",
4 s6 q0 D- {3 v& x# K* l' L .default_trigger = "default-on",# ^+ m# D ], z8 S+ C0 b9 R* u. |
},
9 i4 [5 \6 j& A' p! U {
6 y$ U2 J( Y/ \3 _& ^* _ .active_low = 0,$ b, Q7 h, o. Q/ l9 U3 ?# R
.gpio = DA850_USER_LED1,2 P- b9 Y5 t) a5 I
.name = "user_led1",( \1 Y; {2 p4 v
.default_trigger = "default-on",
" D& F; q2 [, C, B },
$ \% w! R( w" r: z& }& u7 w {( ]: g6 T4 N0 H. W% @ Z
.active_low = 0,
, |4 ?6 j! J& i; t* B' F2 {; ~& C/ u .gpio = DA850_USER_LED2,+ }+ @; L; p1 g/ N- ~9 H
.name = "user_led2",( _' d% R: W- f
.default_trigger = "default-on",/ b) }6 F: g2 w
},
9 W. \; m; [* V3 b2 D$ q, j( U {/ r9 P+ {' C3 m
.active_low = 0,# o3 ~; j% i# {, S! H8 p
.gpio = DA850_USER_LED3,+ d& ~9 Z' F* F e4 ?
.name = "user_led3",
" C5 p! U, P. I: n& _- Y9 T .default_trigger = "default-on",9 x: i$ W7 n2 `( Z/ j ?
},, g4 X2 s" i4 D5 o: ]& n
};
' W2 b" z) }9 @, E$ P
7 P7 l | ?4 L7 @. m$ G0 X" pstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = { G' t/ K/ F6 }0 l& k9 b
.leds = da850_evm_tl_leds,
2 K9 {0 v. D; \# ^ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),: R/ f! F# l: i% o0 `) K
};
8 {& }* A' p' m% J% b$ Y
i6 a. i* v. Z, a+ Vstatic void led_dev_release(struct device *dev)
9 u# s! _* }5 i. ?2 F{
6 {: D( z4 U% w6 G( I. L};
, g4 U8 [! P: q4 W3 F9 J+ X6 A; E, M
c3 [! `5 t4 E% T! W1 M3 s! k4 Hstatic struct platform_device da850_evm_tl_leds_device = {
% A: u, K8 |" G1 Q- v; ]- \ .name = "leds-gpio",
3 r- V! v4 H/ a .id = 1,* t7 Q' A2 x. V- B. K: g3 F n: ]* {( g
.dev = {
- ?9 q0 E9 E& I; J( S; y2 S .platform_data = &da850_evm_tl_leds_pdata,
( q$ ^# `0 _ K% p4 a7 S m .release = led_dev_release,' C5 q8 G( F2 _8 _
}
& P0 u% U Y- f* x};
# d* d) u+ a& t) e% }
0 ? y& c7 v) B4 z; Y# v A q$ wstatic int __init led_platform_init(void)
& Y8 n7 j3 k0 h- S2 Y& w- m; r{3 n& F1 M A& R: f% ~/ c
int ret;8 g s+ }* o; q2 d2 h8 s& k/ X
#if 0& s- Z8 ?5 g) p# p: r8 V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
+ Z# p) K4 ]! ~ b+ f, o ?& G+ k4 x if (ret), z9 X3 x( R( v0 i
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
. s0 p) O( s, S+ V "%d\n", ret);3 T/ n- t8 l* f3 p8 w1 u2 m
#endif
8 E3 z# F% ^2 }1 { ret = platform_device_register(&da850_evm_tl_leds_device);* n: a. M: F. y7 s% q
if (ret)
3 ^ u- b3 t" u& R6 q; [3 I' R9 H pr_warning("Could not register som GPIO expander LEDS");
* P7 }9 E$ f4 H& Q% c) a" t' j& e3 i else
m" a2 Z; K$ b- [1 A; E printk(KERN_INFO "LED register sucessful!\n");
S/ F; u# V# m0 o4 ^' {' k
& y: j: @6 V7 {, z- @( S return ret;
$ K; K1 J$ k' l/ O; U- [7 A}% j9 a# Z3 \, ~, [6 I
0 C8 R5 _0 u4 F; ystatic void __exit led_platform_exit(void)4 T! F) e2 ^5 k% W/ \
{% X9 J: c5 {% l* \
platform_device_unregister(&da850_evm_tl_leds_device);) {; T8 F' w' H& p
. F$ X: S8 ?2 ]( s/ L% m5 I- r printk(KERN_INFO "LED unregister!\n");8 }1 c8 X( {- l8 N
}/ O9 ]& I. N7 d" m, A4 ^
5 L8 W+ K/ } t+ ?module_init(led_platform_init);' P) `3 P V' a- P$ u% G6 Y. \9 |
module_exit(led_platform_exit);
* b+ X0 L$ I& y# P4 {2 L" E4 B5 q0 e$ s. T, N3 n
MODULE_DESCRIPTION("Led platform driver");6 k$ ~( `- [1 _ Z3 U0 u
MODULE_AUTHOR("Tronlong");' L/ k( C" S# F( A& Z
MODULE_LICENSE("GPL");$ L6 R. w9 E4 }: U/ i. T }
- w. z! I: C3 u8 X) C; g- G9 J* t |
|