|
|
求大神给下面的程序做注解,请稍详细些,谢谢。# S6 h- a# d! \
#include <linux/init.h>
8 o0 h( B) o4 ^+ [* o; n8 B u' z#include <linux/module.h>
3 `& B9 H( W+ Z5 u2 [' i L5 |/ }#include <linux/kernel.h>
3 f. X0 S$ o" l4 r# y$ j( ^#include <linux/types.h>/ y& J) F+ [! V B+ m0 k! a
#include <linux/gpio.h>
; }3 a" S- l3 k7 G" K+ c#include <linux/leds.h>( o6 ?9 @+ k2 ?( r" K0 w! X- l+ U
#include <linux/platform_device.h>
: ~7 U5 Z% k$ Q, X$ @2 W6 g6 F, G( [/ @/ `; h1 f$ m
#include <asm/mach-types.h>
2 y6 b# ?, }% W$ k2 G#include <asm/mach/arch.h>9 ]2 P/ q/ V9 ]
#include <mach/da8xx.h>
8 q& R* P/ |5 t- H! d1 a#include <mach/mux.h>) n' @/ s' L; \" z/ V- S
' ~! ?2 M. g* t/ r: f/ o% H( O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) s, G) y2 F R/ r2 v1 w4 }+ s#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)- R0 V5 w6 K( o' E, f) W7 }7 Z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- N. G% |7 i; J7 h" _8 |# N
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 q' k0 D/ o2 q
; k5 J" B5 l; M( M/* assign the tl som board LED-GPIOs*/ P. M' g7 C+ o% p4 U1 |+ B; u
static const short da850_evm_tl_user_led_pins[] = {4 a1 q5 c* [% i" ^ ^
/* These pins are definition at <mach/mux.h> file */0 e Y& Q* N4 o1 h& f
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' ^7 h* B/ h2 G0 Q: w
-12 E1 s! ^! z* U1 O7 t+ F# o3 m
};6 v/ M& Q! ?2 C) N
& z: N" {: W5 U3 q' |
static struct gpio_led da850_evm_tl_leds[] = {$ k5 N: K- j' c- I
{
4 o- _" f4 i/ A% h( n. G5 |5 ? .active_low = 0,
: @" ~4 B+ O- y# p! z .gpio = DA850_USER_LED0,
3 i, o" \1 C, u0 x: k/ u' u .name = "user_led0"," s" N9 F* R/ t$ h$ Q1 c% ?
.default_trigger = "default-on",% q. M+ n! C2 ~+ [( W- N! p3 }
},
* _; s& G9 i7 q {
3 f) |7 x; r0 T+ B5 k, w$ _4 x .active_low = 0,: L( q; g1 v z5 \7 e; v2 k
.gpio = DA850_USER_LED1,( M. V5 O) I$ @# j
.name = "user_led1",& W1 ]# a$ `$ ~. i
.default_trigger = "default-on",4 ]: F' p3 I9 t9 j/ n8 Y) w( ]+ ?
},. g$ E# I3 w) N* J4 D% g
{/ M9 V' V7 P9 S& k" @: K/ J4 J. L
.active_low = 0,9 f4 w: d! B d- A) q Q, P! j- V* z
.gpio = DA850_USER_LED2,- T2 t8 N1 H& j8 L9 Y
.name = "user_led2",
5 `: ?, k( B: Z& { O .default_trigger = "default-on",
; Y; Q6 z% Z. b7 [. G) ^7 m },
: l% K) O9 J- n6 e+ U- R6 m {* h8 V) Y2 \3 J' G( C
.active_low = 0,
3 O+ }: u1 o$ u/ b, i .gpio = DA850_USER_LED3,
5 X' C6 G9 A( b0 v0 h1 o, C .name = "user_led3",
( p( x9 ?1 Y9 o4 r {7 c4 x .default_trigger = "default-on",
! Q+ U3 P, A- }3 T },
' A3 m( C6 H1 x1 s/ l};
/ g6 k5 m% h5 `2 s2 A2 I6 B0 _; L8 O" v" g2 H
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' Y+ u) ?0 A# S* C+ x5 Z6 Z
.leds = da850_evm_tl_leds,$ V- y3 f, j" K( q; D' a3 S
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' v+ N, B. a7 F7 o# X7 y X, z/ U};2 `/ r `: Q' e
* t; M5 ?) @0 U. A$ kstatic void led_dev_release(struct device *dev)3 X. g+ K6 ~' ~
{$ @/ c! l, v7 _" g: n
};4 i6 H7 o- ^( _) ?8 p1 I" r
; S" x. t8 Z* v# Cstatic struct platform_device da850_evm_tl_leds_device = {5 K9 B9 e' I2 `, H0 ]' Y: ]/ D# l
.name = "leds-gpio",% |8 Y3 f% z4 {. T4 F. V
.id = 1,
- v5 F3 [6 g U0 K .dev = {
+ q w, a) e7 M .platform_data = &da850_evm_tl_leds_pdata,
, l7 W% M% D0 Y g! z .release = led_dev_release,+ N$ @1 O1 Q1 \, f3 G$ ^( Z. Q" u% `
}1 B3 D& {) d+ g5 S
};3 i3 ]; f0 ^& ~% X: q% k) B+ n
- z, s- S2 S2 H/ R+ M h" d& e
static int __init led_platform_init(void)
, l9 k, W- O% z H& E' p7 L7 y{
" T* a8 A6 b: o& j( e$ r int ret;3 L. C, A. U* A" S3 R' b
#if 0
; ^! A, j( O( R3 u% G: y ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);" S8 Z# [$ J6 d) I8 F
if (ret)
0 l3 Y1 T# Y$ w. |! P pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 D5 K& f; h! s; e, E "%d\n", ret);) D' |' q" Q) t# F7 T2 }
#endif
8 j: K0 t5 q* i5 |, h' j! J1 E( ?3 @ ret = platform_device_register(&da850_evm_tl_leds_device);$ ^0 _' L: N4 V& W N
if (ret) G) P# T) R Z+ Z, X* |8 m. a
pr_warning("Could not register som GPIO expander LEDS");4 r5 |6 b4 ?& R# k7 b
else
( B6 a1 K9 R5 |6 g& l printk(KERN_INFO "LED register sucessful!\n");
: B1 |/ c7 [( l; W8 D3 P3 T9 ?7 n3 l! ~1 X" x
return ret;
8 ^1 V w) }6 W2 x+ m}$ J2 M% N+ \! ~* K
% T3 R5 m4 l% ^
static void __exit led_platform_exit(void)
. u, p0 N- a# {) e{ M0 s3 f# N+ a
platform_device_unregister(&da850_evm_tl_leds_device);0 l8 W% [* a" e! p! @6 w* t& a: ]
6 n' p0 Y! H- A% T7 d3 ^: p printk(KERN_INFO "LED unregister!\n");
8 G+ Z! Q% k& |0 p: s}
- K4 A b% B) ?, Y+ \% {3 ~
+ a' R4 d$ ^, T0 ]) q/ d' Ymodule_init(led_platform_init);! j1 l1 h$ e, O& m# T. O8 h, t
module_exit(led_platform_exit);
% \2 Y' W2 T5 N, r8 v' [& Y$ T9 h" e9 ]
MODULE_DESCRIPTION("Led platform driver");) F! o0 ~5 K4 ^* f+ _
MODULE_AUTHOR("Tronlong");9 L# f, Y. t7 C. D2 b2 X! A4 \ I
MODULE_LICENSE("GPL");" i- ~# l6 X3 Z: G4 X; g% g8 X' l# E
b( h9 m2 l8 \/ O, M* ] |
|