|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% G4 x8 [, Q$ K( j0 L3 ]#include <linux/init.h>
& P9 [- p( i! @" z6 \9 f" h#include <linux/module.h>1 g* V7 i a: d2 U/ F2 q
#include <linux/kernel.h>
7 @+ u2 W# F$ o1 z8 R#include <linux/types.h>9 V) p# I4 S! Y/ B
#include <linux/gpio.h>
5 V# ~& V) t6 k; n1 u1 p" Q% m# Y#include <linux/leds.h>
, @ X$ Y. T% K1 }, d5 p- C- q- F0 L#include <linux/platform_device.h>
1 v, q5 b% z0 ^- I: E: X% ^
! v4 ]& u# f9 N& h+ d# Z$ z4 C& m! {#include <asm/mach-types.h>
) I9 }2 X5 k& P3 A4 d& f#include <asm/mach/arch.h>% {' b# x3 [( t& v D
#include <mach/da8xx.h>
W7 a$ L- _# i" Y& G2 ^8 z#include <mach/mux.h>
+ U) a/ |2 y+ K* z: }3 \3 j, c0 ~7 C4 ` K" }
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% v& U9 D8 K) O" g7 R: _5 @3 w
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
8 C/ z r+ }% V) E#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
3 r( |5 W* R- A$ [: [) B, z/ P' o#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)$ T2 f7 n" Y) z- @/ ]8 G
/ L1 v8 N( W! L8 @# H
/* assign the tl som board LED-GPIOs*/, r4 n/ T+ }2 g( Y+ B5 S
static const short da850_evm_tl_user_led_pins[] = {
" _0 }0 Q: h2 ^8 g6 M/ O /* These pins are definition at <mach/mux.h> file */
9 t, w- ^3 |1 x; d DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 k+ `3 p5 k6 r" {8 k: A -1: i `9 Y3 X( A1 j5 A8 H
};0 Q6 e/ }) m3 J; `# ~- z# z
! a: x' W- N& A- W2 J) I$ C s
static struct gpio_led da850_evm_tl_leds[] = {6 R% r4 } a' e' j
{
5 A" \6 D6 A0 D7 E8 Y6 Q( G9 d .active_low = 0,
' W, @! H; Y F' \8 l, }) i7 z .gpio = DA850_USER_LED0,
- w3 h S/ B2 G3 e! c- c9 W .name = "user_led0",
) e3 m+ H% b% b z2 x .default_trigger = "default-on",0 B% A$ R T1 J- ]
},
1 J8 N& j" a( M, y( u {/ I4 X9 |+ K) M0 _) _" a
.active_low = 0,4 n" H1 ?; ~4 _" @+ q6 n5 w$ m
.gpio = DA850_USER_LED1,
4 [' {" ]/ ~; _) U .name = "user_led1",+ ], p: L. i5 u, G7 z
.default_trigger = "default-on",, V: h8 I0 f X: v" [: u
},
5 m5 Y$ X2 }* v; Y$ o {
, g- O" Z6 K2 e1 Z, C .active_low = 0,
8 n# k5 }* w! U# {' U" M e .gpio = DA850_USER_LED2,- d" \/ j5 {1 X
.name = "user_led2",+ z7 {9 y: H: F9 H u
.default_trigger = "default-on",
! r; y; J. H" N6 Y# q0 B$ g; m$ F. ^ },
' S2 t. f! b, f6 d/ v {( `, n! X/ E- e5 [
.active_low = 0,4 J. P$ Y% j* I# J) v
.gpio = DA850_USER_LED3,
- S; {' v r* j5 M .name = "user_led3"," W, L+ i& c- u
.default_trigger = "default-on",7 V8 R6 _' E, K: }9 V" a
},
$ z9 Y z5 G( I" u3 o3 p$ k};: K: Q" g( x/ ~
7 G" I% m- t8 K! q6 `, |3 Z3 t
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
5 O4 B9 | `. h0 i .leds = da850_evm_tl_leds,1 z) K3 g e! c# {7 \, R, n# G: k
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),! x$ x6 @% L; x# L; S) S
};
5 d6 k/ n7 x+ n# H3 F6 K: e' }, w) _' K, M" V/ Q4 l. _1 d) G
static void led_dev_release(struct device *dev)
: L9 u! F: g1 y4 ?( S4 r{
6 o- ]( v* }6 i6 Y* q! ]1 U: t};6 T% w- ]; d) f. I0 e
/ b& y& |( q: a m9 z1 astatic struct platform_device da850_evm_tl_leds_device = {0 v. H6 m8 T1 h7 g6 e4 _
.name = "leds-gpio",# n" k8 ]- m) u q% h8 [4 F
.id = 1,
1 t: E7 G7 g" A' b: ` .dev = {
- S4 [% s2 A% L$ B* x# G; H8 M .platform_data = &da850_evm_tl_leds_pdata,- n/ C" v# s* ~- G( l! [& K
.release = led_dev_release,
C$ [' \. o4 e% S" P$ x+ `/ ] }5 [" [( i: Z, u; Z
};3 @4 L7 a1 N0 U5 K i' X' a( N
2 ?% I; _! X9 d* z1 A7 [
static int __init led_platform_init(void)8 }4 {& A, V* O7 T! g3 u
{
9 F5 I( O3 D7 f8 z, O/ t int ret;
- ]+ O$ N- G+ i- o$ ?#if 03 F3 m: Z' E: P. z: F
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 }: _$ I- h( F if (ret)+ i6 d/ C9 ~" W1 {! }2 f
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ O+ X8 q; X( F+ l$ V1 [& ]; w# M
"%d\n", ret);
, K8 G: D1 z9 F1 ~8 c% Y& U#endif
9 ?4 n% x' O' U: g: v ret = platform_device_register(&da850_evm_tl_leds_device);
; a: Q* a3 B# X4 o' t2 B$ ? if (ret)
# Y; Y' \' W" X: ~/ T9 l3 G pr_warning("Could not register som GPIO expander LEDS");
! p, P7 ^' x. ?& P3 s& q7 i( _2 } else
# U/ e% I9 m# i printk(KERN_INFO "LED register sucessful!\n");: R+ S3 y! h6 g8 O% \4 P- a4 h2 U
9 J q* t4 N8 z x' V; q0 P( G return ret; T4 I8 I, b( D. ^4 F2 P; [7 A
}: P- M: z1 H8 r' k1 M
; T+ n f3 ?( M- l1 j
static void __exit led_platform_exit(void)
1 e4 r" k; u# i. R{5 ?* ^8 B) P; T: x0 J7 C4 M. W' K
platform_device_unregister(&da850_evm_tl_leds_device);
8 `$ x+ w" a5 K
8 S& }8 x# h% ?# j" {2 B printk(KERN_INFO "LED unregister!\n");
$ p9 w9 d) E- `" @# s}
7 g% ~9 L4 g/ V
7 R1 ?) B/ ~2 p+ x# v; o6 }6 fmodule_init(led_platform_init);' `# D `! i9 T7 y8 v
module_exit(led_platform_exit);2 {$ U& j* i9 c: k/ M3 E0 L
* [# Q+ B1 W5 L2 [
MODULE_DESCRIPTION("Led platform driver");9 F% B! R; F j2 d1 X1 x5 N) b: z
MODULE_AUTHOR("Tronlong");+ o6 u# f, X- u3 E2 k, j
MODULE_LICENSE("GPL");) y1 V* L; T& {" R) W
' r. n- Z! @6 ?+ E" e/ c9 }& s
|
|