|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
1 N3 l, g( y# |0 G#include <linux/init.h>
7 r4 T$ q0 {8 L$ z# _6 M#include <linux/module.h>* ^! C% t* W7 a# [" P' H
#include <linux/kernel.h>: X( k* X+ B" L0 z
#include <linux/types.h>
- {% Y/ b. K$ g2 H/ f1 C G#include <linux/gpio.h>
0 R6 b. K c3 [, J- a/ w7 R; O+ m& R#include <linux/leds.h>. b4 y2 ]/ p7 U" S) _5 g2 r: v" Y
#include <linux/platform_device.h>3 x" }% \' Q- C5 m
8 d2 i' B. l& R; B2 Q" v3 Z#include <asm/mach-types.h>
# }# P) F j2 h6 {( J5 a' Z#include <asm/mach/arch.h>( m" E/ X* L$ I' [" P
#include <mach/da8xx.h>
6 Z3 G8 o" _* @& B, V1 I1 d#include <mach/mux.h>8 z' H. O: N" H9 k9 r C3 ?
& ?1 W5 {" O `% P& N r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)1 b9 }$ F+ j R3 u3 i
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 [ s+ J6 Y7 L" `1 l" n+ X; p#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)) r6 a" K8 @9 h( H) W
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2); `8 u2 \1 C( ~# C9 N
" J" \+ Z: z; r+ E/* assign the tl som board LED-GPIOs*/
6 t. ?8 F" v' q) C# N. B; g2 bstatic const short da850_evm_tl_user_led_pins[] = {
8 F" N4 R8 s0 [$ C0 f) d3 r+ k /* These pins are definition at <mach/mux.h> file */9 s' G9 G) ~( a; q& N
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ Q6 B) ^ h* v( o' s
-17 C0 d* @& \: ~* E7 Q9 J+ D: U
};+ ]: A% D3 t0 e3 m
$ W) }2 B* u7 g5 Q; |$ V4 e, o- a
static struct gpio_led da850_evm_tl_leds[] = {! j8 D$ j2 u0 W' ?) {0 J; b2 S* i g
{
' {. Y2 l0 r* `# W ~, O .active_low = 0,
+ }/ P* J1 @* v& A4 Q. h .gpio = DA850_USER_LED0,$ e5 ]- Q& L, r# d+ j
.name = "user_led0",
+ g( F. s8 g' F# a .default_trigger = "default-on",
1 l7 R p- K* N },/ R, C! K" e6 @8 O
{4 v6 c* X. f6 q0 C( n# B* z
.active_low = 0,( B2 |- W/ \- w$ a7 M
.gpio = DA850_USER_LED1,( d1 M1 `, |1 Q& n- D' y
.name = "user_led1",4 o$ [1 H9 i* i% s3 [
.default_trigger = "default-on",
" }( B+ Q H2 _1 J; C+ Y },
$ {1 o% \9 h- G+ G8 j2 m$ X {. p0 y6 C1 t: E: w C" i5 h- _
.active_low = 0,2 {) r0 ]+ p- I# M+ `7 ^
.gpio = DA850_USER_LED2,) B5 z; ]0 r/ R% E# B
.name = "user_led2",
. q1 ~8 f, r- N3 n. t! K3 Y; { .default_trigger = "default-on",
7 |8 Y0 X: u' ~% }0 z! R },' `& r. J0 \/ ]- ^2 @& l8 L
{9 U7 A1 x+ O4 S; \
.active_low = 0,9 q# q& ^$ u' m9 s, J
.gpio = DA850_USER_LED3,
5 t% [0 `( E# m8 C) s5 s .name = "user_led3",
2 j# |2 x4 Y) R+ u# f. D$ [& [ .default_trigger = "default-on",
! ~& _2 s% c2 E3 d: J( C },
# j Y5 \; b0 U) G};2 g2 ~8 X i8 Z3 f# N
" }& a2 E0 a* G# P" |* ~1 Zstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 L4 n4 P% L" e; j .leds = da850_evm_tl_leds,- T' i3 U* \' p3 W: t' D0 p
.num_leds = ARRAY_SIZE(da850_evm_tl_leds), r. C6 _) p; Q+ L$ j) N* `2 D! Y9 E
};
9 H- m3 ~6 d. I5 _3 X. O
4 n- f7 g9 g' O! [, C. p5 N4 {static void led_dev_release(struct device *dev)
3 g' z& W$ j1 K2 \# ~{
' J3 j. X/ b) u4 }};
! @- B6 i6 d7 U: T/ _0 ?7 h5 g& j) R3 }8 Q* {: n
static struct platform_device da850_evm_tl_leds_device = {- |, N! p; X( E$ i8 n$ J
.name = "leds-gpio",
D. T, x0 r( ~2 q: G$ K9 F .id = 1,
0 e. t2 K, R/ l6 f .dev = {( c) u, y0 o& G/ k+ C; X
.platform_data = &da850_evm_tl_leds_pdata,7 B7 N" A r* p+ W' n* g; ?
.release = led_dev_release,
$ j8 n( i9 W$ D% m, s# F4 } }- c2 x7 Q1 z" f, o% C$ ?1 \9 N! T
};
4 W! P% c$ F- \/ v7 q7 L! B
! \3 [, q3 |3 f' C. s/ |5 C1 Q/ u* S4 pstatic int __init led_platform_init(void)
' r6 H* ~8 y3 Y u{
8 j. K q5 x d9 w, ]3 T int ret;" y' P2 c4 B. Y! |
#if 0
7 a. I S- ~% s5 u ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
" k6 q$ [) c) g& U5 m if (ret)# A* ]3 l; L& }0 E
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
- m& A7 {3 T2 }0 }; e: F* H+ K "%d\n", ret); c5 {2 F! g/ v
#endif
2 p7 l; G: y( |% p* N; _7 y ret = platform_device_register(&da850_evm_tl_leds_device);
- w+ z; A) M# I8 {! ], ` if (ret)
" b+ G! V. O% L( o9 R) H1 `% u3 g pr_warning("Could not register som GPIO expander LEDS");
c1 S* a, A6 V+ v% i2 [, n else& f4 x( q- g" |
printk(KERN_INFO "LED register sucessful!\n");" o( Y- G+ D/ L
* L" Q' ~' p- c0 j+ k) B' H
return ret;
6 _3 r1 ?5 @" a. w# p0 o/ |7 I}
# C0 z% n- A" d9 k, i4 N Z, w( y' m; \7 ~% q" I p2 ]- b
static void __exit led_platform_exit(void)
1 Q" R1 s4 T8 i/ I5 e{* a: P# a4 Y" f- K) t( s D$ Z( r: g
platform_device_unregister(&da850_evm_tl_leds_device);. C. ~: X0 I$ J
( A7 x5 y3 N- O' d/ ^$ ^1 j printk(KERN_INFO "LED unregister!\n");
: ~' ^6 \3 }& a2 L& a; R}/ r3 m# V, d" |: A' I
, Q ]6 M) E& ?8 {' @. U! k, V
module_init(led_platform_init);
( i& D# u+ z, X; V% Q1 e/ P6 Imodule_exit(led_platform_exit);9 c( Z# w5 h3 ~7 p H f. Z
" G+ ^: G7 R, q) @MODULE_DESCRIPTION("Led platform driver");
4 O3 J, ]8 v* x, E2 @ CMODULE_AUTHOR("Tronlong");9 m* c6 U- A% m- n# m9 \1 ~$ w( r1 Q
MODULE_LICENSE("GPL");
& R0 t0 b/ k9 C5 ?" K& @4 z( Q1 X- N( y2 C% N( d& _
|
|