|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
. e$ F% k! V v3 N1 a4 C#include <linux/init.h>1 o* \' d: y! `* P
#include <linux/module.h>* O) ^3 s9 f5 ]: d4 P$ i
#include <linux/kernel.h>
' i2 t- U1 g7 ?' s#include <linux/types.h>
s- n/ t* j# M( ?2 \& R#include <linux/gpio.h>
+ [) T8 x H( b+ G. n1 Y#include <linux/leds.h>
- p* z$ S, t- w2 [#include <linux/platform_device.h>9 b- N& \. t0 K, s i, `2 V B9 t7 p0 e
5 }5 M# Q, f* }/ H6 G8 Y1 F: S
#include <asm/mach-types.h>6 P* v# o2 L; u: E
#include <asm/mach/arch.h>0 i6 ~$ A; H7 c% z
#include <mach/da8xx.h>5 c7 z' X- z0 s
#include <mach/mux.h>
n4 F5 b8 X- n q
~" `) K) K4 ]" A3 l# Y; \- c W#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
5 D7 P }- P: {#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
8 X! Y' S3 Y( y) J4 @; P) ? q5 y; Q#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
|$ w0 R% c1 _- r/ M( d#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)3 I1 O, K* k1 L! L2 ^7 I. r! g
' h6 F7 n) v3 L- l
/* assign the tl som board LED-GPIOs*/; \. O) S3 h; h/ v) n
static const short da850_evm_tl_user_led_pins[] = {
@3 w, W% I) Y$ n! o /* These pins are definition at <mach/mux.h> file */
6 p: n% T( W5 D$ P" U DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, v9 U4 }- ~# {3 x' C) F
-1: d; K5 i: m/ M7 ?
};
# X) O' `/ B, U6 D
, }. D% I+ o8 d1 \/ W; hstatic struct gpio_led da850_evm_tl_leds[] = {
' x: `& ?" o9 I8 ^* g {
0 D: Y9 W" R8 P2 F5 z. v .active_low = 0,
I3 m+ T( ` e/ F, f0 M& k .gpio = DA850_USER_LED0,- V+ p5 U, M' V2 N, g
.name = "user_led0"," s, q+ r% I) H% Y
.default_trigger = "default-on",- c: m$ f7 k0 i# m% }
},) M' w. B+ J% {9 z% }2 X
{- G% d p% [+ X# t
.active_low = 0,
2 L' S" V1 K1 N: X3 t% {3 g: N .gpio = DA850_USER_LED1,
7 |5 W! m, s, b8 W* p .name = "user_led1",
" O+ H+ f1 I, p" W0 w; v9 S .default_trigger = "default-on",: e& F6 Z" n4 e( p6 D6 |8 Y
},
4 d x$ [# N& i2 `/ o( h' X0 J {
8 Q0 f" S* ^5 a .active_low = 0,! @2 k) |) F6 \6 d
.gpio = DA850_USER_LED2,
9 x5 m( P A8 W7 u1 N* Q+ \$ T .name = "user_led2",# G( a) b! N6 R4 ?
.default_trigger = "default-on",9 _1 I2 l- U+ r! z: q
},
6 Y2 p6 e4 r6 Z5 h' v {
' f+ b8 h. p3 p4 }# o5 f- h .active_low = 0,7 A- m W) u* X$ n/ F) J7 @
.gpio = DA850_USER_LED3,+ Q n. g! p2 q! ^' t& a$ P8 c
.name = "user_led3",! p: P4 P, u& |! p
.default_trigger = "default-on",
1 {7 E/ H. l- a( {0 N o ^! w },0 _8 S2 m( k1 B7 \
};
/ Y* e8 p$ N( Z
6 Y3 T" T) |5 L" _6 b1 Mstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
# p9 g1 _3 j2 O5 q; Y+ j .leds = da850_evm_tl_leds,# U1 W$ D' t& w0 J8 \: w# K
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 G+ N8 o H g4 y! L};4 t, A. e/ o+ c+ c Q
0 }- S ^8 `4 {" E6 N8 S) [static void led_dev_release(struct device *dev)9 x. |2 ~ N& s/ O1 Y
{! s2 m* e& H. h$ _
};
; d3 F3 Z; b; \$ _$ G
! j4 e( a: h; U& w( M* m$ ~/ m! y7 tstatic struct platform_device da850_evm_tl_leds_device = {
. W; y! D' m$ W0 A .name = "leds-gpio",- \" W4 S. v4 S0 r; t; D
.id = 1,
$ V8 `* [& _- ?# R8 |- T .dev = {
$ ]# Q7 Z, R+ F* `' f- J .platform_data = &da850_evm_tl_leds_pdata,4 G1 b) O5 M- ^. P) \$ l
.release = led_dev_release," P* ?# @5 T2 f- e1 W' L
}4 P! E4 L y b+ e4 V& ?
};7 D" i# l; q0 x# w7 l! l* ] |% h
4 J/ p3 v9 M: K7 N; rstatic int __init led_platform_init(void)5 s o0 F) J; o ^& c# l
{. k) f9 {& f+ X" i& `
int ret;$ @# l! p- J* C7 Y; M" q/ H
#if 05 o" B2 F& F+ C. j6 U
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);% K; ?1 h8 T9 e I( r* G3 N
if (ret)
3 `0 V+ R1 h4 ?0 F: c) c3 z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"- `1 p) K5 V8 t& q- g4 F
"%d\n", ret);
+ r @+ L8 N2 X2 m#endif. A+ g. @! p: J! @
ret = platform_device_register(&da850_evm_tl_leds_device);
1 Z5 y/ T8 `4 w* w if (ret)2 ?2 D8 [; f& l- K, u. ~$ Q
pr_warning("Could not register som GPIO expander LEDS");8 n- ~- V+ P7 n" p, Y N3 N; Y+ N
else
y4 f: X4 [8 s" C9 ]. P: \ v printk(KERN_INFO "LED register sucessful!\n");
U0 F* T0 D$ _' W0 y7 N8 L; O+ `! v. x
return ret;+ Z0 |9 L7 I9 J& u
}
/ C6 u: R3 i& l' l% c
! q- G% N. W# Q* s5 ]7 {+ @' E- g. Xstatic void __exit led_platform_exit(void)" e$ a- }- B" p2 @
{
+ r# ]* h- w# S# J. u3 u+ Z+ i platform_device_unregister(&da850_evm_tl_leds_device);
- J0 { q, t6 p; L
8 r/ H& _* M; A- b printk(KERN_INFO "LED unregister!\n");
" k% M6 Z7 {6 b, O' Y* c6 `}' ^/ ?9 g1 {- E) n
7 }% |. Y2 G, `% u4 V. r
module_init(led_platform_init);* s2 G' w( `& w X }% z. p4 n
module_exit(led_platform_exit);
- H( W) ]0 M. A1 r' w) {& v, _: ?# ~7 ?, C7 M/ Y
MODULE_DESCRIPTION("Led platform driver");
" |; _$ ~) t) E- r. B e: `MODULE_AUTHOR("Tronlong");
) X3 \( B+ n) H1 rMODULE_LICENSE("GPL");
% ^, W% j- r, I
5 n. [2 R) i! |% R+ @% T5 k |
|