|
|
求大神给下面的程序做注解,请稍详细些,谢谢。) z6 |9 x2 ]! b! g! r
#include <linux/init.h>
/ X# J$ @( y$ D4 e" B#include <linux/module.h>
$ H! G# U- J x#include <linux/kernel.h>
9 q! U6 Z2 U4 o9 {#include <linux/types.h>
2 J1 @" ^6 l9 n% b) }. J. U#include <linux/gpio.h>
5 v$ Q } ^$ a% x% l* v0 R#include <linux/leds.h>( y n# O$ L F" ^, y
#include <linux/platform_device.h>
) u4 u' r! C+ F& z+ C* f! y* q& X7 h: u& F5 ^5 ?
#include <asm/mach-types.h>4 l1 x2 I ?; \" l% m$ D/ X
#include <asm/mach/arch.h>
4 b6 F8 ~6 K. M4 X8 k+ [+ e# B#include <mach/da8xx.h>
# Z: R8 Y; z; h+ z( G" y, k+ }#include <mach/mux.h>
5 i# l& e( @2 z5 ~# U* j4 [+ \
5 F, f6 [& E8 R+ R3 U#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)5 P" C0 z; I8 _* b# v, P8 {# r
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 M5 J# Z3 G4 X#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 y9 ~+ |) R$ p D#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- @" y/ C7 K! H9 O
' g) O3 }. E, S% h3 b/ s& o/* assign the tl som board LED-GPIOs*/
: S. I1 w1 z3 b* Rstatic const short da850_evm_tl_user_led_pins[] = {- e, D" | z7 J# A% i( Q
/* These pins are definition at <mach/mux.h> file */; O8 W; y D: c' k% `. K
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, ]5 E2 n8 ]$ n
-1
$ b N% D. N$ \6 d: C};& i6 D+ D4 _# d8 \" u0 O: j/ i
( h9 [+ t5 G- O* n/ xstatic struct gpio_led da850_evm_tl_leds[] = {3 v$ S! ~/ z$ K {) E
{
1 W% S% V8 g8 ^/ Z$ G, O" r .active_low = 0,
! K' T, D: Z: A5 {; M+ S .gpio = DA850_USER_LED0,
$ M, z3 } ?1 C .name = "user_led0",7 p P" ~0 f+ k6 j* [
.default_trigger = "default-on",
_2 f, k' `2 M },
# _1 \5 }- @* c$ b% a9 c {
2 q8 E# g9 s. \6 | .active_low = 0,
* D) e6 e& m' j' w .gpio = DA850_USER_LED1,# n9 |3 M; r4 W3 R$ h% ]# r
.name = "user_led1",% D3 E" W+ ]- X+ U7 R3 X) T( x
.default_trigger = "default-on",+ J, O u( N3 M7 W6 Q- D4 |( G
},
$ u5 V0 J, _( \$ m) z {
/ F5 M2 a- D8 M1 q0 i8 S; Z% l' O7 i .active_low = 0,
# [" A: p0 H9 d7 v* x, b: N% ^ .gpio = DA850_USER_LED2,+ @& z# l1 r) S! n' f
.name = "user_led2",
( v; {) r8 M7 ^5 m) q3 [9 V .default_trigger = "default-on",
2 S: y- @7 f& j0 n ^4 `1 K1 t },8 |- n: f& V6 W/ Y" z
{
$ X- G8 X+ E% f. i$ B .active_low = 0,/ }! U3 J- Y4 h) j' B# l
.gpio = DA850_USER_LED3,$ f T: }) @6 y# Z( | x* u
.name = "user_led3",
3 ^) L {# N& R/ t .default_trigger = "default-on",1 K- T d& H: f- I- D( A7 H
},
6 F: ]" D/ o6 X4 g, C};
6 _8 @7 `! r7 T6 w9 E1 O
/ n; d# m5 q- P" qstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ ^/ a, l- T, k+ I# b/ H& V
.leds = da850_evm_tl_leds,
! J* R' o Z& e9 ^' L5 h .num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 G( Z3 F# B' ^7 [# j
};2 L3 Z9 z5 X+ L% P+ u
9 W) `) C3 k t8 @1 i" pstatic void led_dev_release(struct device *dev)9 L9 { a) t6 C& B% p( `
{
* q! Q( Z) B. {- [# P) \1 t, S};" C: Q: }/ a9 h; Z- {
. D# a2 o3 i! h& B
static struct platform_device da850_evm_tl_leds_device = {
% ?5 l# a5 P% c* ?# o( ^2 l$ n .name = "leds-gpio",4 s% k4 W- U& n/ f/ o
.id = 1,
% a1 ~" `' ~9 s. V .dev = {: H. E% {1 e. U% B( s7 K; B
.platform_data = &da850_evm_tl_leds_pdata,
, V: g; [7 q$ t/ s' p" X& ?+ p .release = led_dev_release,
& e- ^8 F; E& B) m2 k }
! Z: A5 J( X5 N, E- }1 P! q7 x};, T$ Y) T! `$ u
5 \+ d' E: q1 x
static int __init led_platform_init(void)# f' T- e, \$ C; s
{* f: L6 d3 N5 }' I
int ret;
& u2 q, S0 ] [9 t- J#if 0" S; q/ M6 q. R, }! p! K
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);& ?! u5 p8 [# O K( `5 T
if (ret)' p! p, f% Q5 J/ W
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
9 N8 \4 \/ x7 J "%d\n", ret);
6 O' Q+ |6 P2 K/ V, F$ g#endif
8 c1 C, d6 d& P; u1 B2 P ret = platform_device_register(&da850_evm_tl_leds_device);# z7 I- a2 X! s* F8 f1 b1 {! h
if (ret): @0 B0 v+ a+ [- R1 @ W
pr_warning("Could not register som GPIO expander LEDS");4 P! Y& n- U2 h1 k7 G
else2 u9 O) d' e" N2 p1 G' x
printk(KERN_INFO "LED register sucessful!\n");
* h! g% C! R# K- \. C# E7 K0 Y. N% Z( w
return ret;
7 p" {$ T; s% T7 x! |8 L}
# [0 t1 \- k1 z* ]* I I) ^" n# V% r/ D1 }
static void __exit led_platform_exit(void)
( o9 z) ]4 J2 |8 v' t{
3 E0 s7 T% U# Q" j8 q/ v; i platform_device_unregister(&da850_evm_tl_leds_device);* M2 @+ F: C% l# I9 Y1 [+ H( j
1 z4 U/ {- E9 ^ Q6 N5 g ] printk(KERN_INFO "LED unregister!\n");
6 H' V; C$ l9 f) o}
6 m) K$ Z% {4 d' d& N0 T% z
$ m% k/ L3 V7 Z) b4 y" R; Wmodule_init(led_platform_init);
# y8 ]# x4 ]3 M. E0 n' G9 wmodule_exit(led_platform_exit);3 ^+ x2 {9 j ^) E5 d
5 |$ O/ R. f+ M8 B9 N, c# D
MODULE_DESCRIPTION("Led platform driver");: Y2 f4 H" y% z! @) T, l
MODULE_AUTHOR("Tronlong");3 [8 F0 K$ N* _3 l$ \
MODULE_LICENSE("GPL");
8 \/ P; \/ l% x% R
( k g2 x6 K1 X M( K" X |
|