|
|
求大神给下面的程序做注解,请稍详细些,谢谢。 I& E' k6 b8 F) [- o. M( z
#include <linux/init.h>) L4 a. b% O: u1 a
#include <linux/module.h>
0 n7 T: V) F4 {+ y) \#include <linux/kernel.h>
. I6 e& M& R3 W5 p#include <linux/types.h>9 S0 H7 `. e+ c. V& r. @
#include <linux/gpio.h>
) l1 T2 W& C. a. T: V# }0 |: Z0 M#include <linux/leds.h>9 p* Z% E' [$ r# \9 u
#include <linux/platform_device.h>. M' X2 P9 P/ e$ J6 s) f9 x
- W$ R2 w+ ^7 ?$ |7 g4 n' g#include <asm/mach-types.h>
& Y( D) i+ Q. E#include <asm/mach/arch.h>! g$ z4 E a0 A+ t0 I5 Y) s
#include <mach/da8xx.h>
, e4 b8 W1 ~# L. {7 a9 h" D: M4 Y#include <mach/mux.h>' {/ ?1 M- k: O# E8 [1 T( C3 N' i. y
- R" L) W4 [+ k3 r5 |* v6 v#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ t4 X+ D# Q Z0 y" A% S
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)- S6 q6 R" X4 z# N, P3 j2 D
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
$ X. q' J: X h2 Q7 ^, x5 E#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)3 L, o( J# S6 G& { E8 \) y) V# L
& _3 r+ U* [1 T8 \4 `6 t: j/* assign the tl som board LED-GPIOs*/$ t& V( W. ]( E+ y. R* w
static const short da850_evm_tl_user_led_pins[] = {
{9 I. B/ \6 a" @1 x8 Y /* These pins are definition at <mach/mux.h> file */4 ~8 C0 V# m) z4 J0 ?- P0 Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,* A7 h# w1 P! Y/ p3 t6 B
-1
1 c0 r' t3 n. F" ^, B* O, N5 Y};1 {; o8 x" X6 P$ K
$ X' V! k$ p9 W" \static struct gpio_led da850_evm_tl_leds[] = {$ r4 P# e% V& X, ^* a3 y4 G
{8 _8 T1 W# S8 F
.active_low = 0,0 z$ a" y, g* t- ^ _
.gpio = DA850_USER_LED0,
5 }: x) ]* E& q5 F$ I) Z5 J .name = "user_led0",
: c5 k4 B( ?) ^8 ~) S+ m+ N .default_trigger = "default-on",, V% y7 L( c a
},9 ]8 ?1 t" o2 Q' b( X( S; R6 n
{
3 l, l1 s V0 J .active_low = 0,
. `1 N3 K3 Y+ x% H {' L4 L8 }' y .gpio = DA850_USER_LED1,
! v& E# F1 v2 z% x0 `2 K .name = "user_led1",
( D" u0 C: C( P. ^" f .default_trigger = "default-on",
5 v; d7 g, r$ K. f' Q },9 L8 [* X/ B* M% c" p" J/ x
{
9 k8 @* u2 ^) ^/ Z .active_low = 0,
; N# _% H" \ R+ x .gpio = DA850_USER_LED2,/ J$ m3 F u v4 c: L
.name = "user_led2",1 V! w' N9 R- O9 s
.default_trigger = "default-on",
* e0 O ?9 f: [8 }' |/ }4 J _6 M },
' n7 g. f( M" _ {
3 v+ v' k$ o7 i. Q .active_low = 0,. f7 o% y4 v( A9 p$ W1 J' q7 [
.gpio = DA850_USER_LED3,
' f, R8 y7 v- ^* R' E0 U .name = "user_led3",5 X+ S, W* J" z, J) e" Y
.default_trigger = "default-on",- F0 W, {6 z7 I) S( `0 p' L: z
},
4 m* v+ R$ U& r};, m1 U3 q/ `& {9 s
- O( y9 `8 c8 I2 k+ h, W
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
8 Q/ ]! {7 `6 E4 E' L .leds = da850_evm_tl_leds,/ v% Y: p8 F% M3 j- |5 e R+ u
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),# v$ K' K( S. F- `
};
" z( Q' @3 W8 U8 W5 ]. t
5 u/ B4 X4 i( X% t) Ystatic void led_dev_release(struct device *dev)
6 Z8 w* O$ o- g3 L! ]{
2 L1 Z- y5 I! f1 c7 b, r( `( U [};
# k) R, @! ~3 L# E* E, M. v: M
0 r5 l, r1 K6 B/ Rstatic struct platform_device da850_evm_tl_leds_device = {2 v7 i3 I' v4 H5 R9 M: o, R
.name = "leds-gpio",; h9 U x' L/ d; A
.id = 1,$ S7 t1 Y* s* G9 i
.dev = {2 _$ K! A' P2 Q! w. d3 @# }
.platform_data = &da850_evm_tl_leds_pdata,
+ f% A C: m/ o1 n1 z( M( f: W .release = led_dev_release,
3 k1 a/ L2 E# J4 n }% {1 k5 i7 ^' H1 e6 Z5 |
};
3 E) a/ x& L3 P4 E2 e& D8 ?* }6 |
static int __init led_platform_init(void)2 c, J3 z0 b3 [5 Y. w
{
6 x- D) j( ?: V# S# R5 W8 X* k int ret;
- _& Z. V# H1 h) i: I1 C#if 04 ]8 X1 b4 N& q% u/ p5 `$ P
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);6 ]# _# F* K w; r
if (ret)
; O1 Y# W- c+ Q$ Y2 K pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
. {9 w, z& ^$ y6 p6 p "%d\n", ret);
( ?) N% N# s6 Z. ^% A7 J5 }7 i: }0 R$ S#endif5 \0 k0 i2 S+ T; k9 E
ret = platform_device_register(&da850_evm_tl_leds_device);( A1 m9 {. e# R/ n7 F K
if (ret)
7 f) J4 k7 n$ D: L& Y1 T3 S pr_warning("Could not register som GPIO expander LEDS");
# ^2 c$ m1 x: v3 i8 l7 l else
$ R. `5 [6 [$ y" M- i printk(KERN_INFO "LED register sucessful!\n");
" X, X$ V( Q) i
: l# Q9 \! _/ {* x& P% \ return ret;! }/ T; p# E6 L' _
}) s4 } Q, X& n, r' ?4 i' X# Y/ D
$ g, H: P9 e; t$ ^3 U/ }4 W
static void __exit led_platform_exit(void)9 V, h2 X1 I/ y: V2 \
{
8 T1 }& j/ Y# D platform_device_unregister(&da850_evm_tl_leds_device);
0 d/ {0 J4 T4 x
3 z4 @1 r% \$ ^7 N6 W printk(KERN_INFO "LED unregister!\n");7 B+ D* `0 `) O4 u' p5 d: {
}( k2 ~! H& b1 [# h: M6 M
) Z' n9 L$ j0 f/ I. ]# e: w, kmodule_init(led_platform_init); m( Z; q/ A+ T5 X- A
module_exit(led_platform_exit);9 I. u) N$ o8 a* b! L
; r2 D6 R* S& `8 l" M
MODULE_DESCRIPTION("Led platform driver");
( D# B- ]1 B: nMODULE_AUTHOR("Tronlong");( A. {; w4 b1 q% Z
MODULE_LICENSE("GPL");
+ q+ }/ W9 h* N" k( B" T2 j( N# X, @+ ]& n. E" h) L& g* |
|
|