|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
4 f/ g8 O( o( @& f2 r+ }#include <linux/init.h>9 t$ o+ N4 b* j" D
#include <linux/module.h>
& H! `5 v8 q g" n& z3 R8 n" p#include <linux/kernel.h>* z9 k. R7 j- W0 J1 K3 U
#include <linux/types.h>
* u6 h0 P; c5 U1 B) V#include <linux/gpio.h>
( P. t7 f! t6 V' ]9 t2 i#include <linux/leds.h>& s$ I, j) b$ R6 x9 e
#include <linux/platform_device.h>2 A- C2 b7 j( ~ s. f# Z
" A0 w! e7 u1 J2 e( v4 h3 T1 L#include <asm/mach-types.h># w" e# f3 w" q5 y# H7 Z
#include <asm/mach/arch.h>
- Y# o' K5 D1 k3 L2 I; a#include <mach/da8xx.h>3 Y( B: k; K' o0 |/ W; z
#include <mach/mux.h>
6 w7 K3 t/ z+ B3 l; j, R* W; @; s. u' g
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
o- V5 h- w5 u) X/ ?#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 Y/ _! L' z3 P# ~
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
6 N9 R* T% b4 M% D0 u6 Z#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 J( M" p' [6 t' j6 m4 {( G7 {
# C; ?. c8 @9 y+ Q) R6 h/* assign the tl som board LED-GPIOs*/! T$ t1 O- p/ q/ w& ~" t5 x* d
static const short da850_evm_tl_user_led_pins[] = {. I" B0 m3 Z2 z
/* These pins are definition at <mach/mux.h> file */
, J c* m$ O" Z DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
5 K3 D, t6 D5 _' K4 J -1
4 ^! d* w- Z# p& F, x) i};: n+ v6 Y' i* L* N4 E3 a, |
8 ]5 q6 |7 ^5 A7 t4 v6 C
static struct gpio_led da850_evm_tl_leds[] = {
( ]+ }- }+ q1 t7 n {( V: B4 x4 z& V- w
.active_low = 0,
1 Z/ r( j: N1 v( I' O1 y0 ~/ I .gpio = DA850_USER_LED0,1 B( e' `# A1 h: c9 M
.name = "user_led0",6 n$ J( x- Z# X( ?! @
.default_trigger = "default-on",
4 e, v( f ]0 S, y" X# x },
) W- A! j3 G! }4 _5 s2 n {, h, v. `: N6 b& J7 i# u: w3 O
.active_low = 0,
/ Z, r, Q" c; H4 I .gpio = DA850_USER_LED1,
4 e/ R! d+ `( F/ Z+ Y, o .name = "user_led1",
: _* W" V- k* g1 |! A .default_trigger = "default-on",
0 {4 K ?1 J' o' H- N1 N# { },
Q/ Q. ~% r+ [+ F& k2 C9 T { m/ x- C! e* u* A* s
.active_low = 0,7 F! p( F' j' [& S. D; Q/ i) s
.gpio = DA850_USER_LED2,) A( v$ x; D0 ~0 y* ?3 j: c
.name = "user_led2",
2 A9 p2 ^8 z. ~/ }8 G .default_trigger = "default-on",
3 ^+ F' V- h0 h; U& N5 E },% n/ v0 g) {" [- u# K3 m
{
# `' g2 N& a1 v; m. e9 Y .active_low = 0,
, ]3 P" t* r0 M7 h9 z: L .gpio = DA850_USER_LED3,
0 J" C h; G7 u0 F' x! ? .name = "user_led3",3 ^1 Y7 w- }/ O" q
.default_trigger = "default-on",
6 c7 N& g$ n v" B2 @5 V0 K }, l. D2 V) l; c: r% M/ w3 C/ d
};1 Z0 Y B$ q& l$ y% O
2 I% ^$ Q! q& }- Gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 ~, r5 N1 P A3 w7 f2 k' b; W .leds = da850_evm_tl_leds,
6 s0 S% `% r5 J& \ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),, ? v" B+ O+ w5 [9 T
};
; s$ I" H9 r7 C! R1 m: S0 E
2 f$ H! Y: _7 H% F& r: l6 Hstatic void led_dev_release(struct device *dev)
/ i/ l3 b2 C7 N0 D2 X{9 M! v* Y3 P) [& v8 t. j
};
' a- h) i8 `: C8 C) u2 S; V" ^4 ]. Q" I+ P
static struct platform_device da850_evm_tl_leds_device = {# G1 g6 _4 M$ e( i3 N1 j+ v
.name = "leds-gpio",
7 y/ L7 k! t1 G2 T .id = 1,
: c9 p" m* ~) x% ?6 M# C+ z& f .dev = {
. z5 M; z1 u! E) d1 ~ g .platform_data = &da850_evm_tl_leds_pdata,
Z- {, p! P9 T# u3 h0 P( | .release = led_dev_release,
$ l. ?1 S4 ?% c) c8 I2 P }
6 m% A# C1 {: L m" @};! v7 T; o% X" W; v9 m- o
t3 ?1 ~# u. R. V( n& W u
static int __init led_platform_init(void): F8 J4 Q: V. L& ?. l7 W6 d
{
7 H1 @. d' W/ o9 h' M int ret;
. r' ^- z" {: [; {) A6 r#if 0
0 X1 v. C. P6 p5 S/ @9 D ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' ^3 Y" K) i; N4 W if (ret)
6 p. L& r k- k+ ^$ Y6 c pr_warning("da850_evm_tl_leds_init : User LED mux failed :"- \! Q7 t! _- Z
"%d\n", ret); ]+ X4 c q- o' d
#endif2 L: u l, x* d# k' F
ret = platform_device_register(&da850_evm_tl_leds_device);- q% Y4 S' J _, V4 s* C2 D- X# K5 ?( Q& D
if (ret)
$ ]; }0 t7 J, @( |3 f3 M pr_warning("Could not register som GPIO expander LEDS");$ ~% h6 u. v, p
else- f0 ^3 |+ k5 n9 k" _
printk(KERN_INFO "LED register sucessful!\n");
4 \6 J# S' v7 N4 R2 Y7 c& K. X! P$ D( {% w% l
return ret;9 ?+ r q( J4 R6 o( @2 X
}
6 P4 Z+ N0 Z& r) `( N9 t* W5 _ T& Q5 w0 R
static void __exit led_platform_exit(void)+ Q" A' u1 \/ y9 D6 l
{1 `, P" j2 G6 g- ^$ o6 y4 e9 {6 b
platform_device_unregister(&da850_evm_tl_leds_device);* G/ B. }$ o7 x3 P* }
+ l' y# F: I- ?
printk(KERN_INFO "LED unregister!\n");
4 L2 R: a9 F F+ H4 ^! T* Z, {}0 p1 Z1 `7 d1 J* f; \: V. r D
3 k' d4 m( J3 e' i i. m
module_init(led_platform_init);1 ]$ ?/ V$ `. s* O% \: p
module_exit(led_platform_exit);
$ @; m0 W: K9 m, _% X/ M9 y, A+ q1 b; z6 v/ ]1 Z; K: U
MODULE_DESCRIPTION("Led platform driver");
" n9 J( l$ a @2 dMODULE_AUTHOR("Tronlong");9 u2 k% Z0 Z; u* e5 B$ \
MODULE_LICENSE("GPL");2 v" i$ K* k: m3 N6 b
# x+ Q. |7 ]8 b. I6 l/ i* n9 e |
|