|
|
求大神给下面的程序做注解,请稍详细些,谢谢。+ w0 i* a5 |. {, r
#include <linux/init.h>
$ G5 m( v" `) I) {! P#include <linux/module.h>4 D7 A/ F4 Q( ~/ t D
#include <linux/kernel.h>0 C+ b9 s' C0 G* q& W
#include <linux/types.h>
; ?" o& Y5 y$ V; X#include <linux/gpio.h>
9 S4 Z5 I% I! h#include <linux/leds.h>' z" j4 ?) ^% p, P3 ]- t- b8 }
#include <linux/platform_device.h>8 V, Z' T; {5 t* w6 d) T6 _& _
4 A1 v9 r* P5 T. f2 F1 X6 f( H( c#include <asm/mach-types.h>
1 y) P6 q0 L& _" ^9 A) b#include <asm/mach/arch.h>* q7 [: Z5 j- m2 E* h
#include <mach/da8xx.h>4 Q. W8 H3 n: n3 R
#include <mach/mux.h>. V) |/ A$ p% w: \% t3 M0 }
( I, Z1 H7 r' u9 N' U1 \6 X& S#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
1 [: I& v- @) G# X7 J#define DA850_USER_LED1 GPIO_TO_PIN(0, 5), _- q4 w0 T' n" r h
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
+ J! n# w* l9 I! J: c' o#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- Y/ V0 |+ M/ d7 `( ]- O9 ^. \1 [/ h1 v! ^0 z0 a
/* assign the tl som board LED-GPIOs*/
9 T8 l7 Z" S1 @; c2 w9 Vstatic const short da850_evm_tl_user_led_pins[] = {- H7 P: r) ^& y9 i( @) Y/ `
/* These pins are definition at <mach/mux.h> file */
$ E. {: w" O; O8 m$ ] DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 X+ K, V4 J9 Q( d; R9 R F1 ~ -16 K' ~ k' U' q# ~
};: S- q4 ]: L- g3 H9 X2 c
. z. U; v( @4 b+ o4 O5 [) e4 rstatic struct gpio_led da850_evm_tl_leds[] = {
4 j8 v R+ C4 x- q { f0 h# B) |1 x- i' ^+ V
.active_low = 0,
& [0 d! n5 j" M2 u. ^ .gpio = DA850_USER_LED0,
% d5 ~ v6 r- [; S% y' f' [ ] .name = "user_led0",
4 N+ S; Q6 O3 T7 i, M. h .default_trigger = "default-on",
/ \, n/ {2 A" W' E9 Z; ] },% ?" W8 ]" Y, ~; t, b1 u; B3 t3 E' z
{
6 b1 n) ~8 N$ p7 y* o; R .active_low = 0,& W9 L, R6 ?( {% B# W7 I* c. [
.gpio = DA850_USER_LED1,
7 s! u( D' Y" r" {. k9 q& K .name = "user_led1",( x2 f# y; I& V* z8 U# b
.default_trigger = "default-on",6 L* z: R5 {. {! K# A
},
7 w* B7 z/ ^; s# }" N% [ {
2 Y1 e* E! g0 b8 a4 B* H9 x4 Q( ^! @ .active_low = 0,! J6 V0 v9 k9 T* J' N7 x: \
.gpio = DA850_USER_LED2,
' [! z0 _% f) ]& r+ q' q; b' p, [ .name = "user_led2",
; H }* _0 U9 u4 K .default_trigger = "default-on",8 s; p( m4 t, l/ L2 G/ x4 i B
},, ?8 J3 ?/ b4 j. f' B% u: n: t
{
8 C) m; Z5 r5 d .active_low = 0,# e" |1 {/ m2 k s) F% O
.gpio = DA850_USER_LED3,
9 Z5 e1 y$ R8 d( \% x .name = "user_led3",, h" U6 p3 e: s: F$ b& o5 T
.default_trigger = "default-on", w) u5 Z2 U( | `) T- {; U
},
: k) D2 u. P' ~* u" b0 @5 m};" d9 @8 Y8 v7 _' T3 R( i
. A( w( ~( v. o* o
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {5 _" c2 ]3 U+ G% J; n I, ]
.leds = da850_evm_tl_leds,) |0 p& f/ X# n1 B8 M5 {+ x
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),: i( W5 F* l0 C8 Q/ J
};
! r. Q. k4 k+ n; x+ U
/ G! r" \# h/ B8 v7 ?! istatic void led_dev_release(struct device *dev)* S2 C) S+ |% O6 S) O( q
{& \& a0 D) K2 h0 M4 [
};/ m! f( o* M/ S& ?- f* |4 E6 t
9 B' c" o$ ]( {& m9 Xstatic struct platform_device da850_evm_tl_leds_device = {
1 x" ~6 |, H- _+ G% H; L .name = "leds-gpio",' t+ A" J# F+ h2 j N5 v. L& g
.id = 1,
* v* I6 |/ x, @$ v) Q1 m/ k7 L4 d .dev = {
1 f1 w6 H7 ]! P4 c! c .platform_data = &da850_evm_tl_leds_pdata,; @% v# U# G. N* R; ~7 ]4 H. v
.release = led_dev_release,
- ?6 H. N3 p/ V! w, F7 I. M+ R& o }
8 Q/ t4 |# z }; {& `# b/ B};
0 v$ t2 S/ _- E7 \) B3 k1 d
6 Y3 _+ ]- r7 |3 a: a: A3 n# F$ estatic int __init led_platform_init(void)
* M7 e% H0 P& K: s{* l" `3 }! N; g) F) `4 e+ U6 g; |
int ret;
' ^( S. r+ F' i" z6 T; |* m#if 03 K/ v7 E' L5 n1 u- k! E
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ g c) w- W. s
if (ret)
" k' ~& E' {2 J5 J pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 u6 Z5 ?# C7 A# C
"%d\n", ret);
- `7 r: R' u$ Z$ ^#endif5 t6 p2 m+ W( [+ d# }; X
ret = platform_device_register(&da850_evm_tl_leds_device);
; o! ^3 l5 ~% R1 |6 w if (ret)+ Q" o. ]% i5 c/ `: P
pr_warning("Could not register som GPIO expander LEDS");* J7 z- T. ?) \; h5 q
else
4 s: D9 Z# W. f! x0 S! |3 y$ _2 c printk(KERN_INFO "LED register sucessful!\n");2 z- d5 Y) [( v8 n
% h( n5 W. r5 _. ^/ p( I( a F return ret;
" m! Y) a3 H* d% d0 U* A}
# F! b6 e$ |& ?- D9 [& N* l: t' F1 [3 f
static void __exit led_platform_exit(void)
- y& D4 U5 M6 u6 b* F' V$ B{2 z( z( J( ?7 n/ \6 H) t, Z
platform_device_unregister(&da850_evm_tl_leds_device);: a8 m/ b4 \; S J- D/ o
/ C( W. x' S; M& ~, W, I, E
printk(KERN_INFO "LED unregister!\n");
* O9 Q5 f; O" o2 S+ L) c}
/ b, ?9 O; B9 `1 F# H$ j# v; D5 o- V) |5 D z; W5 z
module_init(led_platform_init);
( ^, j3 j- n$ V# I$ Tmodule_exit(led_platform_exit);+ ~4 \4 n/ b1 o+ t8 T
* |" k3 X4 Q$ L( w n# e) w2 nMODULE_DESCRIPTION("Led platform driver");
0 A, N( }. M" yMODULE_AUTHOR("Tronlong");
[3 A+ F/ W$ X+ n& s' O% Z4 W: gMODULE_LICENSE("GPL");: I. T2 y$ w: N+ E2 w* J3 C0 D* B2 k
$ ]1 B9 G, b- `+ i. m |
|