|
|
求大神给下面的程序做注解,请稍详细些,谢谢。& w0 s5 x0 M& n. [
#include <linux/init.h>
5 J5 _! h; ~4 Q9 I. `7 V#include <linux/module.h>
) y+ J2 U- E. X% B' h9 }#include <linux/kernel.h>+ J2 y5 Y3 \* X5 P2 U
#include <linux/types.h>
" C0 a+ i( M' p$ c#include <linux/gpio.h>
. h$ k" _1 |1 C/ e" u#include <linux/leds.h>( M" O# Q. _; x
#include <linux/platform_device.h>
8 t: d. }0 _% M* a' u
; _9 ]2 V2 A. s' j4 M& p6 i#include <asm/mach-types.h>
0 n9 Y4 C3 s2 q+ \* H; j#include <asm/mach/arch.h>
: T' z) Y3 d3 a6 u: o" l#include <mach/da8xx.h># N) |6 n) N S# s9 c. ]
#include <mach/mux.h>9 d8 j9 L/ D U4 G* a
; i8 |1 V9 t: t- [" r% R: u+ I8 ~, y
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 `8 ~7 Y* L ]# q; G#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
! v8 Z$ G. R/ q, |4 A; ]) F#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
. Q: d$ h" R* d5 \4 C. {; g#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 R$ `: a. [1 g! Z3 \
' X; d0 L% q/ D8 b0 _& [
/* assign the tl som board LED-GPIOs*/( {% E, x9 C- S# }& A
static const short da850_evm_tl_user_led_pins[] = {
3 I! E6 T7 Y" i) F( P9 J; B /* These pins are definition at <mach/mux.h> file */
^+ x( L" \/ F- O+ p4 x' O DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
1 G! e- v2 O& P( s& }, ~ -1+ D" F6 n' Y1 D h
};' P/ g! b- ]7 y
% ~ b0 @* N1 e: ^/ s" {static struct gpio_led da850_evm_tl_leds[] = {2 J1 o; R' b6 n9 K6 ]
{! p, j9 H3 [, Q# ?6 b: P! `
.active_low = 0,
/ @8 g% w" K2 d( I! u# Z8 i* U; a .gpio = DA850_USER_LED0,2 x/ c5 [4 ~$ g: m, a
.name = "user_led0",; [' d9 k4 V( I9 Y; D
.default_trigger = "default-on",
9 r; ^( N; K# t' W },
) }' s% ^( y! a1 f+ d }% Y {4 z% X" V0 D0 O+ ^ A
.active_low = 0,
3 g1 a& r% ?: }2 h) K! Y7 E$ l .gpio = DA850_USER_LED1,4 w& M6 h0 ]- ]& [
.name = "user_led1",
, a$ t( ?$ {* x) y .default_trigger = "default-on",% Z% T2 h2 u! j3 N) F7 B
},
3 {, i4 t! t) a0 _6 o4 M {
" s' i! @% w, e* S .active_low = 0,5 V" T, }+ i! _3 c1 w
.gpio = DA850_USER_LED2,2 Q! m7 a; Z, |+ j/ Q
.name = "user_led2",+ _/ u4 [& G2 b, o
.default_trigger = "default-on",
2 b8 s1 M( v; |5 Y: [2 @ },: P( f9 c4 X* y; m v+ P* n
{
* Z" D D) B2 [8 Q .active_low = 0, U! p% r) p8 `4 ~7 k
.gpio = DA850_USER_LED3,
: X0 j' I* _9 F/ G! j .name = "user_led3",
3 O% Z/ X+ N/ \" u# [7 {, h4 g .default_trigger = "default-on",
$ I' N( l3 t" n7 O7 j( O },$ O3 n2 y) T# O+ U, k
};- E* ?( x& e! s# Q, v4 ^! q/ P& G q
0 ^( g i7 k; O( p: f- N- C
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* I8 R- i1 m1 J5 Q2 J .leds = da850_evm_tl_leds,
( u4 N4 M0 Q& m9 H! U .num_leds = ARRAY_SIZE(da850_evm_tl_leds), F: S( ?' L& z2 }' S1 o7 x
};5 @( I/ z5 c. m0 u5 M
?' L* K5 d' r" r/ F Z8 [static void led_dev_release(struct device *dev)
6 A' u' Z) X! e5 j/ K8 C{7 v( p* o8 Q8 f& U: n
};
7 ~ g6 w+ @3 s# X6 ]7 P
- n; l) G; t q8 R2 G0 T7 z- [static struct platform_device da850_evm_tl_leds_device = {. F* e6 k& w1 v" Z
.name = "leds-gpio",
/ S H ?+ {% t .id = 1,
& o1 I6 \( k' |1 }! j, t5 { .dev = {" g0 H; H# @& G# k+ [3 W+ s
.platform_data = &da850_evm_tl_leds_pdata,7 i7 ~2 z4 X2 r$ ^+ D
.release = led_dev_release,
! E4 r0 p5 x/ k$ h$ S }
' J' m8 [% a T2 t};
: u+ k' y; I4 B( h3 I" r6 f, G4 i! I! r1 c
static int __init led_platform_init(void)
. ~1 _0 n4 |8 L8 T{
7 G# U, x8 U# p" l! G) Z$ B4 d int ret;
/ r, w9 o) T9 _' {( _7 Y#if 0
" V8 I. q1 U/ A l5 R0 }* {7 {+ p ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
# V# V7 B6 K5 w" g# J if (ret)4 ?; ~ m7 O+ ^1 I! B/ x+ D4 Q
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
' w2 b9 H2 z- P' V5 k! {& J$ _ "%d\n", ret);
; Y$ n, p2 {5 X#endif
: o" y; Z8 w* m$ f- A* A" l; a ret = platform_device_register(&da850_evm_tl_leds_device);1 T n- {" f0 N
if (ret)
[8 Q0 k; Y( t' q* H' w pr_warning("Could not register som GPIO expander LEDS");
f% X0 |- a' T0 e! \/ a7 j& ^- y else! h5 F7 J" a" j6 G2 x# g0 ~% S
printk(KERN_INFO "LED register sucessful!\n");
2 p J1 D" I7 ^) X7 e2 l' o* U, i0 i/ J
return ret;: ]( [8 x1 S# X; | H3 ?
}
/ Y0 _: z* y( B$ v
# x2 |6 P! i" V( ~static void __exit led_platform_exit(void)8 q! d y$ g$ O
{
* s$ I6 K% k: Q* Y& v c7 E5 p platform_device_unregister(&da850_evm_tl_leds_device);
) x8 K# T2 M3 S% `: l
; W4 k& F( k% Q" [' W printk(KERN_INFO "LED unregister!\n");
. O% Q& g7 o5 k* i( [" ]}
5 j) C# c/ |0 {! O4 G6 W
6 h. ?( X' b/ i9 W8 E0 Xmodule_init(led_platform_init);
2 ^& ~0 {# ~" vmodule_exit(led_platform_exit);2 g i5 ]& L- e5 W! U2 Y
2 Y. C) u/ D! e% x; iMODULE_DESCRIPTION("Led platform driver");
" d9 f" O/ M* `3 t6 e7 qMODULE_AUTHOR("Tronlong");3 d4 {( o, h' k/ F. O
MODULE_LICENSE("GPL");+ z2 S) Y, Q# _$ w. C( m2 q( Y
% K4 |4 R9 z; y |
|