|
|
求大神给下面的程序做注解,请稍详细些,谢谢。- q- k( f3 g, Q- V+ y" J C3 I
#include <linux/init.h>
# g7 O( x) L0 |6 ~/ v# J#include <linux/module.h>
* w2 h& z7 @0 U3 Y! k, d#include <linux/kernel.h>) R( D, x9 y F: d2 E& H
#include <linux/types.h>% N. u; |0 I: j4 J4 r6 E; O' R3 G
#include <linux/gpio.h>
f$ L* }) s: ^1 ~ x' D/ _#include <linux/leds.h>
0 q1 }" Y1 z3 J#include <linux/platform_device.h>; z7 N5 q& u9 q
) C1 E$ l; h ]1 T
#include <asm/mach-types.h>: _: V% } o5 w' v5 v+ L8 k
#include <asm/mach/arch.h>& i: W: Z5 v% |
#include <mach/da8xx.h>
. [& `" c. o' M2 ]0 j! e3 w#include <mach/mux.h>
$ Z1 b8 Z& V' Y# @: w6 ?: Y$ ~7 r, U+ K: @" P
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ F, H, @. a# j% C. B#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
2 f, w1 ^8 e. x#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% i, \% C9 F y- ~. Z. V g#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
6 v/ `9 U) S% R% Q0 L+ S$ Y9 H, c3 i/ i# u8 d, {
/* assign the tl som board LED-GPIOs*/
" b" e5 K% H$ F, u* ]& _* K2 Q. qstatic const short da850_evm_tl_user_led_pins[] = {
' W3 ~6 ?/ h7 a3 z7 C /* These pins are definition at <mach/mux.h> file */
' D: k1 G( p U: j `, _, j$ g6 B& V DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5," z' E% t/ n2 g
-1$ {8 W9 E1 r8 F3 m, p7 R5 C
};3 Y2 }3 J" L N; b" H+ b3 i
?5 U1 H" y9 ?
static struct gpio_led da850_evm_tl_leds[] = {
: a- Z6 x2 [, w {- h9 s0 R" W3 d! o9 T' J
.active_low = 0,9 ]8 G/ \ v; W1 N1 V/ T+ A3 U
.gpio = DA850_USER_LED0," |& L9 B- I) y! v
.name = "user_led0",9 ~3 V6 F1 D$ q$ L
.default_trigger = "default-on",
9 w4 V0 q$ W+ ~+ @# W" J- F },- q6 R7 R& l3 n6 y
{- K' B) k: @" h* m
.active_low = 0,
1 i3 X5 r+ g( y .gpio = DA850_USER_LED1,
- U; k" C P( t5 a$ ~# R .name = "user_led1",
4 X: n- L m' l/ d7 F' t. x& ` .default_trigger = "default-on",6 r" {4 N7 a; W, L/ |, `" l$ n3 h* b" U
},9 f& h6 w* m1 J- g: ]
{
+ A+ w8 t; L" K, E+ x" u# Q' Q .active_low = 0,
8 S! Q7 \ ]) n .gpio = DA850_USER_LED2,
1 I8 Z/ p7 C7 L9 h, F. K. k .name = "user_led2",0 y; S3 c1 ?0 i0 i& j
.default_trigger = "default-on",
; o; |) H4 c) d3 H5 k) w8 X* E },6 U3 Z% p" L1 q' W' X" H
{
- t# ~9 \& v; ~' }/ A& m; N& M& d .active_low = 0,
% R# O3 l( k6 o0 I .gpio = DA850_USER_LED3,7 } m3 |+ v, P4 l: u1 Y( p- x6 C2 q
.name = "user_led3",, S5 v0 u2 |8 d- B) Z/ p) _' Y
.default_trigger = "default-on",9 ?& F" @6 M' `2 o
},; p- I$ m% q- L& K
};# v2 S2 m4 R/ q7 f& d" e8 d
8 O6 m% Q3 C' `" fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ t" Q8 J6 z6 _! v
.leds = da850_evm_tl_leds,
9 n+ h+ T* t+ ?" _- B/ x% R: D .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. j1 L% `; l/ R+ Z) t};0 Y: }: Z4 _0 h) W
& {" b& _' S6 o- [
static void led_dev_release(struct device *dev)
7 S' ~0 f7 I6 f; x& P( t9 U{- B6 C: M0 o* b$ g2 L- O5 a
};6 j9 s( R7 M2 k
3 H( M* o7 u* Q9 W3 i, v0 i
static struct platform_device da850_evm_tl_leds_device = {2 g, @3 `- z9 ^1 N; T7 _
.name = "leds-gpio",
8 B, K' G- R; n% X' r ^ ^ .id = 1,
7 ^' U9 }) @! ` .dev = {$ w8 M1 y. f5 B7 j0 F" p& E
.platform_data = &da850_evm_tl_leds_pdata,: `! Y% v3 b# `" p1 I7 ?* Q
.release = led_dev_release,
; a8 U- a0 g/ J( P) I }
) [& E! f) t! r# G" q2 u8 v};
& ]# B% m0 S" ^: y3 k5 J. N# \* a& S' B; L
static int __init led_platform_init(void), R9 f7 T0 K, j
{
* a, F4 k( j2 _! j+ W) D int ret;* q- C, H O- v7 x8 L
#if 0. v# G! t3 u6 M2 Z, G
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
% S7 K- `1 ~' E1 j# q5 x if (ret)2 R8 I7 A* n0 T( v: D. {
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
$ s+ b) q0 `# Z; y/ v "%d\n", ret);
8 g3 U/ K& J, j+ k, d# t' t#endif
& z! Q6 ^) o4 d: F. @: `5 U3 V ret = platform_device_register(&da850_evm_tl_leds_device);
( p9 B+ E0 s5 j! S- r if (ret)
0 O6 {; S: N \1 Z pr_warning("Could not register som GPIO expander LEDS");
: }4 ]9 @: |# z/ N else# r& z# r5 a' K, r
printk(KERN_INFO "LED register sucessful!\n");$ x- v% g% d: l
9 H$ S7 b& m, a& r. N3 _* f, [ return ret;
7 E- v7 S! O/ O7 Y% ^- M}
0 C8 l1 L1 q% d |# j3 M: ?
( ]2 f. S7 W8 }3 M7 jstatic void __exit led_platform_exit(void)
# |% a9 ]/ E. S/ |8 R{
+ @' ?7 ~1 A. ~( q platform_device_unregister(&da850_evm_tl_leds_device);
f/ S9 z# i8 G) }: c$ N% w4 A( R
$ p5 \5 r: U0 G6 n: j5 e8 I printk(KERN_INFO "LED unregister!\n");
9 h' m) r; I+ W) I( c}
" v" C- D7 L2 ]9 F& [" B
& U8 f& @" k. X+ I+ ], j H2 imodule_init(led_platform_init);2 }$ C# [' `% U1 r# @0 W+ w
module_exit(led_platform_exit);- e* [6 n8 p: M# v( P7 ^
8 {) J$ D! n/ U3 N# A( D& Y+ I
MODULE_DESCRIPTION("Led platform driver");
' g$ l0 ]& h P2 ~MODULE_AUTHOR("Tronlong");
$ r" a4 G: K$ r6 Y4 T) tMODULE_LICENSE("GPL");' o5 b/ Z: n" V) B3 B( I
; o6 N3 ]1 j3 H: ~& i6 T. ?
|
|