|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* d. T( j$ w% @) r
#include <linux/init.h>. d% G. g0 H( K: ^: w: R( y
#include <linux/module.h> S7 r" P# A4 Z+ d( ?( I$ \
#include <linux/kernel.h>7 {1 w4 p' [, x
#include <linux/types.h>
. C1 i6 S2 I( [& V* G: c#include <linux/gpio.h>
& Z' \1 b: `+ \6 @#include <linux/leds.h># ] }1 L4 A/ B ~0 y2 q: @( s
#include <linux/platform_device.h>2 a p' u. r$ d& B- P
* f0 S: j" @0 b4 V' H+ h5 a#include <asm/mach-types.h>
% k% ]6 a# D$ w/ y#include <asm/mach/arch.h>
( u( t3 ^9 G" D4 o! O# ]#include <mach/da8xx.h>
1 T/ o9 Q1 B4 ^9 y O" P5 P#include <mach/mux.h>7 x: v, X$ p8 f. p4 x/ C
" A8 b+ i/ i$ a5 [#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)' h! y- J3 O3 | k" v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& O M7 H3 T2 l- e
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 _/ H+ k+ g4 B1 o' k#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
+ e6 |5 q; G$ _6 m" j7 e
" k4 Z0 I& f$ J$ L7 L/* assign the tl som board LED-GPIOs*/% }$ N# F4 u$ C0 R ^+ U+ X
static const short da850_evm_tl_user_led_pins[] = {
; R3 I) T; G' {: N, B# X" O /* These pins are definition at <mach/mux.h> file */$ R- I& q/ }/ r
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" m( ?8 v% c# g" N' ?$ } -12 `( J5 h$ I" \1 e0 ^
};: _$ h$ b0 _+ y5 T4 ]' c3 y/ O! W! x
( ~7 m6 M) K( E7 F8 S: z
static struct gpio_led da850_evm_tl_leds[] = {
z, u4 l: q% \% [# Y {
3 v7 V+ z, Z. c" S8 ^ .active_low = 0,
3 K% N8 f, ?8 a; k+ L .gpio = DA850_USER_LED0,7 l0 s2 e) L. @, O2 @
.name = "user_led0",% ?; T/ R1 B, l
.default_trigger = "default-on",
: q4 a6 h- a9 ~2 A9 [ },, `' v1 n3 \% t9 X/ N' p
{: |. i9 g6 O% j* u4 x3 q7 `
.active_low = 0,2 P e- o5 r% U' k! ?; \
.gpio = DA850_USER_LED1,0 \: w9 @, e6 w6 M/ W. Q
.name = "user_led1",
) C8 t6 o. i* m3 L .default_trigger = "default-on",
. n' u- U1 @# i% F },
4 Q6 Q* D' {, i/ @+ D1 i6 b+ d4 Z {
0 ?; K# ~1 U& v6 K1 h .active_low = 0,7 k5 p3 a5 c0 S5 ]: d) i6 D
.gpio = DA850_USER_LED2,
5 }* Z8 q9 [8 _/ N .name = "user_led2"," t; G. j8 c. f% f. b1 s
.default_trigger = "default-on",* t/ e- H4 b$ t
},8 w, d" \6 `9 Q$ Q
{
# A* \$ i" [. h/ X. ^ .active_low = 0,
" q# e8 e8 @9 R6 ~3 ?" q8 _ .gpio = DA850_USER_LED3,1 d5 n" Y2 g4 ?( Y* z8 g
.name = "user_led3",# A g' N% Y; a' l+ B
.default_trigger = "default-on",
/ a. l# g; o- J4 r },
/ n6 h) Y3 ?7 _8 |9 E1 j$ C$ A9 z* u};% A6 f0 V6 l# H% U0 v
8 g* h* z# c; A1 C' `" w0 M
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
$ P& F" C6 O& }/ s3 [9 K& h5 K .leds = da850_evm_tl_leds,
$ {/ O1 m" n. ]+ m i6 P .num_leds = ARRAY_SIZE(da850_evm_tl_leds),* P3 j* N' C) S0 t4 Z R5 U' |
};: K/ l& P" f' Z
! f: J& j* P T' f4 O- c M1 mstatic void led_dev_release(struct device *dev)
4 e( _" [0 Z1 N# f{
) l2 q) y* y4 w+ n};7 l: w! ?5 Q4 Z# J
$ }* m, O0 J# |; e
static struct platform_device da850_evm_tl_leds_device = {4 N2 v( q+ X* z5 _- g; }
.name = "leds-gpio",
) ^) \: K+ R0 A .id = 1,0 L* P/ T' m i- s A/ Y( ~
.dev = {/ z4 J8 x8 \' d* {
.platform_data = &da850_evm_tl_leds_pdata,
/ o; E4 w8 v. Q' ~* E .release = led_dev_release,
% Z! W U+ g7 o# }. A$ b }
( O/ R: | A# w, K};
5 o/ J* |! d4 w, `5 {; G( z- H) U! l' `% K' ?2 O
static int __init led_platform_init(void)0 o! G& }1 `$ j5 Y- T! L7 ~
{$ F* k' j0 ^$ j5 E
int ret;
$ W# Y- ^2 p8 G8 R#if 06 q2 X8 n$ c: E5 H, ~7 u: @- l
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 D4 a) o4 \ B8 ?' T if (ret)/ |% ?5 I- i- ?9 c" Y
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 I* o, N6 |5 Z# k" q- g4 V s0 |
"%d\n", ret);; v$ i5 e( g1 P' F/ F
#endif
$ F, \7 A1 k3 E4 n ret = platform_device_register(&da850_evm_tl_leds_device);
5 K# G8 V; ?) S+ d if (ret)
; j1 x0 c% g* F' e% ^2 N pr_warning("Could not register som GPIO expander LEDS");
3 Z; J7 g* m$ T( N8 ^$ M; i( c/ w6 T else
u; J5 T! x4 ]( Z O# }, c printk(KERN_INFO "LED register sucessful!\n");) T" }; f$ I) J6 M
. g' j# b c6 m+ k4 ~0 ] return ret;
% Q$ I, X1 L! z' n4 Q7 \}8 }; }: J+ ~1 U. g
6 J$ W" O5 v1 ~* _4 W" mstatic void __exit led_platform_exit(void)6 y2 E4 H' ?9 g Z/ U+ s G; H
{5 s' q: @9 y7 J! r
platform_device_unregister(&da850_evm_tl_leds_device);
! l' G6 h7 @1 B2 e6 ?8 R& f
( g8 }. q+ G+ R7 ?" s2 e, n printk(KERN_INFO "LED unregister!\n");
4 U8 {" Y" K$ _( ]+ t. e}
# b- f/ E4 G; R1 F$ ?$ ?
, V- r% N0 {( y1 V# T0 e6 N" wmodule_init(led_platform_init);
) M! K1 J" G5 ^" c' S u ymodule_exit(led_platform_exit);) _7 A1 h, F+ t6 D; S" a u) ?' }
& G2 J' }( f% A" b" u: I
MODULE_DESCRIPTION("Led platform driver");' o4 c8 F5 v- ~( Z
MODULE_AUTHOR("Tronlong");) b% Z# v# ^& e7 h; I+ e8 \ J
MODULE_LICENSE("GPL"); W; j3 ]' a. X- a- k. b
; @/ a- A: ~ h2 j |
|