|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ J5 {* O& O3 \0 j) F( c1 F#include <linux/init.h>0 `7 h- F$ f( ~
#include <linux/module.h>' d* z9 D! F2 r6 j( U
#include <linux/kernel.h>
/ @" T0 M2 C; I3 `/ O! X#include <linux/types.h>7 [8 A9 ^+ }( P: [0 `
#include <linux/gpio.h>
1 f L% I& c) h8 f" c#include <linux/leds.h>
, C1 O- z: G8 n4 @' k* }: a#include <linux/platform_device.h>
9 C4 [, z) S2 W+ o0 p2 V5 |
) T7 u1 _! j1 v* E#include <asm/mach-types.h>
5 X" B- s4 S) a4 O/ m& P- I#include <asm/mach/arch.h>
8 {2 V. Y" q- ?; h#include <mach/da8xx.h>
1 ]$ L0 ~( E9 m0 c; |#include <mach/mux.h>
2 @, u& ?. ]" C& }, d' V$ L/ G6 b; S+ }; A
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)* c* h& Y( I" b: f
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
0 n& t$ B5 O6 {" v, o#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
K( Y/ a" r% V' S#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
* z' k2 H* h+ R2 r) b7 X
8 J3 [, z2 a( s/* assign the tl som board LED-GPIOs*/. A8 P; C; T6 V8 [6 t# c6 O5 \% ?, a
static const short da850_evm_tl_user_led_pins[] = {
, v' W1 R3 t4 B: P7 ^1 U /* These pins are definition at <mach/mux.h> file */
5 y$ e, Q1 ^ N# e6 L a# X& z3 ] DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
1 r7 O% h" P$ x$ s; @+ ^ -1, i0 f* U3 T4 _6 ~5 o
};
* Y0 `( g2 w3 g0 N) {1 p# k5 s
6 w; T8 L% U, n% ]static struct gpio_led da850_evm_tl_leds[] = {3 g6 o9 ~( q! i5 Z
{
7 w# Y: u( T, f5 {3 t$ w .active_low = 0,- |: @" q3 ]( r2 r6 K. s
.gpio = DA850_USER_LED0,6 f( i* A( M* a4 `$ l
.name = "user_led0",
5 R; c; X4 y: w1 V$ J( v- G .default_trigger = "default-on",( o, Z# G1 _& V3 r* H+ L; q5 ~
},8 q @& L3 c6 k8 l- L- j
{: x" M/ X+ J I0 J4 D( ^
.active_low = 0,
% m2 C, C N% S0 `- D& o .gpio = DA850_USER_LED1,
9 r3 |$ ^6 w: ~ .name = "user_led1",$ A2 y. S) ?, g' l- M
.default_trigger = "default-on",
- O) J) [! z% ^: v3 y4 p+ R& t },; g1 {, p# O l4 k- k# g, x
{
8 p' A* y; N5 ?1 R6 i6 k .active_low = 0,
9 P, V2 G! O( h/ j5 c6 z$ X/ l .gpio = DA850_USER_LED2,
; Z, I+ o8 q% i( C5 J .name = "user_led2",) n! U* B B9 N- a0 ^- V0 T
.default_trigger = "default-on",; X3 C6 G. Q0 a
},
6 R5 I9 d2 _2 B {
( Y% f6 D1 Z1 i& s' t- C0 ? .active_low = 0,6 c- _. p$ A5 \% K- f
.gpio = DA850_USER_LED3,: j2 a/ m, n9 I' ^: \9 n1 W5 |: |
.name = "user_led3",9 B* P: F8 z& T e
.default_trigger = "default-on",# ]$ [2 H( h- R" j
},
3 p8 G5 S5 g& T8 A2 u# r- Q};
( t2 {0 X+ V( O, p
% r% V$ Q% Y7 b+ z/ hstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ a# t( M2 z( |6 X3 Z# y
.leds = da850_evm_tl_leds,
* r( d" e% s3 q5 X, | .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
, l+ ~4 t8 M- y! Q4 s+ o: y K) Y};
8 T! Y7 i4 A* |( e: G2 n$ d3 C @2 h
static void led_dev_release(struct device *dev)3 l- n+ q p0 A4 A$ v2 _' N; b0 d
{
3 I& f( r+ F1 o3 W}; ^' R8 `# y8 p! O
: y# D9 t* m, M4 H7 a' jstatic struct platform_device da850_evm_tl_leds_device = {! Z0 d& {: U. Y* C. P8 P
.name = "leds-gpio",: D! g* @7 v" `. n I
.id = 1,
: f( {5 O& s0 A+ p .dev = {6 P/ t+ z; {* u9 O9 V9 H
.platform_data = &da850_evm_tl_leds_pdata," e9 e; N2 p8 Y. {8 D7 F
.release = led_dev_release,- C5 r, Z, p3 `2 ]- S
}3 j, S" k8 ~& l) X
};
& A' A$ {; A _& N5 Z7 J/ l& f9 \6 y7 f v* y, O( P
static int __init led_platform_init(void). F/ H3 ~& Y3 t& w9 S2 J/ ^
{; S5 y. U$ l1 c. @
int ret;8 H# p0 W- |1 i! r) p1 O
#if 00 I4 ]2 z- G; z# `$ o2 i4 [
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ N0 A9 T }( e, K! J6 o
if (ret)
0 S) b( p9 g0 Z% A2 L pr_warning("da850_evm_tl_leds_init : User LED mux failed :"! S# K7 E0 M) d0 O n1 q! y
"%d\n", ret);
9 \. u K& W& _* M#endif& T! ~9 V( h# C3 v% v
ret = platform_device_register(&da850_evm_tl_leds_device);
! M; K# c9 T+ N& M# q" b6 n if (ret)- |9 C8 e0 q' B! I, U# o: h
pr_warning("Could not register som GPIO expander LEDS");
$ ^7 ~" N5 \ }+ J e; }5 u% w( Z else
; b5 T A) O9 t- X, I( ^) u) A; P! H printk(KERN_INFO "LED register sucessful!\n");/ s! @% A- [4 o: V' |. q0 F
0 C% o: p# P$ j- F2 E7 _8 @ return ret;. F9 }- ^9 N. q$ C: p1 L* |
}
# S% `# b( R4 b! C" W" O5 k r2 x7 R' c; A& G
static void __exit led_platform_exit(void)7 q1 b/ X. S. z6 F' A! o
{
& b" X9 w. i: c' i8 C platform_device_unregister(&da850_evm_tl_leds_device);
8 w, D. P# X3 K6 r: J3 j! ?
0 z; v( {; ^' I% h+ n2 \ printk(KERN_INFO "LED unregister!\n");
+ d1 |' [' k. y! H7 Y" B, }; B5 S) q}
* i5 W, B, v) v7 m& ]. b4 }6 B* A, F+ t
module_init(led_platform_init);
) B; I3 `( Q5 W* Mmodule_exit(led_platform_exit);4 J2 [. ?# V1 w; x2 b3 f
9 x1 \* U; n: f0 d" r
MODULE_DESCRIPTION("Led platform driver");2 v9 \. O R. Y$ p: K O2 w( B
MODULE_AUTHOR("Tronlong");
6 s) D+ Q5 P9 B; k2 PMODULE_LICENSE("GPL");) n# Y0 }! N& y0 D( ~" I
: f2 l3 S5 v: S1 w, R |
|