|
|
求大神给下面的程序做注解,请稍详细些,谢谢。! s% V3 r. N! S( h; q
#include <linux/init.h>2 x4 d, M [1 K5 N! [) z. j
#include <linux/module.h>
1 L9 h& o3 }( r3 c8 P4 f, i- z1 C#include <linux/kernel.h>, W8 v4 L5 f) `
#include <linux/types.h>
( I4 |: Y8 J: ?' M#include <linux/gpio.h>+ _/ ?+ {2 T, ]5 \5 ^) i5 T
#include <linux/leds.h>
2 j7 T9 \; Y4 |& E# N#include <linux/platform_device.h>
) _7 m7 I/ [' b/ F$ H7 }4 E6 Y5 j2 `! G
#include <asm/mach-types.h>$ a- @ G) j9 G+ V- X. J& u3 I+ ^
#include <asm/mach/arch.h>( D x/ x2 z& R" k
#include <mach/da8xx.h>4 W0 z$ w& x" X% S, N4 x' j
#include <mach/mux.h>
! ~7 n1 q) [' E
* ~7 o( F) P: B% _" l' i#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) G5 e+ e8 w" ?; c#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" m" ?, O$ l7 M/ `! R1 y6 N#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 U9 I2 B K/ [( u$ M3 @5 p( _
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
, n3 t: {8 i! f" U& T& Y5 M! k% r, v. m5 `
/* assign the tl som board LED-GPIOs*/
. C, D8 g# |' ?2 p) f9 mstatic const short da850_evm_tl_user_led_pins[] = {
+ B/ s" H" J# S+ O1 m* D /* These pins are definition at <mach/mux.h> file */0 A0 _1 d- R6 p9 ~ r; T
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
& a! `8 @. ]" w ~& i. H' R -1
8 c) T0 R9 m4 K};
9 h8 E5 J* K2 V5 q3 [; K) Y! n: Y, p( M$ S" z
static struct gpio_led da850_evm_tl_leds[] = {" ]+ y9 }# h5 c$ L( z, E6 m# q
{1 w% V0 Y% @8 d7 W v
.active_low = 0,
) q$ C5 {& w5 p" R .gpio = DA850_USER_LED0,
: x) i4 l3 N' z, X3 C .name = "user_led0",
, c) Z) u- B! U/ D" Z .default_trigger = "default-on",
; _4 T" ?8 V4 n1 V },/ |9 y! j$ ]9 r9 Y8 X r. {
{5 H9 l* R; n8 l9 U* p. l
.active_low = 0,
+ a" u, j' ^# r* i .gpio = DA850_USER_LED1,
, v7 r3 L7 |6 q6 N5 ~/ T; Z .name = "user_led1",# \% l. M4 w m9 j! R7 }8 }
.default_trigger = "default-on",# Z9 C% F9 m5 Y3 c# G
},! t6 P* @& a- u# |0 J
{9 I3 i, f9 `- @3 ?: H
.active_low = 0,
6 a0 {8 P7 g9 b6 M .gpio = DA850_USER_LED2,. ~1 s4 `' Q+ h o: F- ?9 x1 r; Q
.name = "user_led2",9 {, y @( J4 H( D- p7 S% S6 x* }
.default_trigger = "default-on",
/ v! e- O# ~, `$ N+ g },0 T8 d/ o4 N# q; F
{8 E. _7 J& I7 C. h
.active_low = 0,
% C. b5 H7 c) b) }5 I .gpio = DA850_USER_LED3,
7 B( S( `4 t; v" ^ .name = "user_led3",
% p7 }! i! m4 F6 X .default_trigger = "default-on",
0 G( k9 r2 O, f" C% _9 p },
$ B6 p& {4 A8 R};
0 P- L3 ?, h, r( H" B. D6 W# O2 u; ?& S, t+ k2 X' V- X* k5 Z
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% `. r5 ^) F/ H5 ~) y- w, r/ I .leds = da850_evm_tl_leds,
: l; f# z- H' _8 x5 V .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
, A8 A$ V+ ]' N& ?# E; M};
1 m; f& ~# m4 G( m$ }* [
% F0 X; @2 F* m A7 u' N2 sstatic void led_dev_release(struct device *dev)
8 R. m9 F: K( y6 _; w{ t) t2 J1 p0 y w3 @; i8 ?
};
, |8 Q# R# V, D4 w7 F9 L) I, `" ^4 B K
static struct platform_device da850_evm_tl_leds_device = {5 x$ O( C( v) @* D, X1 O
.name = "leds-gpio",8 i8 V5 S- ]% c x/ n# C# M: L
.id = 1,7 F4 {0 J- k3 D' x
.dev = {
& b+ u# \/ ]" D+ M3 V8 }0 c .platform_data = &da850_evm_tl_leds_pdata,
6 N" ]+ d8 k# g5 t/ Q! ^8 D/ P8 A) b .release = led_dev_release,
. @& z+ A- `$ g( j- ]' ^ }
) A5 t; P$ }, S x1 v0 X( @};
' E; f j! F8 j1 z! N
6 z7 G; c. U$ L7 \+ d" o# hstatic int __init led_platform_init(void). n, @8 T7 E2 F# B- R c! x
{4 A" S& }2 w" h$ L( p
int ret;
& p( j8 P6 y ~#if 08 M4 I4 w( V; A
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);; _+ C8 j# v9 E B8 |) e
if (ret)
8 }) j n5 U3 ^! R* A5 H* Q5 b pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ p& v" u6 a( e H- A
"%d\n", ret);7 f3 ?6 {- G& o H1 T. W
#endif) }) o1 x& M" W9 N( T
ret = platform_device_register(&da850_evm_tl_leds_device);; J) i6 l- m* N" |6 v4 P( c* @- ^
if (ret)
# Y# q! X& B3 H' l pr_warning("Could not register som GPIO expander LEDS");$ `' e% l9 U; v/ }( n) z
else
$ f$ k9 Z# [1 m4 h! f% Y! a printk(KERN_INFO "LED register sucessful!\n");, z$ K5 A- O/ ]& t+ E) d: Z; Y
; y# O' y) W8 m* p! V/ y
return ret;# J3 c( V, ` m7 B2 V0 c9 Z( b5 p4 h
}2 \/ @6 s! }, G4 B5 T" _
8 m+ [7 {- ]; l7 J! r/ a/ r
static void __exit led_platform_exit(void)" _6 A9 z* G8 H
{/ \+ l" O& g2 u7 `6 v6 E; h
platform_device_unregister(&da850_evm_tl_leds_device);" U3 L9 p* {* J+ ^( B
' e2 }* a6 Q' Y$ h0 @$ m& j
printk(KERN_INFO "LED unregister!\n");
$ r$ c. P7 X9 G. C L5 K0 [}
6 v4 i! P* r, X$ H& ?
3 t$ ?- V1 _4 Imodule_init(led_platform_init);& Z, i. R( J4 i9 o0 z- g( p
module_exit(led_platform_exit);
* s- X" N. o% z5 n- l7 e( p* x+ N. z5 }; Z
MODULE_DESCRIPTION("Led platform driver");( ]; r2 m$ \; Z5 I0 M5 V! y9 e
MODULE_AUTHOR("Tronlong");
' Y5 ~/ k+ @: v% |6 ?6 IMODULE_LICENSE("GPL");+ F$ R! t, L* a3 `7 g
/ p8 J5 D" B% ^# M4 C, O' N |
|