|
|
求大神给下面的程序做注解,请稍详细些,谢谢。4 s0 s9 d- k5 t& R. d. B
#include <linux/init.h>
) t' I3 R# I2 P3 ?# G% ~2 B$ z/ w#include <linux/module.h>
# |6 i' e+ k! O& f6 l, l2 r8 D#include <linux/kernel.h>( Z, @" P/ }( _. i# v: @
#include <linux/types.h>
+ T1 m+ y$ q9 W7 y#include <linux/gpio.h>
o& h$ S- y- _$ ~( B4 w#include <linux/leds.h>
+ k: ]& a7 K6 ~. ~/ i0 |% u#include <linux/platform_device.h>
D" |( Q( s: x! c7 ~- e. _% S0 {
9 d, a; f3 m3 {( t2 e#include <asm/mach-types.h>+ i/ b( f. a5 ^5 M% `
#include <asm/mach/arch.h> e( m( `+ s, F: x9 X
#include <mach/da8xx.h>
: o: G8 n5 Z7 {/ i" O9 a, n6 X#include <mach/mux.h>
) l/ c5 L0 P' X' B
, n, K8 H* n t% I8 ] ]( H3 s#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
- p. ]# i, y0 U( G- B#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
5 C; @) M# h) P, ^#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% [$ b$ ?. ?$ P Z#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)+ u; c; A# m# {- m8 w1 h
: A/ Z3 t; ~, B9 X
/* assign the tl som board LED-GPIOs*/; ?+ F4 H; b# j5 }) j
static const short da850_evm_tl_user_led_pins[] = {9 y# {' ~$ h7 t- {
/* These pins are definition at <mach/mux.h> file */
/ g2 h7 i8 g& ~$ d3 J3 p) v& h5 L( o; v DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,* Q$ }0 ~0 g! }4 l
-1+ b& Z" Q! d& ^$ V$ t
};- D3 u8 Z# Z3 G) D m. {2 K
+ F- m( x+ B6 }% L
static struct gpio_led da850_evm_tl_leds[] = {
0 e4 J2 v% H1 A9 _4 v5 u5 h {& i' Y, X- N* _- o+ S
.active_low = 0,
$ w- C" Z3 x( F9 D .gpio = DA850_USER_LED0,1 `. ` D1 p1 Z, Q. @+ w
.name = "user_led0",0 ^9 c2 B, a# x8 m( c
.default_trigger = "default-on",9 _9 f' g0 G! n6 ]0 Q# _! ^
},
. u! b& O: [2 Q8 y! c {
1 p$ b, o2 J% L5 T .active_low = 0,
% i( D2 p8 @3 ^ l .gpio = DA850_USER_LED1,3 `+ T) C2 E* r! v: u3 A; Y
.name = "user_led1"," K! ~- ~ | I# c6 ~
.default_trigger = "default-on",
' q7 H2 {% d6 C' _ },. o6 S7 `. F/ Y8 p* T. Z- j, f, q2 P
{
( Y, G5 b% N, V: t' s: Q .active_low = 0,: o6 B+ Y1 J8 x6 |
.gpio = DA850_USER_LED2,) y2 W: W% L8 l' H% W
.name = "user_led2",) U8 V; z1 K' c3 a
.default_trigger = "default-on",3 @- V" ?5 J0 W
},
. }$ o& p( B% @ {
6 v; V0 F6 }5 A( i .active_low = 0,
, R: v9 A! _9 | .gpio = DA850_USER_LED3,0 O! T s* Q1 I( U( E5 V
.name = "user_led3",: K+ W$ Z% L2 H u/ d6 C0 C' X
.default_trigger = "default-on",8 p; ^& p% V5 Q$ |6 j
},# [/ z7 q$ V! l7 E' K
};
; u% _9 W9 g# `; ^, E
/ j0 {( n; q( p* _4 s A zstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {4 X+ T! v: l/ v5 i$ p0 G$ G
.leds = da850_evm_tl_leds,% N7 y' {3 O6 Q8 G- B% a
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
: A* `6 s! C. l- G$ c) q$ R};
7 N9 Z7 l# K M3 _4 R
% h( J- V" x$ p5 R* o" A+ Rstatic void led_dev_release(struct device *dev) T4 v/ [; b# @
{
. S( Q9 P5 G( T( b1 e) s& [};: Z' M* z) a' s& \" i8 {9 U1 @
0 L. _, ?* c8 ^static struct platform_device da850_evm_tl_leds_device = { v' r8 o0 k5 F; r
.name = "leds-gpio",
' T9 F2 r/ K- M D5 @6 \4 M. S .id = 1,9 N8 W9 h9 }: ~5 b# z% u/ L `
.dev = {2 B- `# p6 U+ |2 a& U
.platform_data = &da850_evm_tl_leds_pdata,
6 I6 ^ h9 C( b* |. d .release = led_dev_release," x' R$ Z8 |) M( O" N
}
! p' r7 r4 R* ~$ A! [' i- p};" U1 ?* F' k/ `% ]( [: P
* u) {) F& t" E) Rstatic int __init led_platform_init(void)
1 r& C" _5 U# O# z$ I6 w; @{+ [4 D/ \/ x) f7 R9 f
int ret;. v+ Q" X6 w1 m) w
#if 0
) d2 h. Q1 G9 V) I v ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
% Y# `; I. \2 F+ o' N2 N if (ret)% m; A# Z" d8 G% x8 u
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"+ o2 I* N" g) F$ S m" C
"%d\n", ret);
! X$ q5 `2 q+ \, V#endif
( c& ?4 U1 p& j' f1 b" K0 k# P ret = platform_device_register(&da850_evm_tl_leds_device);
4 E7 [5 ^) p5 l o$ }( I* ^ if (ret)5 W+ D* H) @( _# q2 v; u! F4 d
pr_warning("Could not register som GPIO expander LEDS");0 s# u3 W, j/ P9 z' U
else
1 t1 K. d* x+ _8 [; N3 p printk(KERN_INFO "LED register sucessful!\n");
, x; L9 @6 H9 l. ^0 s! T+ O
$ O" j0 z: ~+ i' d5 g1 z" U8 P/ w return ret;% x) _: F4 z& H5 \
}0 D6 U: i4 ]9 f |
0 Y$ P2 V; v, w6 m9 {static void __exit led_platform_exit(void)
+ N/ K1 P( F3 t; ?5 f1 l) O{# Y, T7 O. E3 k( j3 w- K
platform_device_unregister(&da850_evm_tl_leds_device);9 }& r& a2 i" n3 R. }
1 D O* Y' s3 I2 [$ k
printk(KERN_INFO "LED unregister!\n");7 ^" i7 v1 H7 J& l
}
- u6 k2 Y* E3 X" y7 ]2 A0 D0 m! l2 A) `' m% ?( L' e
module_init(led_platform_init);) t2 { g+ \% E- K3 a
module_exit(led_platform_exit);
! M# r- T6 A# h; x2 W
$ x% H$ o* w) K( r% {$ n* IMODULE_DESCRIPTION("Led platform driver");2 K$ @7 r; S( o3 j
MODULE_AUTHOR("Tronlong");
! C$ U; V9 V, I8 P- d0 LMODULE_LICENSE("GPL");+ @1 m/ ?6 N+ H" h
( a3 u, B, M% k
|
|