|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" q) }1 b2 p: V, G5 _" P! u
#include <linux/init.h>! L r- v- t/ r2 K+ }6 Y) |8 h
#include <linux/module.h>
# ?5 G7 z8 a0 F+ k#include <linux/kernel.h>
- S. j* v4 V M* j! J( v( w#include <linux/types.h>
3 \- C; }0 Y$ g/ g! L+ _#include <linux/gpio.h>
2 X7 V' ?7 `: V# ?#include <linux/leds.h>* j- P v/ s5 X8 H
#include <linux/platform_device.h>
: l( p/ |# K7 w- {. }
9 o; a" [7 j$ T( A, P+ r: g* t# J5 V#include <asm/mach-types.h>& T) M f$ M" ?
#include <asm/mach/arch.h>
' C( a6 i3 v4 {4 u2 t#include <mach/da8xx.h>
; I H: C3 b' X+ N#include <mach/mux.h>
, z# v& h/ a# W$ N1 P6 {+ G9 ?' W& O3 N9 w
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& X* l/ c2 J! c" K
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- a1 ?" X3 G0 N) W#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). ^6 |! I7 F0 Y4 O* `8 E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 y* p2 ^( P" r( e4 T/ M9 x5 I. i: `; u8 _* J
/* assign the tl som board LED-GPIOs*/* z$ J( Z7 s; o! N
static const short da850_evm_tl_user_led_pins[] = {
1 {7 k- H4 y/ Q3 G# ~; c /* These pins are definition at <mach/mux.h> file */' ]! D+ A2 W1 U) F
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,9 I9 a/ O7 Y" M; w( n
-1
$ b# L, i2 S; Z# g};/ i4 s. J# t) d9 \* U: J9 {
# F8 f. _' j; d) S4 Y: A
static struct gpio_led da850_evm_tl_leds[] = {/ D( h9 @% [+ i$ G- ]
{
$ q( s( [* d3 H9 J7 A4 Y8 ` .active_low = 0,
( E6 _& ~) ^& V: A; y .gpio = DA850_USER_LED0,5 z V- D) V8 X7 f
.name = "user_led0",( T/ q/ [' ?9 c, O# l8 u9 k
.default_trigger = "default-on",- x4 m; Y" b8 x. f
},0 _, D3 a- }, M4 g
{! y+ z& S/ q' r& \; R' s$ X5 h
.active_low = 0,
/ u6 H5 s! T8 t8 \8 A7 d .gpio = DA850_USER_LED1,6 ~9 f B' n4 R' _; R! I1 v
.name = "user_led1",: |" p! e8 d2 v
.default_trigger = "default-on",; Q4 }6 N7 Y: l
},
: D1 `( k) r3 [1 P9 O- [ {! R) ~% I$ b" K4 F' V- S
.active_low = 0,
d5 ?2 m# r* q- i3 Q .gpio = DA850_USER_LED2,7 U( O# [' f/ s( X/ i
.name = "user_led2",
& u I/ B5 d+ [; b8 M- f6 N( z .default_trigger = "default-on",8 K0 I! l8 u5 P* [' f. i ^
}," f; C1 U% _" R9 L: a: J
{$ S( F1 W5 y1 ~: B) ]# ~* \/ i
.active_low = 0,
, c2 P+ J8 a" Q .gpio = DA850_USER_LED3,
6 h- S" ]% q w* s/ L9 A4 a .name = "user_led3",
% y6 |$ V. s$ |7 ? .default_trigger = "default-on",
1 \1 U3 a- d9 ?- D },0 Z) R( C4 R" n7 }
};
( B7 ?: b0 C% u- F8 o8 b1 Y h
; G. L9 ?7 h7 d2 j V- s3 E+ E" Wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 M( \0 Z) V; T. _0 n+ T' ?2 C5 ?
.leds = da850_evm_tl_leds,9 }& x5 {! ]6 w4 X
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
1 {# j) t2 A) }};# U! X$ L; |6 g+ f' m3 j9 O
: y, k. N# S! E& O$ X* astatic void led_dev_release(struct device *dev)
9 A2 F& }2 r: x9 y/ a: X1 @6 `3 O5 u/ M{
, S Z! Z/ q9 U6 K; J6 J};7 ]/ w) e/ k" j& j$ F# l: }
: J3 c ?& { e& o: [0 q- vstatic struct platform_device da850_evm_tl_leds_device = {
. P0 Q9 o: G A5 `$ V5 e$ ~8 c) C .name = "leds-gpio",
5 I( r& N, I9 {' I d. C" J/ _* U .id = 1,
& F& Y! y7 H- ~% P: Q .dev = {
5 f7 W) J) P$ R& d! X6 J: w$ E1 A .platform_data = &da850_evm_tl_leds_pdata,
# [6 f7 H! R8 o+ C9 R" B .release = led_dev_release,0 V2 b) o, D1 M7 Z ^5 u
}
3 |, O( ~" f( ~8 w. [};9 H. H4 d8 e9 F8 K
6 R, t6 `5 v# i8 xstatic int __init led_platform_init(void)* h3 P% ~$ V9 A) j* i' k
{
! d8 U* d8 f5 C5 h$ I8 V0 z int ret;6 u2 B! ~/ F( ?% @
#if 0
4 G; ~/ j7 p v1 |% x- i$ c ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 G4 x6 q0 T, t, J0 d% K$ ?
if (ret)
) e/ e' Y2 t- u. X% h: L5 `$ c pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ L* z N, F. |. ] "%d\n", ret);
# \% g' @. t( b( c& u#endif8 c1 X2 n3 J7 I+ Q9 `$ J
ret = platform_device_register(&da850_evm_tl_leds_device);) F% h: ?0 W. n. }
if (ret)4 o3 N. X7 e+ D3 W, o; }! F# A3 S5 D
pr_warning("Could not register som GPIO expander LEDS");
- H6 w4 o8 M1 ~* P& [6 r else+ R/ B5 Q9 }3 h. F2 |) G0 F0 L
printk(KERN_INFO "LED register sucessful!\n");
G; `- Y& l1 N1 f K' v. H, @2 U
" z& P* ]: o' C6 M3 l return ret;
3 Y1 [ o6 Q" w y' s* d8 Z}
8 |! j I$ T5 R% X9 x+ h) y
. U3 u6 V1 k6 ?6 ?, J7 K4 |; N( Z/ Ostatic void __exit led_platform_exit(void)
1 o+ i7 `0 }& @/ p9 @. _{
6 O2 J7 z) V) j9 K platform_device_unregister(&da850_evm_tl_leds_device);
" P. v! T/ ^- I: |
4 u" ~) l4 T. _) h# W printk(KERN_INFO "LED unregister!\n");
. ]# O' S# e& q/ [4 M% M+ L- H}6 r* f( c( e, _4 d' m
* @# q5 J2 `, p7 s
module_init(led_platform_init);
3 z: |4 A( g2 ?0 Q$ }4 T; `module_exit(led_platform_exit);
P2 ]7 |7 n9 I# i& T& h. a- Z5 w: ^1 S9 k- z
MODULE_DESCRIPTION("Led platform driver");/ I( n+ k! l8 o1 y4 r& [# x/ b+ O- Q
MODULE_AUTHOR("Tronlong");
% L, |( J. U/ R! O% lMODULE_LICENSE("GPL");& D o; w O' v
2 v% C( A+ u6 f$ q0 K+ R |
|