|
求大神给下面的程序做注解,请稍详细些,谢谢。9 b; _8 I6 ]8 t7 O5 }. o
#include <linux/init.h>
( C# i7 C) v) c#include <linux/module.h>8 O b0 U+ j/ `* J( ~& v) f
#include <linux/kernel.h>/ A, T3 \8 k! z# [; w: t
#include <linux/types.h>: u6 ?. D: J. J2 H8 }
#include <linux/gpio.h>8 q% i+ r0 d7 K3 `
#include <linux/leds.h># s" Y4 b* \% g
#include <linux/platform_device.h>
' L4 }* A/ c. i8 P/ d2 k/ s6 K$ [
) }' r8 V/ [* C* ?3 f: k& S#include <asm/mach-types.h>
5 p4 D9 C- O* w4 G" d#include <asm/mach/arch.h>1 ], ?! h6 P- x) g3 k
#include <mach/da8xx.h>
; C4 m6 u; q7 t8 g+ X#include <mach/mux.h>: o) Q4 r' x$ q; L. H( k. P+ N
5 b# J8 W" W3 _#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 R: V" S5 V' I" l- b" P6 @% j#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
% E" P: |; ~" |7 Z* Z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 g1 \/ h, z4 `0 ^1 z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)/ i1 z: o7 d# g. F
1 o/ B* z! ]( G" D$ ]
/* assign the tl som board LED-GPIOs*/ Q9 ]7 k) z; L6 f B! N; y% ~
static const short da850_evm_tl_user_led_pins[] = {
% K' u1 K# }8 b* i. R /* These pins are definition at <mach/mux.h> file */
! m' t& d0 A7 G8 V3 e! }) L; Y/ f DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 _% }0 f" I5 z3 v# c( ^5 H -1
: @' ?" G! s# B8 j};
) v/ k- m6 V% b9 z6 U3 G" D4 w; \3 z4 F4 k7 A. V& X) u2 `
static struct gpio_led da850_evm_tl_leds[] = {) g+ m3 j: r) ]5 G7 A4 R& |
{! O. V# G( ~/ I
.active_low = 0,
* B5 {8 d5 f' s0 R .gpio = DA850_USER_LED0,
$ b+ U6 e4 b, N# d. C .name = "user_led0",$ p( K" |8 P3 ]
.default_trigger = "default-on",3 f( ~4 U, A1 a
},( Z5 b) ^) {( K
{7 z& ]: A7 C+ o1 @
.active_low = 0,
1 J1 K( D7 @+ [9 z, { .gpio = DA850_USER_LED1,
7 p3 u% \! I& h) G4 H% c .name = "user_led1",
0 N! v7 X' e% m* H. @4 X+ ~1 y .default_trigger = "default-on",
) o8 g- W* \1 C4 J" E6 _! f },' ~9 Z: e& t2 I( {# }1 S f1 j! h
{
. A( C3 u, t- D2 R' Z7 O .active_low = 0,9 ^) ]5 K% @* u( x
.gpio = DA850_USER_LED2,- G1 h0 _% Z, V) v7 N5 Y
.name = "user_led2",
0 l- t7 X* }6 _" ] .default_trigger = "default-on",4 |. [" j; m# |
},9 t3 {$ |8 C: Q* b
{5 H4 `( g- y: s3 y3 T7 l1 P
.active_low = 0,
! j2 z. K K+ v h .gpio = DA850_USER_LED3,% C. \ q: w, ~% _9 O
.name = "user_led3",! O n& T; r( p( d8 [, D
.default_trigger = "default-on",
6 p1 ~3 p3 a; e9 I0 ?, } },
/ Q0 I8 K8 U0 m3 C};
/ V( u% o8 ?' i' `0 |* D: C
: E2 A: J3 Y- q, @8 kstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {5 r2 j9 j5 U2 q* Z; J& U# O5 b
.leds = da850_evm_tl_leds,
2 Z- F' B' i z8 `9 u .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 L- X+ d: j/ r* j* y2 u
};
$ y2 V8 w2 u* y# ^! N
% v1 [! d' z M* Xstatic void led_dev_release(struct device *dev)$ K( B- [+ P# x+ q9 p7 Y+ y$ ~
{
! t, {1 u) o2 L};8 [% Y$ ~& y8 P3 m3 B
+ [9 ~, m+ ^; J( w, J% b
static struct platform_device da850_evm_tl_leds_device = {; i0 I5 d& g8 k* V" _! J! n' V
.name = "leds-gpio",
& c5 G0 u/ x) v& s, z# u3 G1 T .id = 1,5 {; c6 m( u0 \% G B" W
.dev = {. P1 O; H3 I' R: |# _- ~2 Q V
.platform_data = &da850_evm_tl_leds_pdata,
4 j# n) n) | w; h' k .release = led_dev_release,
$ L( v3 z L8 B, W$ U7 N }; x' l2 K" r' {; c q
};
' n7 p1 q; A/ e$ s* a8 H9 K2 ]( r. N) a( e6 Y; w
static int __init led_platform_init(void)
7 F% m3 F7 F, N$ _. n{$ l$ K1 u2 ?" }. z0 a* m4 f4 j& v
int ret;
8 _$ l( j( b" \3 S#if 0
) L" f1 w2 H, Y+ N# U ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
+ @" o. q9 D+ W( \ if (ret)
7 T8 t' p* E) l pr_warning("da850_evm_tl_leds_init : User LED mux failed :"1 U/ M& Y+ m$ }
"%d\n", ret);
! U# u/ G: z& {' U. C. ?/ C#endif
1 t! T# G$ p; C" @1 }/ H0 p$ Q! \/ _ ret = platform_device_register(&da850_evm_tl_leds_device); S# e! i/ G c5 h' Q! X
if (ret)* C: ~5 ^! u: O. a( L$ I
pr_warning("Could not register som GPIO expander LEDS");9 K. N0 w7 ?7 i8 ]6 x" Q- _7 C* B
else
; W" H! p# w: F% o0 h, ~+ M, G2 t printk(KERN_INFO "LED register sucessful!\n");7 Y) J3 H4 a+ z' z
, W+ z4 F) W9 N: M: F
return ret;, F: r4 R! X. t4 x1 B9 k; z6 u' ~- F
}
, t3 {2 q+ S+ c9 I) A; |, y6 G$ Y9 q( s* V3 p" @6 E
static void __exit led_platform_exit(void); i/ g; j5 u" o7 A+ f; {
{
+ `1 p5 p* n6 ]8 Q platform_device_unregister(&da850_evm_tl_leds_device);
7 ]; G, B9 C* I1 F4 j0 u3 O
. ]2 _2 R- Y3 S H/ L& X printk(KERN_INFO "LED unregister!\n");8 q6 ^* p. q3 n
}
3 e. K" b6 d: {- _" e" E' g) s1 Y. w r8 Z
module_init(led_platform_init);# W: k, v" h& W) W- L- H( j! }
module_exit(led_platform_exit);- w/ H* v, I/ C
! b0 J& I: M# P9 p) K8 f; [2 YMODULE_DESCRIPTION("Led platform driver");
; l% X( H; z5 _: C0 v' m9 uMODULE_AUTHOR("Tronlong");+ D/ Y2 \/ u$ a& n2 K. `# s
MODULE_LICENSE("GPL");- z9 X( I' _* T/ d
9 H" h) U1 q0 P8 u: @1 ^. z |
|