|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
8 @- T' h5 _- |4 }. ~9 n5 Q. ]$ X#include <linux/init.h>
2 Q" B% l, _) Y0 W/ O6 P0 k: V g#include <linux/module.h>
* @/ D8 E) b: V9 H/ T& m#include <linux/kernel.h>
! Z- K& `( G/ I) `+ L#include <linux/types.h>0 g8 Z5 D) G: o% D% ~
#include <linux/gpio.h>
% P2 z( Q; e5 U7 W#include <linux/leds.h>
: e6 a2 D' ?1 I' U. w3 B9 a9 Z#include <linux/platform_device.h>5 C! ]& Q- n3 K3 k
$ T ^' G, r$ _/ s$ M2 W3 Z#include <asm/mach-types.h>
- s+ ?; @2 s: Y- ]1 O#include <asm/mach/arch.h>, f6 T+ |* S+ b( a* E) z
#include <mach/da8xx.h>( L8 n/ j q( H
#include <mach/mux.h>
) u( r: w' S$ Y9 I+ D& z3 }0 v+ Y \8 o$ H# q* `" g+ R, X
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& u$ ~9 g7 p* ]) A* ^' E#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, h( P* F. e j#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)$ G: |7 c* |/ A% G5 T: T3 x+ x* H4 H
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 J4 r$ {" G0 e0 h4 s' S( R6 @9 V, C0 k9 _% l
/* assign the tl som board LED-GPIOs*/, ?5 Y8 N* H$ _/ P6 Q6 M! V, f
static const short da850_evm_tl_user_led_pins[] = {
7 k+ ]; F/ ^% A' n( ]/ f P( @& N /* These pins are definition at <mach/mux.h> file */8 |# _7 \* j/ _# k5 K: x
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
! e1 r. [" f9 U# {/ i4 ?& B. T7 R" @$ J -1
6 x+ C( s. _* L" [};$ Z* Y, G$ Q- j$ k/ ]5 Q: n
3 z& c; S3 l2 _3 L3 ~# R$ x. pstatic struct gpio_led da850_evm_tl_leds[] = {: W3 L5 r3 ^; P4 L( U
{
/ P' N4 k3 d5 U .active_low = 0,
^( o7 E, e/ t, F9 ]0 e. R .gpio = DA850_USER_LED0,3 e; {" y1 j9 t/ c4 F
.name = "user_led0",
. f( @8 r4 L6 z* ] .default_trigger = "default-on",
! k `) z" S6 j' n },
! _6 K1 v2 r$ C$ c& g {* q: ^6 C1 |( j; X! ^: o+ z" ?
.active_low = 0, J4 S6 e; \2 b: _( b
.gpio = DA850_USER_LED1,& c* H( Q4 {1 s3 U+ ]
.name = "user_led1",/ I- @, }1 u% [) r
.default_trigger = "default-on",
- e: J2 i' @9 ~/ S0 i. P },1 c! M2 P/ d/ u$ |6 T6 w# e
{; d9 E( y$ ~! p% F4 j
.active_low = 0,5 A% l0 z$ @' V3 H7 @+ J' [
.gpio = DA850_USER_LED2,+ Y/ F. o5 P, t& M* n2 y* I+ I: Y
.name = "user_led2",
6 D3 n7 c2 d, H% s .default_trigger = "default-on",
! Z8 M$ g$ m2 l) K! ]* j, p },
6 M- n [: k! |1 y2 y" e2 g {
& z1 Z9 e- p ^+ C6 l) ^# O .active_low = 0,
- g! w/ s+ s8 R7 R1 y; Z _% |7 W" k8 ^ .gpio = DA850_USER_LED3,
: ?; c7 m6 X0 a3 G! H$ g* Y2 { .name = "user_led3",
( n6 ~' @7 e" g7 v1 d8 j8 l .default_trigger = "default-on",6 b5 Z! V; k1 q; t3 K
},
* K/ h& Q' P* T& c};2 I1 \" v( @ r% V( b. h
e: Q/ Q$ l* ]static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 K( H( L3 H- t: p+ a
.leds = da850_evm_tl_leds,7 n9 s* s) s4 `4 E
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 D+ Y& r, D1 G+ x};
" G0 F; P; E' b" L' L
$ c* ^/ E& F) M$ g1 ?- c/ k9 t' t3 Dstatic void led_dev_release(struct device *dev)
7 n4 m8 P, G7 f9 N9 ~9 w4 q{
$ S- ~+ o3 L6 H% y1 S6 o};
7 c2 a8 J8 d A% c* P
5 A. \. C" R7 g% Wstatic struct platform_device da850_evm_tl_leds_device = {
" r* \6 A2 J* K+ r5 X .name = "leds-gpio",
2 p) @1 o0 ~+ v8 U( S .id = 1,2 k- } k" S) F) z& L' }' @ U; q
.dev = {6 @/ E u! e G k8 Y& D) ]! e
.platform_data = &da850_evm_tl_leds_pdata,
: m. y4 s6 T# Q .release = led_dev_release,6 t. {, _: W3 k
}
9 D) h: ~3 E q) t};: Z* S( D$ ?# I- j/ v) @
/ A% O, }& B0 gstatic int __init led_platform_init(void)) P; C x& E3 U& {/ U b f& { j
{" u* i7 m5 R9 c; K* v$ f* R# B
int ret;" y2 \+ _" v3 V+ i) m# V6 B" U& L3 s
#if 0
# M; t/ u/ Z, a$ V* I. X' J+ H$ [2 M ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
: X% O; B7 d& \/ N. c5 a! I if (ret)9 F r: y* _+ h/ @# R. \
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
8 e u* @" z" Q8 }, L- v7 `* B5 ]( _ "%d\n", ret);
6 L- k U* d1 A& T#endif, X7 H! f5 F5 u3 U8 ^+ c+ Q
ret = platform_device_register(&da850_evm_tl_leds_device);; w. i1 C! l1 {, O
if (ret)
4 p; R& ?1 ]1 V; {* x pr_warning("Could not register som GPIO expander LEDS");
* I& V" ^# ^6 ^4 T else
% k$ z7 k0 K4 ]! }' s' v printk(KERN_INFO "LED register sucessful!\n");; \- p9 P; ~( l4 ~$ B, ^
" ?' p3 N" U7 S/ ^+ s1 K- G' C+ P
return ret;
{* Q1 l+ a5 Y/ j S W" p}; ~, p* _6 E i9 a0 J" _6 F# Y
3 [( L+ n) J$ v: N( S
static void __exit led_platform_exit(void)) q- X( u; w; ?
{6 j; R; d5 ^/ I' i& ^
platform_device_unregister(&da850_evm_tl_leds_device);
) `' V) P- Y5 @6 I/ T! u8 `5 f3 p& z! s" ^
printk(KERN_INFO "LED unregister!\n");
3 j* x2 T. \6 k2 t2 |}
9 z h! }. r9 y( H. J5 [* K0 t0 p; _% t& _; j* w5 r
module_init(led_platform_init);
3 q2 b/ F, @( h" |: umodule_exit(led_platform_exit);
) J- J. l2 c$ K
1 H; n& P% q9 F; {( B! ^MODULE_DESCRIPTION("Led platform driver");
- O9 X3 `5 V& s! K: ^5 C5 p8 r* qMODULE_AUTHOR("Tronlong");
: ?; q; m: ]# g7 M7 D7 t, HMODULE_LICENSE("GPL");, g& ?0 |$ `: f
1 j$ o3 ]& Q& r7 Y, Y5 {( T
|
|