|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: I; e2 H% J, o! B#include <linux/init.h>" m# Y1 S1 Y9 ~1 m$ I0 g
#include <linux/module.h>
, Q1 H) h; N; x: |4 R#include <linux/kernel.h>
8 _" w6 E& u2 g7 a# M#include <linux/types.h>
& n& I# V# ^% P' Q* \/ l) | h#include <linux/gpio.h>
1 n# b' z/ h* A ]! [' \3 m#include <linux/leds.h>
: g6 j/ Q/ P/ r1 Q h#include <linux/platform_device.h>: E7 K9 c- {8 K* \: {& B
, O ? d; p; h/ e/ A
#include <asm/mach-types.h>
1 G4 W- h( ]: }#include <asm/mach/arch.h>
; s2 n: r6 F2 C! B#include <mach/da8xx.h>0 Q# z! [% q. L$ ~
#include <mach/mux.h>% w' H9 Z3 A( ?2 y
$ I/ P. y1 b& b) w
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)7 z; f' g1 m, q% a+ e7 S) z- v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& ]2 a- \0 X! A* _- u: @# {
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)" W% c6 o1 S& P6 o
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 G+ L# X a9 ^* U9 x1 b! y- O" N
/* assign the tl som board LED-GPIOs*/
4 R2 W+ h; I2 O/ Vstatic const short da850_evm_tl_user_led_pins[] = {
; i" F7 w/ y. u9 n/ i8 e c /* These pins are definition at <mach/mux.h> file */
9 x6 b- j' e8 O" A4 ?/ n/ w DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ x/ c6 t% j# P7 W
-1% U a* ?1 M5 v
};- H0 a1 ]4 J+ `1 A% t# \) _
6 N0 O; G: c: C0 z5 ^6 Zstatic struct gpio_led da850_evm_tl_leds[] = {: t" O+ |5 X. e2 z* m6 G: U
{+ ^7 Y/ [. l, m1 K7 y* D1 R: I
.active_low = 0,2 w( u1 c2 U1 y) E! ~$ o
.gpio = DA850_USER_LED0,
8 k: M2 Z( \7 l5 b' {) F3 b .name = "user_led0",
) K1 `1 ^4 f9 L! ~ .default_trigger = "default-on",
2 W9 k+ f( H0 F1 Y) p },
" ^* Q5 W" i$ G0 I- n1 K! j3 R {: T' W# d( X. ]; x3 J, R
.active_low = 0,/ H( P) J' X2 b5 x- R4 ]* A& Q
.gpio = DA850_USER_LED1,# J! R; L& O, _1 F* D# @+ o
.name = "user_led1",* t5 s& @5 @8 E0 a5 f
.default_trigger = "default-on",' a9 m! A: t" d8 y
},
/ y2 H) Q2 G+ Z; }" u( C9 y+ C, B+ o {
% L9 |$ E) m( h7 F1 v .active_low = 0,
, m/ `/ V- _) I .gpio = DA850_USER_LED2,5 S/ k( K; ]+ m( M
.name = "user_led2",# D1 }1 A1 t" z$ W# O3 [+ k
.default_trigger = "default-on",
1 q. H4 i& f" N, I },
0 V& o1 E6 `+ K {# I( k' [" w; ~. |; J9 g s1 a
.active_low = 0,# H6 Q# @" V' V7 p
.gpio = DA850_USER_LED3,6 A5 J) U/ w7 v& L
.name = "user_led3",1 w( K1 U/ ?, J9 P) j
.default_trigger = "default-on",' ]) j9 Z% {' H) } j3 i- ]
},
$ Y5 q5 w8 _3 K [2 E};
) o J4 Y/ ^, G7 H; `) @, n2 q! ~! Q, {6 u
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
- j6 s9 @. J1 j9 h" F .leds = da850_evm_tl_leds,! H( M7 x/ m p' o
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),! ?" b- G, Q5 h
};
' ^- N" m. n. K" X* w
9 y; r7 `' p9 X" k, B2 f4 ostatic void led_dev_release(struct device *dev)1 B, H# e+ }1 W
{3 h! h+ a1 J- | a N& w' C7 r
};/ f, b! a8 K& ]- ?* T( r! u
' o5 F* H+ Z5 P7 M* G; p
static struct platform_device da850_evm_tl_leds_device = { K- p" q0 e( p0 d# S; `8 g
.name = "leds-gpio",
7 U0 r5 y+ D" g4 T$ { .id = 1,
; X& e$ M/ x9 d5 n1 K .dev = {
* L5 }* t4 p* q; O2 b% b+ v .platform_data = &da850_evm_tl_leds_pdata,1 u( x7 C7 d7 X3 \3 C' k1 s! D
.release = led_dev_release,. Q2 C9 f9 O1 t' v9 i, [
}# Q- G" n# C6 ?( `( q, o: a
};. X# b0 |) }1 f1 v
2 o9 c8 D& {# q
static int __init led_platform_init(void)& `& k8 r( b3 K( T2 v' W
{5 ~- F: ~, a. o5 L8 o8 f0 m$ x2 t
int ret;0 h' k2 C) n2 v" f; c6 I6 Q, F- `" W
#if 03 K, L2 O* ]9 r/ g6 g+ H
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);% s8 d7 c( s8 i6 V" s
if (ret)) F E9 k" V) U% _
pr_warning("da850_evm_tl_leds_init : User LED mux failed :" ~; @1 _# x. |2 t( W) r5 Q
"%d\n", ret);) G- K4 A6 ~' T4 P
#endif
0 w4 ]2 {# f. m ret = platform_device_register(&da850_evm_tl_leds_device);3 z! x4 K M! x' O/ Z3 G( p
if (ret)( _, _) b% p2 G3 n) m
pr_warning("Could not register som GPIO expander LEDS");
( h3 P! S, ?, E" w else& L4 a* f/ @5 {- _
printk(KERN_INFO "LED register sucessful!\n");
* b+ `$ }( h" t1 V+ `
) ~; O* E$ W1 g! Q return ret;
8 z9 T6 g8 q4 s}8 a2 y; L$ U2 S# G% z! p
4 o+ @) b. A, r$ A% Z1 Nstatic void __exit led_platform_exit(void)
/ P4 a) l' B! q& e) Z% H1 U{
; [( {% @ I! u6 m' M platform_device_unregister(&da850_evm_tl_leds_device);
" D4 U- E( j' w4 B% F) r4 Y0 y9 k( O* g, W. V
printk(KERN_INFO "LED unregister!\n");
# W) @4 J* v' @) H! V3 _}( {0 A/ T0 B4 _, }
" b' @& E+ O$ _4 m' R7 N1 U1 e! f$ ~
module_init(led_platform_init);
w' ~& g) U8 p4 x; ^4 j% {module_exit(led_platform_exit);1 y0 c2 _5 U. q+ C
* d! U! K; u$ Q' b s" _' \MODULE_DESCRIPTION("Led platform driver");
g. \% I9 ^) s. T8 x+ Q/ pMODULE_AUTHOR("Tronlong");
7 B) n: S' u8 V: T& {" G5 g) RMODULE_LICENSE("GPL");
+ a' k4 Y( e2 s+ D! F" `+ D
% H) O# L' K/ z: M$ ?7 }% A |
|