|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
D* n" L6 p% H1 l0 u; B#include <linux/init.h>, ~' i8 \9 B! M8 j6 h) O% |/ E
#include <linux/module.h>
) ~# O" y1 ]9 A6 e" h1 i#include <linux/kernel.h>
$ t) B& O4 A# v6 e6 {: v#include <linux/types.h>4 @- t% Y$ |- P6 l5 C& t2 {; ^
#include <linux/gpio.h>9 ?! Z( W3 E; {' p; M
#include <linux/leds.h>) L0 A( h' |4 t* K4 h
#include <linux/platform_device.h>! O9 b% J* k. [( K7 v- ^* Q8 H
5 G) P% o6 C/ L! w D3 p/ l
#include <asm/mach-types.h>
) B" e9 j; g* w#include <asm/mach/arch.h>
1 T9 K& _1 K/ ?2 y#include <mach/da8xx.h>5 x7 u- H7 z2 N! B5 {0 ^, d
#include <mach/mux.h>
# k. \, P1 _4 B$ S* p
. ^' u* k& P9 r6 ?( @9 d& H6 m3 `#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)# W- p- V( K% D2 f. z: N
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
/ z p+ {( }: ^& i6 u# d' O#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
+ B2 u, i5 y- ~' J5 N7 u, U1 u#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 c, O e/ t+ P5 s
) ^; |' h$ x" b% K) C; G" ~/* assign the tl som board LED-GPIOs*/1 D4 J& l C9 i/ G4 }
static const short da850_evm_tl_user_led_pins[] = {( O, U; h' M ~6 T- x4 z# `+ j
/* These pins are definition at <mach/mux.h> file */
. T* d- ]. s; Q2 f1 p DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 h4 R8 C2 i% S- Q) m -1) g0 O( ]( `+ N+ H1 B
};* p; x) q& q" D3 o5 u
$ B( w. _! T( L* \static struct gpio_led da850_evm_tl_leds[] = {# n; I4 G! i$ T$ L4 r ?; m9 b' ~+ O
{
) H8 C2 {$ B0 B6 F .active_low = 0,
. _# M w; m; I! X$ _# ] .gpio = DA850_USER_LED0,
) [& {2 W: B& z. l+ s .name = "user_led0",
, k$ w5 @/ P; E y" X; } .default_trigger = "default-on",8 ^; s) l2 g. u8 l5 v+ m6 e
},+ Y# _$ m0 {" F+ y9 ?
{8 \1 b$ _+ w! ]" n2 s" a p+ B7 m
.active_low = 0,
3 G1 R. _2 ~8 S! g$ J# h) v .gpio = DA850_USER_LED1,
/ _$ N- ~; j7 j& r0 b* O6 I .name = "user_led1",
& m+ p4 i8 b+ l0 O/ B. n! z .default_trigger = "default-on",9 ~2 U9 T6 Y5 R; B( J
},$ h) Z2 E8 f/ }1 V: K
{
1 D% G7 w8 ? C5 ? .active_low = 0,
9 ~9 X4 R, E! k- K0 m; Q, d .gpio = DA850_USER_LED2,
* a1 z( G. w/ t7 t. @ .name = "user_led2",4 M4 K+ w0 }2 }5 u
.default_trigger = "default-on",& S0 \, y( H7 l# g, Q
},( [. m! ^$ D& G
{
' E' r' {' Q) a# k8 b$ H1 [ .active_low = 0,
: V' g, @/ u2 m' L. p4 o .gpio = DA850_USER_LED3,
7 S" I* y/ m- M .name = "user_led3",
7 I% A" Z6 \) |, w6 X# x .default_trigger = "default-on",4 B7 Q) O+ u6 M
}, f& ^& n% C3 y* i# }7 y
};6 Q8 n5 K% C% s. p! T4 S0 Q2 {
8 [/ K6 u' F2 {7 |5 C2 M
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
3 V* {) f& S5 y0 f! Q .leds = da850_evm_tl_leds,$ W2 v9 Z" p* J2 `
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ t) T+ J. m/ V- p. n};
5 y: R, B2 `: a* m7 d3 ~; K) U' I) Q* c( W y+ n# Q
static void led_dev_release(struct device *dev)
. Y4 f( T N, B1 A" W) ~$ L{
0 S; t( m" w& W1 l1 t};
* m5 ?1 n+ F) p5 K; u6 N- n, ?# J3 ^6 |- L! q
static struct platform_device da850_evm_tl_leds_device = {
- ]3 a% X4 ?0 J0 j' x4 T .name = "leds-gpio",5 }. G8 M8 M) T2 s
.id = 1,
7 |/ w& _1 T) B# |- K- w .dev = {
* u* ^$ F8 }. i1 r .platform_data = &da850_evm_tl_leds_pdata,
2 J9 t: G* x: N .release = led_dev_release,
1 U& X& C: B: }5 r4 ?) p3 J }0 z- V, o8 V _& T
};( j+ x; r* o x5 d7 r- B- `( e
$ ]" z' R3 r$ M
static int __init led_platform_init(void)
; T3 M' o2 p8 u# H" h8 J k{3 @. n- J8 s) I2 b! V
int ret;
8 o' ~8 {7 `; a#if 0
* B( S9 w" b: d7 d9 V5 a2 N ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
) o) M- N& s- S* s, B$ ?' V if (ret)
4 F0 E0 W$ E8 m6 K1 z. i& A pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 K' T6 K% u5 X
"%d\n", ret);
% C3 f3 p3 `3 s( w( T) e* J#endif% h. s) F1 T4 Y% I; i! E3 v
ret = platform_device_register(&da850_evm_tl_leds_device);
2 G1 c q [' w$ | if (ret), X& N+ l7 Y4 q: [- E
pr_warning("Could not register som GPIO expander LEDS");& k1 ]3 H- y8 |) @- G5 E8 |5 Z
else0 R2 L' ^; h3 ]1 y) Z
printk(KERN_INFO "LED register sucessful!\n");
$ M/ S! w" D6 C* I7 g
# E- O# [/ U5 F) }( `% `- C return ret;
) M2 O5 ]6 R( O J% Q}
+ X# }& v* j; Y8 P* x7 n1 ?
6 F/ S, b$ J1 }" e0 tstatic void __exit led_platform_exit(void)- Q6 c9 N6 r, R- f( Z" Y" r# I' I! U
{! x2 p U. O5 J$ g! U: r
platform_device_unregister(&da850_evm_tl_leds_device);
3 ^' B4 Q" { _) c% M8 v# a( v- ?! D9 J
printk(KERN_INFO "LED unregister!\n");, }- Y B% W z
}
5 D6 I; ?8 }% l+ a2 C+ g! q0 t5 u* T+ [1 T2 V
module_init(led_platform_init);* W: O4 ^3 M+ J
module_exit(led_platform_exit);: A" ?5 [' j9 E% m+ G# ]
9 ]/ N X3 V+ n+ SMODULE_DESCRIPTION("Led platform driver");
! m$ B$ y& V% Q6 N9 h1 l$ w& b/ a$ _MODULE_AUTHOR("Tronlong");! R# e) E9 y9 _' b" T' Q8 c/ X6 ?
MODULE_LICENSE("GPL");
. c; t" f2 ~ U2 [6 A
. i7 O) u5 v: B- i* T" k |
|