|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
4 A, Q) w4 i1 {& Z1 u) A' G1 ~#include <linux/init.h>" |& L9 Y: W& b7 V- W1 R! W
#include <linux/module.h>; c# `# u3 ^. N) ?( a h
#include <linux/kernel.h>! [: q+ L! B( J5 T; ^
#include <linux/types.h>
8 ?. ]! {6 M8 c$ |#include <linux/gpio.h>
% s- z+ v% G x8 e7 R#include <linux/leds.h>
9 G3 C: l" s9 }7 q# y4 C$ l7 B0 r$ m#include <linux/platform_device.h>
2 R! l! F$ \1 h
" o3 C% A, R4 O( \, p" U3 h#include <asm/mach-types.h>
% ^, p( [& x: v! d# u' n9 o#include <asm/mach/arch.h>' L" y3 p$ f2 y0 p) h
#include <mach/da8xx.h>, O. r+ T: d/ Y4 R$ m9 h
#include <mach/mux.h>
& m8 \4 S0 h8 F, p+ Y; j# x4 }0 r- J0 @3 o
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)( Z, v& C$ D8 b1 n
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
7 I: A/ K! d1 V/ O! n! F#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)7 `1 l3 i1 t( |, v6 i& ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 L |2 C2 h% g4 L
% q2 u: z% s! d( d/* assign the tl som board LED-GPIOs*/
0 P. y$ P3 p6 w% m9 D9 ystatic const short da850_evm_tl_user_led_pins[] = {
1 k$ K6 `( S" K& _. r, Q0 H/ \ /* These pins are definition at <mach/mux.h> file */
8 i; b! j0 }* V9 n1 `/ L: \ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! J0 ~9 u6 ]& `' { z% Y- i/ ~3 L8 T2 q
-1
2 n2 |- I8 I ]3 T8 p};& x7 \' V3 r" Y K1 a! f0 T \
( x! X. i- C2 x
static struct gpio_led da850_evm_tl_leds[] = {
* S5 h! X+ J: A2 L) l& F {- L' O& Q2 ~) ^0 h0 x6 g
.active_low = 0,
* j& e: i- K/ W .gpio = DA850_USER_LED0,
, K( ?& r- X. A: A6 Z .name = "user_led0",9 \8 ?' b& Z% [$ ]( \0 O, Z4 Y2 q
.default_trigger = "default-on",2 `$ F: x, ?; n* X. c
},3 o1 a$ K$ M( {) T5 z7 k9 s
{
) C: V3 B/ r3 U+ H/ o* w/ l% Y3 O% W .active_low = 0,* s8 Q% J+ f$ Q% f; ~( O# T
.gpio = DA850_USER_LED1,
, z% ]9 S6 {9 M, A' o .name = "user_led1",: D @2 O% c# t9 G
.default_trigger = "default-on",# v& d. \ O: ?$ v; i2 _
}, \+ e/ y. {% E" c. b9 K
{. g) q8 C: O1 @2 c! x
.active_low = 0,
K4 v; f7 @/ L5 L; C# n" F .gpio = DA850_USER_LED2,, t* ` I, d8 x( R+ d) _/ u r6 u. U
.name = "user_led2",3 n& x% G0 x# e# i! `6 W0 }
.default_trigger = "default-on",' g9 j3 \$ E7 p; `5 R
},
' E5 q5 v/ j! k {
: J3 [) O+ a" N8 o, ?- h7 O .active_low = 0,* Z/ u6 z! V3 d0 r5 l% i; }
.gpio = DA850_USER_LED3,
. w) [# h& q& k- {5 O8 n* h .name = "user_led3",, R# r) r: m, Z" M T5 R
.default_trigger = "default-on",
; `. i0 F1 g# A6 ?! ~ },
% `. o' L& [! _" H};
; |2 E" V7 O: R, @( L1 D6 O2 `/ X5 |% ]2 W7 @5 H
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
|9 |# I3 o5 U+ i' L8 L .leds = da850_evm_tl_leds,
' A! o6 d. l4 P- v .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- T9 m0 \- V' V};
0 ?* _ } J1 b
* U' K! F' z' Q' V8 [static void led_dev_release(struct device *dev)
# h" d/ ~+ @6 X/ Q& W{
* T4 d) s% O# {; _$ v7 w! {};4 e9 x6 C/ o9 W( i7 ~
9 u# l# g) H3 h& a L. Q3 Cstatic struct platform_device da850_evm_tl_leds_device = {
8 Z+ Q! o% N7 k, H .name = "leds-gpio",5 |( S/ }- v9 Z2 r3 P( d
.id = 1,5 a. |" D$ ]6 V4 ~' c, L
.dev = {' Q+ N! \+ j7 u d
.platform_data = &da850_evm_tl_leds_pdata,
& F" L8 X4 U& ~6 J3 N `* N/ N .release = led_dev_release,4 P6 s: e/ K* u8 k% ~ s3 [
}. f. ]9 a6 x9 V; C8 f$ X' m
};* w. e" z, v& ?% J: p# c
6 h" ^! }$ N6 m" Z0 E' q1 Sstatic int __init led_platform_init(void)6 u1 t+ \! J# V' d% A
{2 W. P d% Q+ @' f& ]0 g7 d
int ret;* ]: B1 \+ C! k. U3 w
#if 05 A' U8 k: d$ g$ C
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 |! X8 e5 h% M% s8 T; W if (ret)5 q. g S4 d9 g# \3 n
pr_warning("da850_evm_tl_leds_init : User LED mux failed :" s8 {8 M+ ?* I4 Y4 @
"%d\n", ret);
/ a o. U" d9 j0 P#endif
; S' x7 `$ J4 y3 R/ f ret = platform_device_register(&da850_evm_tl_leds_device);
' r X# ?# `: U5 c/ }$ d6 b' K if (ret)! t. \7 B8 w3 O c8 W! l
pr_warning("Could not register som GPIO expander LEDS");8 A0 k* v h" j% S0 I+ }
else
5 n) X" Y; y: k) A; p4 V+ ] printk(KERN_INFO "LED register sucessful!\n");
K# Y. F: T$ F* z7 ]6 v6 S2 R: \
8 ], q7 s$ L6 c9 i1 r% y return ret;3 N3 r/ E6 A# y9 O* {# ?
}
! `9 p# U5 ?" @: d" f* c
, i4 J8 X i& q' ~static void __exit led_platform_exit(void)- Q0 y2 E1 ^- W* ^8 W# k
{
+ f( | E8 ^+ A+ R platform_device_unregister(&da850_evm_tl_leds_device);
+ j2 f+ v2 @3 J5 q# ]) y6 J; e2 G! P* L
printk(KERN_INFO "LED unregister!\n");
, F% p4 v# g! l. Q9 }}% F% C4 s* a- u$ _
7 R3 c# Q+ U6 V- X- V1 \6 \+ gmodule_init(led_platform_init);
( Q3 z0 n3 Z% J1 a7 cmodule_exit(led_platform_exit);9 p1 ]: R5 _/ v& S" `/ W% [/ m. W
# D7 {: G. y; D3 t
MODULE_DESCRIPTION("Led platform driver");
8 q% D5 o9 W: y9 { RMODULE_AUTHOR("Tronlong");
$ C S/ I$ N: X$ w% MMODULE_LICENSE("GPL");
/ y3 R( F1 o$ X7 N( b9 s4 i; X, ^* G1 {! a2 r6 Q9 ~, t
|
|