|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! S# y( Y2 s# i0 I0 `" [ `#include <linux/init.h>! P( H$ |9 w. d! i, ^
#include <linux/module.h>4 E% `- K f! I5 y# i0 S) f
#include <linux/kernel.h>
. i3 m4 T3 k8 W2 z: ^#include <linux/types.h>
) y4 f- o# L9 J- ~- W& ~#include <linux/gpio.h>; v* R* ^( R# ]; \' K
#include <linux/leds.h>
/ [8 O; Z0 V2 r+ O' y( c% r#include <linux/platform_device.h>4 @3 M3 M5 e3 [! q' b3 J
- q- J8 l! I7 P3 j8 c#include <asm/mach-types.h>
3 Y' j0 e1 H5 R) p, i, m l#include <asm/mach/arch.h>
! j+ H+ z' W) I# D% @: Q7 W#include <mach/da8xx.h>
. Z6 T9 o. z6 d% K#include <mach/mux.h>
, P3 J! Q! N, |: I; c- I j
( y! i0 r9 A+ ~" D#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)2 ~( k$ y( a5 q2 L3 P2 `
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
2 r& D0 x- F; s7 G- c0 @& R* C#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
* } t6 T) o Z, l: V#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
0 ]) X7 c9 y J5 m- N" N
9 v" f5 S. @8 x9 z H4 l/* assign the tl som board LED-GPIOs*/( j( W7 S( z2 ~: i g j
static const short da850_evm_tl_user_led_pins[] = {5 Q& \* a5 V. H( t) `8 B
/* These pins are definition at <mach/mux.h> file */
" w* M7 Z9 u( U" a y( R# r DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 ^' M4 b8 z, J& w# C4 {
-1, ~& p8 r4 O0 B; `' B6 F' {
}; m4 s) r1 d" u J6 C. e! b. r: }! J
6 A) ~2 b) T# S8 k5 V
static struct gpio_led da850_evm_tl_leds[] = {
7 m+ j0 M* k9 M, s' I {6 L& H4 w) s9 E m7 p0 [! A7 Y
.active_low = 0,, d, c4 U- K* J0 y& E- ~
.gpio = DA850_USER_LED0,% v6 b2 h9 B! d7 {( {2 S, k
.name = "user_led0",6 S6 ?0 a" q$ W; e) L
.default_trigger = "default-on",* V, n5 r. z/ d% w5 h4 o
},
) s* H' \% N. |3 j3 B$ P+ |4 _' ~" x {! B4 I6 X j, I$ q, ^* p
.active_low = 0,) v/ T& h. X: l. |$ r2 Q9 W. }( e
.gpio = DA850_USER_LED1,3 T1 C! ]0 B+ T1 u) \/ A6 o2 ^
.name = "user_led1",6 r8 V. G. s. K1 T1 B% J
.default_trigger = "default-on",& v5 O" S1 j% K. R4 i4 m, S
},2 f. t- ^$ m" Q
{: Y+ u' `, {# h3 N
.active_low = 0,
( P( P" m" C I/ a .gpio = DA850_USER_LED2,
3 Q {. L1 q" x* D! N [& E .name = "user_led2",- ?4 b( k& Y# O: k
.default_trigger = "default-on",
4 B' S2 K6 Y5 w& |$ o+ C* @ },* c* V* Q W1 R9 J! [
{
* F# O+ H! Q$ ]5 B .active_low = 0,5 ~, X' ^7 D7 g" D4 M" }/ i
.gpio = DA850_USER_LED3,! C9 U7 c" J H! j0 [5 @& j
.name = "user_led3",0 }* I. T# U& m% C+ H$ o4 _3 B2 \
.default_trigger = "default-on",4 Q& _) U$ b% v9 h% ^& a
},
0 r7 J% y6 Z8 b3 }9 _5 W' S6 ?; a};2 { A. k- R: D) v
0 p |. K6 `: C+ d/ S. ^static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {; M6 K$ B: N5 Z$ k' W* e
.leds = da850_evm_tl_leds,
& p0 B) ]" |* y' f# R .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
" U$ n' M f, P7 Y9 A};
- d! H2 E3 z" J# ? Q; W0 @
& u/ t! w/ P( [8 }. ~& N: [4 Dstatic void led_dev_release(struct device *dev)
+ f& I% \/ N" I& C, Z/ p{0 t& }3 w% s* ~5 m, p
};* C4 t# J" j+ `" i h9 v
/ f6 N# q3 j* @ v* ?$ s4 y
static struct platform_device da850_evm_tl_leds_device = {# R; s4 J+ u6 H( n) I4 e
.name = "leds-gpio",
* T8 P' p+ U5 U* } .id = 1,' ]6 p+ [; l8 g
.dev = {
: x" O( [* y$ P/ ?0 c9 B .platform_data = &da850_evm_tl_leds_pdata,5 `5 s1 I% G/ S( f5 _* A3 E8 b: {
.release = led_dev_release, j3 M: v* y3 F. i
}; i% \" M [2 C4 f/ k
};
8 ] k# d* e' \: L n) r; N; r! V3 d8 R" F% u9 z
static int __init led_platform_init(void)
" S: ]* _- i- X* s# h2 \{9 L# E( R$ x$ n7 f% ]
int ret;, k8 t1 G2 ^+ u0 i
#if 04 v, r! F" ?; k6 R7 c& v# |4 U- X
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
# z% `* A0 @8 X6 ^5 w if (ret)* \6 u% D6 ^6 T; ]" d9 D
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
$ j+ W- z$ w) @! C "%d\n", ret);
6 a) ?! ~4 A* G- e2 g* \/ L5 G* U#endif
! D# l1 H: P' `. s! l ret = platform_device_register(&da850_evm_tl_leds_device);
4 E& o: _: D' ]" v1 s if (ret)
, I, F2 \0 g- W0 a4 d pr_warning("Could not register som GPIO expander LEDS");2 w# Y5 j; D% K" X# p
else
: @' _# y# y, y6 G$ g printk(KERN_INFO "LED register sucessful!\n");
O, |8 r& U7 ~3 R- ~: ?' ]% F( o2 I8 |% h7 I2 g; d
return ret;
* p1 r1 j; A4 K5 Q; J7 [}
9 [+ X. t/ w( v$ v
% `6 s( l) J! I3 I M X' v! Zstatic void __exit led_platform_exit(void). @$ O2 ~) q. b7 T& V
{
- D6 j5 G: n0 V# o* y E/ l platform_device_unregister(&da850_evm_tl_leds_device);
& s3 {9 X* @* z* r, Y
5 I! m0 J( A: r& C, A7 V printk(KERN_INFO "LED unregister!\n");
; i* B$ F/ F: L7 i}2 N2 R5 J# Y/ F6 _. y
* d& f( W" f! B: U% b& P
module_init(led_platform_init);* G. R* \. I: f3 C V
module_exit(led_platform_exit);
1 {. Q% Y& J S3 @; s/ k0 J; W( \$ Q5 H6 f6 K$ h; [5 J
MODULE_DESCRIPTION("Led platform driver");
( E7 X u4 }) M! y7 e9 ]: iMODULE_AUTHOR("Tronlong");1 {" W) _" _% f; q% R) p
MODULE_LICENSE("GPL");, ~' a# U! b% @+ w, ]! z; y
. T: }/ ~& _, M
|
|