|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 [: u! j+ p7 A2 y! |
#include <linux/init.h>
! N& |4 L6 w" E; O+ ~#include <linux/module.h>
8 Y2 w# C5 X2 H: j/ D+ P#include <linux/kernel.h>% r; p E0 \$ C6 u
#include <linux/types.h>+ H' [8 c7 V( q& {- Q5 c
#include <linux/gpio.h>
8 g" O* ~" s& @( T#include <linux/leds.h>
6 C6 @! q4 w7 f8 ?: _7 t# w#include <linux/platform_device.h>: {4 j0 U$ T. B- f3 \& E
; f: {1 E E. }6 S* _#include <asm/mach-types.h>
7 J/ P+ g7 g1 x- L#include <asm/mach/arch.h>
/ K0 P+ Q4 u# U% R h0 M8 h+ F* m#include <mach/da8xx.h>
% W3 ]/ n; @+ ?0 h: U#include <mach/mux.h>7 q6 l0 X0 v; O3 ?# {3 Q) z
' E4 O0 V! R0 G6 X
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
2 E$ ~3 D$ _6 }6 T* R/ _$ o2 x#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' o. s6 {( K0 c' V* u3 Y
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
. P m9 G7 a% h, k5 h#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
6 a9 e% c; W5 x |/ K4 Y
/ T6 q L* u4 h8 C/* assign the tl som board LED-GPIOs*/
- \7 w' M1 J" L W7 ?static const short da850_evm_tl_user_led_pins[] = {
. v! Q9 f8 L6 ^& ~/ v; w, u/ E /* These pins are definition at <mach/mux.h> file */
* E5 }7 S* ^, Z9 ` DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
# m4 A g+ }! L# A* G8 Y/ m3 w0 ? -1" [( P# {" v7 K0 E2 Q
};- H3 [% [5 q. l2 h2 ?6 |
7 i0 L W4 l$ a6 s7 Tstatic struct gpio_led da850_evm_tl_leds[] = {5 [7 m% F% }0 z: { r, X5 P! d
{8 F( w& R/ c. n0 A& ]( d
.active_low = 0,. X' v+ X7 a l6 |/ P
.gpio = DA850_USER_LED0,
/ O$ U4 L( k! E/ Q2 I# f G; C .name = "user_led0",- m( c2 g# v' j8 ?9 Z4 U8 h3 |' I
.default_trigger = "default-on",
7 p+ @. X& q+ {$ u },( m; C6 T6 \5 m, i2 {( M: L
{
6 G+ I% N% j/ X. y3 H- u! D .active_low = 0,
2 n o6 v/ F) c( n& `/ X! t .gpio = DA850_USER_LED1,
( s+ y: g% F# |8 v- k/ W .name = "user_led1",
, e7 r6 ?: X6 O; @5 j7 y) j .default_trigger = "default-on",
2 U1 H" d( \. R6 R5 C2 a },
, S2 Z% A1 m8 }7 c9 B- M, { {
1 V) t7 t" k0 @8 D z .active_low = 0,3 e' Y( Z8 S/ G4 i: w
.gpio = DA850_USER_LED2,5 H+ i& a# t9 h
.name = "user_led2",
" U+ t- O9 ?6 F" _# g .default_trigger = "default-on",
9 O" t& {+ Z& r8 w% s: C5 \ },* r4 o8 }6 ]$ d
{
0 X e7 u) U+ _3 `3 m: x+ f .active_low = 0,
! ^# S: R0 V# J [% \; S .gpio = DA850_USER_LED3,
3 ]" ?2 m( e5 ]7 h( f .name = "user_led3",
/ C. R8 y; v: I# ~8 u: w2 _2 A .default_trigger = "default-on",
; c9 S, L; @# [; r6 M },
8 P4 @6 l4 W M7 ~8 \# J* t};
) O F. h+ r# j& T7 b
' ~- S' J2 Q9 Kstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
5 r+ l8 a: \% a, `& K .leds = da850_evm_tl_leds,5 G4 M' \9 G9 z. e
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),% f$ d# K+ p# m4 H
};
) `3 @0 Q% |- o. V" N5 c u. Q9 s- l! H% r) i
static void led_dev_release(struct device *dev)
/ }" a" l% C$ l- F{ C+ Z" G% r9 @* y( A6 X$ F: N: _
};
; D9 J' p7 ~/ f T
, e& Y$ m/ j& a8 k9 s: p& B/ x1 t9 dstatic struct platform_device da850_evm_tl_leds_device = {
- {; N+ N% `4 B .name = "leds-gpio",( U. ]6 F7 Q# J5 V. [
.id = 1,
" x) V# ^5 @, I6 J! [- T2 S3 L1 Z .dev = {
/ _5 V+ W/ h+ Z9 F. q6 m4 t .platform_data = &da850_evm_tl_leds_pdata,
+ K0 f. L( R: o7 h; f$ v .release = led_dev_release,
& K4 E& |# C8 Z7 ^, V1 a }, Q: A \( o8 ^1 C" W
};& D$ W7 g' d v0 `' r8 Q
: v3 G1 W) Q1 Q' t- lstatic int __init led_platform_init(void)! a0 }( y1 ^. i1 C4 f% S
{
! T7 X- ], [. N" u int ret;) f# [# B4 n. `
#if 08 O5 O. E/ Q7 r
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' a/ c- p1 B& B1 e: K+ l if (ret)
+ r3 T3 r' m5 ]& z0 Y' \, V# f pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
5 [ `$ A4 r) }7 g( A "%d\n", ret);
9 _/ i1 F& ^- E# l4 P% O#endif
2 b/ z0 g+ [( B z, g4 d ret = platform_device_register(&da850_evm_tl_leds_device);9 s. s5 E- M. g
if (ret)% B% l# f! K+ I0 \4 I& R- q
pr_warning("Could not register som GPIO expander LEDS");
9 ~' I c5 ~) ~ else! F) t$ `9 Q" a* |
printk(KERN_INFO "LED register sucessful!\n");8 |2 l& k( G, ?+ U) B
# p+ s c; V! T6 d2 N7 D. q5 R
return ret;
+ J6 p/ T" k* O+ f}
) E, ]8 m4 w& p: k
' [8 u. E7 b( z: c) B0 J$ V' hstatic void __exit led_platform_exit(void). U% t( A1 P; W% v/ c
{/ S2 d4 J. J/ ]$ b7 s
platform_device_unregister(&da850_evm_tl_leds_device);; q# T8 {$ }0 m! a3 A
2 X6 Q+ M* l1 k( O) N. v
printk(KERN_INFO "LED unregister!\n");
2 Q6 q% \; B4 |1 u' ~& T. {4 ~}5 r$ t+ ?5 Q+ v6 a: i9 Z
/ B. r- @3 I9 v% N% }+ Xmodule_init(led_platform_init);; Q3 G" P0 L+ \
module_exit(led_platform_exit);
, T* D5 l& A9 x5 C% F, T& R6 K( X+ K% P" |' o. V" n2 l
MODULE_DESCRIPTION("Led platform driver");5 {: A/ T% T3 j$ c: s: l
MODULE_AUTHOR("Tronlong");
' ~) S! H3 d5 Q5 Z! B5 H2 bMODULE_LICENSE("GPL");9 ]) V: g3 V; b, H
8 T; w7 ~/ p) ^) Z& L% q |
|