|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 A5 L' o! _6 g! B3 ~. T7 X W#include <linux/init.h>6 ?4 T9 X3 t/ J: J/ z
#include <linux/module.h>1 v# k) ~. K* u! ~( d
#include <linux/kernel.h>
: l; l* `5 c2 n& M* z#include <linux/types.h>
5 E6 _1 Q1 l; m2 Q5 S#include <linux/gpio.h>! S( T+ P: o7 q- g( C
#include <linux/leds.h>5 n6 }& E. J- r2 p
#include <linux/platform_device.h>3 ^9 i. Y( a/ Y$ K4 {; m
4 \+ V0 a( J5 o# ?* i9 S1 R& g+ y" j#include <asm/mach-types.h>
8 v4 e& ^: A8 Z2 ]#include <asm/mach/arch.h> _2 r* ^9 ^) l# ?2 `- h
#include <mach/da8xx.h>: |! D) q: j# d4 B5 k- }/ H
#include <mach/mux.h>9 A+ g. {6 P3 F$ C3 n
6 G& ?1 p2 L) F1 P, w/ v- D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
- \3 c; ?: X# j3 b#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)6 K0 Z% I9 A* S( e) ?! ]
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
' ^$ k" T$ R& A; ]#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ J [2 G" T) L* r7 w% J1 ~- S- A5 V# q
/* assign the tl som board LED-GPIOs*/7 R4 {9 E0 H( j/ Z
static const short da850_evm_tl_user_led_pins[] = {! ^$ @* m. I8 e! S# a
/* These pins are definition at <mach/mux.h> file */
% [. [: T4 d5 }# S% p+ m DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,5 W0 M. r/ P+ @
-1
- A( \9 V% g% C6 n& F* ^% d};9 d% A5 [7 } {& x, b& p0 a
0 d+ I# V+ @2 [/ Z+ M! J2 Kstatic struct gpio_led da850_evm_tl_leds[] = {
6 u% q2 J! m) A y e {( \% [: Y$ A0 }
.active_low = 0,3 a2 ^! P: ~8 R" Y5 J+ \
.gpio = DA850_USER_LED0,9 {6 i" e. P8 {% g* m0 S" U/ d
.name = "user_led0",8 Y6 o7 c* m# C/ ]
.default_trigger = "default-on",
3 b9 Z( g. N' c @% D* X! W. x; K },
! a1 m0 Z' r$ v, b) s {- w5 v; `6 M- L% u" i u
.active_low = 0,0 v( z9 y( {2 k/ d& O/ \" L: P
.gpio = DA850_USER_LED1,. G3 T( ~( k, W S
.name = "user_led1",2 o$ u& o: k/ P7 [$ j6 R
.default_trigger = "default-on",
. M9 m- j3 F% `6 p: v8 r& V },
* v. D2 M2 e3 q" i {
" _2 r$ ?' }* ] .active_low = 0,5 D/ t! \: v7 r. I2 U; c
.gpio = DA850_USER_LED2,/ x, a3 `' k# n. n5 w1 }
.name = "user_led2",* m: A0 S, G! {0 r- ~
.default_trigger = "default-on",
+ N5 b7 ^$ P- x8 h },
0 A! C1 ~! v) a, c! ?+ ] {; i/ ~" D& P9 U6 Z1 E
.active_low = 0,
! Q0 r, E& l9 K* i$ z: `3 O .gpio = DA850_USER_LED3,; ]# G: p! ` A- L8 v8 B% h
.name = "user_led3",
! |; H% J" i6 E0 L5 G .default_trigger = "default-on",
9 k) J9 l" W% j9 Y* n' W: S },% ?( o: k/ y- A" J
};$ Z8 F5 `; C6 E) d, V3 k. G, _
# w1 U! H- [/ C, t' x( \0 g/ Xstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* I. F/ l& g4 e4 ~% \ .leds = da850_evm_tl_leds,% Y% u& W3 `: x0 M
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 Y3 L+ e8 w9 O- J* f' j5 R5 U. L};
& G" _$ i% f) v+ R1 g- B: j( L
static void led_dev_release(struct device *dev)
0 r, }6 y9 g- t2 ]4 F) [{
% B8 o8 N8 D% N Z# j6 o};
, d$ ~6 e/ [) k$ n2 x. G4 D. J/ ]3 X4 _, S
static struct platform_device da850_evm_tl_leds_device = {5 T$ A; O4 r- Q
.name = "leds-gpio",
9 h# }4 s8 q1 T2 w! e- n .id = 1,4 D6 e& Z- w& a9 [+ r6 c) j
.dev = {* v4 g. O" g# o6 Z: e6 I3 e8 s
.platform_data = &da850_evm_tl_leds_pdata,
& J0 T1 W& y2 I$ s; M; l3 z( `/ i .release = led_dev_release,
7 `: ^2 H4 a* }2 R6 o }+ R$ G& O& F* k2 j' k
};% k6 G2 K+ g/ ?3 |1 K) |5 P$ ^5 ]
, M `4 K }& zstatic int __init led_platform_init(void)
R: u# }' b& E( r{
# z7 n& l1 S L" _ int ret;
0 X( |# I+ p" n4 _6 v0 |0 F( B, i#if 06 [3 a! y+ c2 k7 [% b* f! I6 q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 h- n7 e4 v5 K6 P
if (ret)
# [+ j* E8 e+ A- t1 ?! o pr_warning("da850_evm_tl_leds_init : User LED mux failed :"4 ?% Y1 g' |/ q8 o
"%d\n", ret);. `" m& O. q- c6 ? W. W
#endif
u3 R, q5 w6 h/ M ret = platform_device_register(&da850_evm_tl_leds_device);
/ A2 o, W* v. L* t) e if (ret)/ u% Q4 ?3 Y1 N# o+ R# I. H
pr_warning("Could not register som GPIO expander LEDS");3 G w& S" W" V+ j
else
% V# [" b2 h6 ]' n$ D$ t printk(KERN_INFO "LED register sucessful!\n");
" _6 L9 W1 \' u2 B4 R
" P& Z- I+ Z |5 g) @; ~ return ret;
6 v* {4 E* a8 S}
1 D; s4 a: R6 t& E6 b2 ] _+ \5 I3 Q
static void __exit led_platform_exit(void)5 a5 n4 S& L. m, J: v9 A# P) Z* c
{
+ s0 U% a0 z9 j( d+ J platform_device_unregister(&da850_evm_tl_leds_device);- L, b m5 u+ ]2 ]! P( l7 s: }3 T1 F
1 t A7 T6 n! R
printk(KERN_INFO "LED unregister!\n");+ P( G$ s4 _2 p: D' S& G
}0 ~, q5 K4 y3 K# I, O
7 k0 P3 c/ J6 M9 o
module_init(led_platform_init);# h9 I& G# [# X) K" ]4 @
module_exit(led_platform_exit);9 F0 k( v. {- N: v
6 g6 z, ?+ v" k+ a. u+ \( g5 w4 |4 g
MODULE_DESCRIPTION("Led platform driver");' d, Z8 t$ ]* x& Q4 X0 F
MODULE_AUTHOR("Tronlong");0 P8 ^0 G9 a9 `& F/ U5 s
MODULE_LICENSE("GPL");
) z) T' D) Z6 a( D v* _# i: v9 v5 b) B# _# O
|
|