|
|
求大神给下面的程序做注解,请稍详细些,谢谢。$ X" o5 V1 D1 k6 U
#include <linux/init.h>3 ^" }0 ~$ S9 x4 S+ `# v) e7 f5 D
#include <linux/module.h>
' e9 S! ]! X0 O( _8 D' o/ X#include <linux/kernel.h># z, y# ~9 Y" [
#include <linux/types.h>
* X2 n' @$ O. M/ K P: @3 t#include <linux/gpio.h>
7 s* t0 N6 W% M7 m: ]* M; I#include <linux/leds.h>: H- c) o5 C( Q. k/ H! k( L( f
#include <linux/platform_device.h>: R* c, y* z8 `8 a+ \& q( m
2 Q* X0 Y5 H5 }
#include <asm/mach-types.h>9 y* d b* L7 T9 h: ?+ f, k
#include <asm/mach/arch.h>
( m" k: m/ Y4 E3 P6 }$ M#include <mach/da8xx.h>8 ]5 a# s( q: V' m1 H* a
#include <mach/mux.h>
# x. d5 R6 J; \* f+ h% g: M
9 }0 _* r' d1 ~0 c' A) G% X+ i#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
' ]: s: S' N1 u2 T E8 s1 H#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' x3 ?# \* ^( d" {4 `2 L
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
. X r! J) `. V- T! Y+ p z#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# m/ K$ P7 g" _0 y6 l% J+ P& v
" y1 F* I: N# v: d- W/* assign the tl som board LED-GPIOs*/2 j4 W/ r2 a/ J Z2 n
static const short da850_evm_tl_user_led_pins[] = {3 x& S! P+ i1 K4 Y7 W/ ?
/* These pins are definition at <mach/mux.h> file */
) p& ^: p7 H& F- F9 |& j: i DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,6 P* S3 W5 Z: Y0 T- [- h& s
-1
4 |' D- ]! y9 g};
' o2 n7 u4 Y2 |3 d: I! L& V' _2 A# E! C+ }6 f# L: x4 J
static struct gpio_led da850_evm_tl_leds[] = {2 d3 w( u9 ~5 W3 ` o
{
3 O; U0 z, G6 a) n1 Y; W x6 Y .active_low = 0,
: Z6 a$ a6 @2 f2 Y. h' \# W .gpio = DA850_USER_LED0,
' _: P1 l0 Q* B: a .name = "user_led0",
' m$ @( m, ^- u .default_trigger = "default-on",
8 {5 f8 u% c% e" a( S) I },4 q0 B5 n) M( M. @# {
{
$ Y1 K7 o5 _3 t9 K0 H/ s7 s .active_low = 0,
7 z& j/ m- f# D .gpio = DA850_USER_LED1,, l3 Q. V6 B \( Q7 _: L) U4 `
.name = "user_led1",; d1 N) o3 n5 P2 n
.default_trigger = "default-on",- U1 ?6 X- v: |8 o
},$ W6 `$ \/ {4 O0 ^
{
( {8 A2 J* S9 R# Z9 y7 V .active_low = 0,! Z2 Q9 \* [: k
.gpio = DA850_USER_LED2,$ t1 ^, _3 p3 }5 C
.name = "user_led2",9 D1 x0 ~1 k7 ^6 Q, a R
.default_trigger = "default-on",
0 x! \$ E) Y# [/ j" k6 e/ d },
6 z/ [" l* @! z5 l {
6 S u) {/ G+ [7 o2 e( {1 H Z K/ o# ]! p .active_low = 0,
6 N2 K/ M' ] o5 v* ~* O3 b .gpio = DA850_USER_LED3,
; C. N2 X! Y! @. s f .name = "user_led3",. L) f, U1 S$ U
.default_trigger = "default-on",; W; l: r) _3 `8 X0 J3 m2 a
},- N, h& S+ \( w+ I
};
, Q5 s2 ~% H8 e* ^$ }
. w) ?5 w8 r) Y/ s% Istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {2 Q K" i1 g8 k8 x6 f/ z; [
.leds = da850_evm_tl_leds,
G6 k D. v+ _' R! J! A, M .num_leds = ARRAY_SIZE(da850_evm_tl_leds),( L$ Y: ~. N; k b$ `! ^3 l! ^
};; s1 Z' L8 n9 y
) U5 C' p; t8 p$ R0 {
static void led_dev_release(struct device *dev)
" x0 t7 i G9 g+ i4 V{+ H1 z F! n+ ^: U1 F
};4 P% c1 x+ f. i5 q9 u& J
0 Y0 [ W, L! o+ c1 Q
static struct platform_device da850_evm_tl_leds_device = {- z' ^7 a1 V+ R3 `- F# S
.name = "leds-gpio",
5 g7 [ [3 c2 @: n/ U .id = 1,
. \3 E2 b4 r6 W' `- C8 b- d$ Y .dev = {& O' Y: `5 T: u
.platform_data = &da850_evm_tl_leds_pdata,! |* ^; Q, c7 Q1 }1 ?) x7 w0 x9 R
.release = led_dev_release,/ _7 ~* w- e# N( Y
}1 l+ ?/ N7 Q1 ?- g# U# p. D
};
# U. K) t5 x. G6 x# C* u2 S' p7 J, K0 }8 \( ]( v+ Q+ Z- z. P: j
static int __init led_platform_init(void)& t0 d: ]6 l- I8 N
{2 z4 f+ I" S/ [* d! {9 H, m
int ret;
8 d( F: h" h# r! ]3 H3 h' S+ X#if 02 d F9 a6 q! {: o4 V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& a( b+ x, F* V# ~. g$ O0 o if (ret)
3 Y4 p0 x, Z( j; F' u6 |2 ? pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 C$ @1 K; G5 n6 Y5 g7 s6 H8 b/ M "%d\n", ret);
0 }& E3 a) I0 I#endif
' D$ p+ E' N6 [" Q$ \ ret = platform_device_register(&da850_evm_tl_leds_device);
0 K, C6 ~; c' u$ G* C if (ret)
0 \& i2 H2 e# r/ i6 M% D7 i pr_warning("Could not register som GPIO expander LEDS"); X! i, {( g8 o1 v6 W
else$ m3 D8 a( J# o9 D! L
printk(KERN_INFO "LED register sucessful!\n");
1 r% R( ]" u! U7 ~% _7 J1 o9 t+ Z8 a7 k2 q3 @' @& s, x2 [) I+ h% a* p
return ret;
# W& f4 K) e2 X6 y+ K- i( x}
" I& K4 d( R& x4 ^
! c; I9 |/ y; f% Ystatic void __exit led_platform_exit(void)- J k3 R* d/ q- J
{3 I7 J- \% y* Y4 H s5 A4 O
platform_device_unregister(&da850_evm_tl_leds_device);
& a2 k V y5 f" {# b+ O
0 S5 C2 b( N5 P/ s! J0 o printk(KERN_INFO "LED unregister!\n");
# s3 m4 l# R# m4 r, S, A; L7 K. A}
* W& i% U3 K- _1 g( ?1 h. Z E9 j2 q" f. @4 p" F
module_init(led_platform_init);
5 v- }$ j1 X3 H3 k! q% zmodule_exit(led_platform_exit);( H8 H7 T. L1 C: Y5 L+ p
a5 k, m& z& \" w h7 {+ L
MODULE_DESCRIPTION("Led platform driver");
$ w& u! y' L* r! E! x- C8 OMODULE_AUTHOR("Tronlong");
/ W: Y T' ?# Y9 p% |MODULE_LICENSE("GPL");
) u& R4 t0 }- O# J2 J
+ Y$ k3 g; C# H5 R- x |
|