|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
& | l- i6 c' Z#include <linux/init.h>7 x9 Y: W8 Y6 n
#include <linux/module.h>7 \5 [ `$ l% m" V% _6 n" w" }) p
#include <linux/kernel.h>* V) h, w2 W8 Y1 V/ y4 n. t: ]( Y
#include <linux/types.h>2 g: a7 o5 @- n" W6 a8 Y. t
#include <linux/gpio.h> j- Y/ Q+ s$ S! C
#include <linux/leds.h>
2 I2 B3 t8 ?, R! w( U8 y4 O#include <linux/platform_device.h>
2 n$ {& M6 O; A- f. a( V/ ^9 q+ E1 T' X# ~8 }3 H
#include <asm/mach-types.h>: g4 c. E+ J! y S( M U8 b2 ~
#include <asm/mach/arch.h>0 l4 d# M C# U2 p% z' F5 n
#include <mach/da8xx.h>2 f3 \7 S+ s0 }; I$ J5 D4 C
#include <mach/mux.h>
- a8 Z% q' d( x& U
9 e/ I# \/ N8 Q2 Q' k#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
, j6 e7 \3 j( @6 s) S9 z' d( N+ k#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) }+ x* S/ `+ w: d, c
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
6 x+ C0 X2 {% z' E3 Q8 _5 z# p( E+ H#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ B9 |! D1 J ]! ?9 l% e$ \1 U9 J$ q! E5 B$ N3 B8 p6 M
/* assign the tl som board LED-GPIOs*/1 E2 D4 n4 B; d+ W& s
static const short da850_evm_tl_user_led_pins[] = {
" p1 w& Y/ Q' j3 @; X' f /* These pins are definition at <mach/mux.h> file */0 }# V1 W- M; l4 x& ^1 p6 f' k& d
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! c# X4 Z; Z4 j% B
-1
) C j0 q8 k f) t0 O+ P8 R/ H};1 c2 H2 y& u0 x" p z
2 G! x b1 n9 J9 F, g& z2 G
static struct gpio_led da850_evm_tl_leds[] = {: X. M* F3 z+ z8 z
{
1 \* q0 i5 s3 k# M: u .active_low = 0,
$ u1 ~2 ?, G+ M& W* z3 {- C9 n .gpio = DA850_USER_LED0,* p: z0 ]& F) _- L" a
.name = "user_led0",$ t& V5 p) v! k, O5 a
.default_trigger = "default-on",
; a3 |+ k3 a3 j: w9 G/ i% I% C },
4 k# m. E" ?- Y- { {1 M# K9 y7 x. B. V
.active_low = 0,
" F; W2 Q+ T7 `3 d$ H6 B .gpio = DA850_USER_LED1,
) P" T) b( b% e. ? .name = "user_led1",
% h. Y5 E @9 a+ Q) \0 {" ]2 Q .default_trigger = "default-on",
8 p( e$ n+ O3 q) a },
6 e) R) M& ?) D( ` {
& g. P( _: b% ?; L: P .active_low = 0,
! i0 ]6 V$ ]4 w% v; a7 }% G .gpio = DA850_USER_LED2,
3 x$ |- V) Y. U1 Q1 Y .name = "user_led2",
8 w M% G/ l+ Y4 Y5 d .default_trigger = "default-on",: s! y: e7 E' {+ ], d
},
! p/ |2 M6 W0 p! B" n+ x {
3 T& x2 h; N! d* R .active_low = 0,5 a) r/ k6 S/ K6 i) b7 h1 z/ a
.gpio = DA850_USER_LED3,* o/ u+ H/ d5 Y7 W6 U
.name = "user_led3",
6 n9 `. t" G7 H. I' ~* J .default_trigger = "default-on",
L# z% _; Z, w: c# I1 b" F" U }," {/ ^% f6 G7 l+ m) _; k
};
$ q2 j2 t- _) ]0 s; f
1 R1 z, S3 {/ Ustatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {( q' D0 Q1 k8 e3 E+ c
.leds = da850_evm_tl_leds,
' i% @ \% L6 Y) P# g& l. } .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
! X3 a. _) _% c};
) Q; f2 k/ h1 T+ L6 ^& T. ?+ }7 v& v8 I' t! O1 O) }
static void led_dev_release(struct device *dev)1 ]! }7 e5 w2 d( t F) b
{
9 Z1 N7 {! l0 a};
4 J6 o6 K( K# r7 ~
$ Y5 T5 o0 Z3 N8 Mstatic struct platform_device da850_evm_tl_leds_device = {
! Z1 T% q7 w" o: z9 \% S! n .name = "leds-gpio",$ n [* \0 z' G( V+ [% X
.id = 1,% |9 n: \! ]/ M1 u8 @# A
.dev = {+ D' x4 s2 s' x) f# [
.platform_data = &da850_evm_tl_leds_pdata,! G& S+ I, N# U0 n* @" U
.release = led_dev_release,* l) ^. B5 ?1 w! N4 `
}
J. N: x* a: L/ D% a+ v};1 n6 L% X( \6 ^0 k( r% K
) Z6 g/ J' T G/ Mstatic int __init led_platform_init(void)
. ]2 }/ `; Q! A ~{
4 W9 W' r) \* }4 b4 ~) X% I6 _ int ret;0 _5 A7 ^; Y5 \' m& J1 P
#if 06 L( s/ Y4 E/ v( q1 o% ^/ @( n$ O' T: M
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
. g8 F. L8 m4 Q" M4 I" G if (ret), [6 k9 G. W0 X+ d- w
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; H. p7 M& x0 m- J+ t2 S# A "%d\n", ret);4 ^0 V7 n$ w* ? ~+ A9 S
#endif
- v/ D$ g- }. P- f9 Q0 O5 ~ ret = platform_device_register(&da850_evm_tl_leds_device);8 ^( ?2 c- ^# X: F/ O
if (ret): w4 j% a' i0 d3 f8 m2 @
pr_warning("Could not register som GPIO expander LEDS");
: x) O8 e& ^6 P else5 G/ J# o4 G% ^! {
printk(KERN_INFO "LED register sucessful!\n");
( S) |9 j4 m) m5 C o
; C, ]4 V6 P, s# U2 L return ret;( }$ f' g5 L' o; y" L; K
}# `1 p' Y8 H; z! k" K
- R2 g j0 L" F% u# s$ Z: W$ Jstatic void __exit led_platform_exit(void)% h8 |3 W6 B' H* @1 k
{" r) I& Y# Y4 V, \8 q3 O
platform_device_unregister(&da850_evm_tl_leds_device);3 W, r. x; c2 Z$ |: D" b3 q+ s" v
8 e- Q$ v' Z) O5 o W( t
printk(KERN_INFO "LED unregister!\n");& I; I' t9 K9 R0 ]; N: }
}$ u3 i' ~# \' {9 Y
L, o! B! z6 Z3 O" {3 C- x4 m5 l8 fmodule_init(led_platform_init);
) k2 h" d! |( S* Vmodule_exit(led_platform_exit);* Y# D; O8 F, S/ U, M
# b7 t4 |3 b$ w9 e- F K
MODULE_DESCRIPTION("Led platform driver");; W9 C+ S& Z- F9 x4 C6 H; i
MODULE_AUTHOR("Tronlong");
5 o/ S1 Q) Z0 G, D0 n! H# nMODULE_LICENSE("GPL");: ?( A9 O- u5 u& y, Z
# W+ r) X: j9 ~: W
|
|