|
|
求大神给下面的程序做注解,请稍详细些,谢谢。8 L, p7 \3 P4 P) R% A. A4 c9 ~* I
#include <linux/init.h>
, d3 Q& C# K+ d: O# v#include <linux/module.h>/ S* l1 y0 \ t- P
#include <linux/kernel.h>& U( Y, g/ C1 [! p
#include <linux/types.h>5 t" \, \* A+ H6 O! ~2 b. N
#include <linux/gpio.h>
: l4 o! b7 I0 w0 |#include <linux/leds.h>
H0 x# u, N+ ^# a#include <linux/platform_device.h>. t/ K4 ~5 I4 S9 Z
G. p# y0 M5 g4 R- p
#include <asm/mach-types.h>$ x; n+ C* I2 }5 S E2 C
#include <asm/mach/arch.h> m7 m! k# x' G. N, J: f
#include <mach/da8xx.h>" E. T! a% `" P/ \5 b# x1 X! `
#include <mach/mux.h>
7 `- t0 j8 R8 ~* R7 F2 D
5 A$ q7 _) z$ _2 y7 i* c#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' s) A. {2 Q8 n' C( R p; j
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
1 I. V# @8 t1 H5 X; S6 b6 E#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
" [- M( S6 O) v- L! N2 S#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 j' N# D* w# j- p
% `1 {9 ?; w. [$ E/ o6 H7 O
/* assign the tl som board LED-GPIOs*/
# l$ |9 t" Q6 ^$ [& ~2 l: r; Estatic const short da850_evm_tl_user_led_pins[] = {
4 _6 R* a- `; Z5 p /* These pins are definition at <mach/mux.h> file */! b( E' g# z+ [' G% q
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 m" X" G- p, K) I. Y4 u -17 Z" p" u8 T* e, y" H/ `+ D
};
! W2 g" Z$ T. X2 T& x) d, Z9 r: L- u3 X# `8 x
static struct gpio_led da850_evm_tl_leds[] = {6 J6 F* V& y# O: V4 N; a5 H
{; S6 `- n/ H4 L+ L
.active_low = 0,
) h" X' Y2 y4 t: d' @ .gpio = DA850_USER_LED0,
8 V. _3 }- W4 T .name = "user_led0",
7 s4 x i* `9 W" K" \' | .default_trigger = "default-on",
" J; j \) a7 s/ b% m) M },* G4 ]2 K, b" b) @0 ]( q
{2 P; g+ c! S- T7 F
.active_low = 0,
( `1 {' H& P! k5 e" O. B4 I. ?/ B. W2 d! u .gpio = DA850_USER_LED1,5 d$ P2 _9 N7 s& |( a" M) E ~" ^
.name = "user_led1",0 }3 I' k. W" p
.default_trigger = "default-on",
5 q! }+ m- Q: [& g: _ z7 S },
' H& V6 W1 Z+ o. J# i! D' { {
& L& y( q, C% l/ Z' y" _: ~ .active_low = 0,/ S8 v: w/ s" m* M+ X* p+ }
.gpio = DA850_USER_LED2,# Q2 C5 Z0 o5 Q4 o
.name = "user_led2",
8 A3 H D$ N* P! S .default_trigger = "default-on",
5 z, ]- X; e" k% k" f },- Z" C9 u' r; p* l3 w+ @0 L8 s3 g
{9 [. e: K$ W% E% c7 e$ u) Y o |( G
.active_low = 0,
! z$ m: |. d: _. g. ] .gpio = DA850_USER_LED3,0 n+ _' ^; t9 |# l5 p
.name = "user_led3",$ K! G- ^4 f1 r* E, ~
.default_trigger = "default-on",. X7 @: b5 m6 v( w2 ^; x3 } @
},
! S! k# v: {4 ]: Q. b0 q};
3 ?! `+ Q2 x. H
% W" h0 ~ P, H5 K* O4 Astatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' x. O' S6 ]5 z. t+ n
.leds = da850_evm_tl_leds,2 u; x2 u) N& U* J- A4 `# \9 q
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 e \7 ?. F/ S N% n3 l0 V7 ~
};
6 g# I4 a i5 d, D+ e/ F# _+ G6 H0 w8 K/ q: A. N; d* Y
static void led_dev_release(struct device *dev)
- F2 Q7 Y) Y8 e2 @* k4 `- o5 @6 `{+ \9 r/ T2 U- v0 l% u2 v. b. `1 i
};8 }9 F8 O) h9 O# d! v A- T
: Y3 C3 X' F" p: Z% h
static struct platform_device da850_evm_tl_leds_device = {
$ B3 z. r$ Y6 A .name = "leds-gpio",5 A f, ~- D5 Y" U3 y% s( v9 J$ O, I
.id = 1,- {9 D2 H% e7 N
.dev = {2 P' ^) u7 \; {4 ^! I6 E; Y
.platform_data = &da850_evm_tl_leds_pdata,
: K0 D: r' t! A8 |- f, z .release = led_dev_release,/ w* o% W8 B" L4 Z- P/ M! ]
}3 G/ \ `8 h' ^) |) s5 @6 r
};
$ _. Y8 J( z5 g- Y. @1 n) m9 V
static int __init led_platform_init(void)/ X, t. G2 x0 g0 B; h
{
" ^4 j1 F' u' K4 z5 E4 o- b int ret;! C! j, A; r# o8 `) m7 p
#if 0
) [/ ^, @% B4 B$ i% E/ e! Q ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ ?' |& c% y3 f2 v) Q if (ret)- w+ W6 h( ~& P! O" s# m' S7 t- g8 B
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
3 } w* ^+ D" `% ?' d "%d\n", ret);
$ z- C% k7 A+ c4 i#endif: }- k# e! n2 D" Q9 X
ret = platform_device_register(&da850_evm_tl_leds_device);
: t2 A! g" d- ? u4 C9 F) g if (ret)" C; S, F' p( \8 h, \( _6 D
pr_warning("Could not register som GPIO expander LEDS");
4 c8 j- U6 ]# d4 O, C else
8 i! |! o! {! V. T8 B' V printk(KERN_INFO "LED register sucessful!\n");0 X5 g/ L' _5 A& m1 U* o, z" z) _
& c- U: t" { c6 L2 s$ B; S
return ret;6 Y8 j9 @" T4 W; @" h
}; X; A9 J. l c
- Q% R6 ?# O dstatic void __exit led_platform_exit(void)' v/ z5 ?; X! d9 W
{* S/ K$ V$ q. b7 B1 F; m
platform_device_unregister(&da850_evm_tl_leds_device);
" Q+ @( ]# w) K- `9 O( B, f/ k3 S6 Y2 A8 N+ _
printk(KERN_INFO "LED unregister!\n");
% n9 n1 X1 I9 T0 d1 b}* q5 G3 m5 t x
# U, G$ e) |8 S/ o1 i9 v ^module_init(led_platform_init);
5 w+ [* c2 S7 O5 b7 h4 dmodule_exit(led_platform_exit);
( M1 g9 ~2 W0 }, `& ]7 l) p( \; o F1 o, W9 T: q
MODULE_DESCRIPTION("Led platform driver");' j! ~4 K, K% L8 A2 i( {
MODULE_AUTHOR("Tronlong");5 V; P! j$ q: ~% n
MODULE_LICENSE("GPL");
3 B9 V, F0 ?3 L- y; {; u% D1 c1 [' t, U6 X
|
|