|
|
求大神给下面的程序做注解,请稍详细些,谢谢。' Q# f1 E( X" g$ |2 r: g* y
#include <linux/init.h>: T2 n6 v; R# ?/ W4 v' A
#include <linux/module.h>: T& G6 o; f% ^- G% g; ~) K
#include <linux/kernel.h>7 ?1 c$ W6 K) H, w7 J9 ~" K
#include <linux/types.h>/ b+ N* {6 x Q0 E [4 M
#include <linux/gpio.h>& g1 z& o2 G% r. T# x, T/ v
#include <linux/leds.h>
D, z5 H8 a0 h% E: k8 ^5 \#include <linux/platform_device.h>/ m- } s8 x1 p( x- S
+ @# q; O2 ~; ]#include <asm/mach-types.h>2 B3 h& B7 o4 W3 ]& ?0 @" e2 P7 m
#include <asm/mach/arch.h>) j" C0 X# n/ v0 m. s9 r
#include <mach/da8xx.h>3 H4 }/ Q. F3 A. Y \* M
#include <mach/mux.h>
! _$ p6 K5 L6 r' J) D% E+ ^: s; A
9 `) ]. s7 d n7 a* N4 v#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)- z' `# E0 v" {7 w$ Q4 e$ l
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& j' J& F) R: i8 i0 a' m. k#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: a! {: i4 z) q; w9 |# y: T#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 ]+ K; A2 F* ]9 E& R9 P
4 n0 z# f3 Z& M h, z3 v/* assign the tl som board LED-GPIOs*/
+ |% [9 \0 {0 H+ N, Fstatic const short da850_evm_tl_user_led_pins[] = {
; N" j3 L$ u, ^2 v9 y2 }- N# Y, q /* These pins are definition at <mach/mux.h> file */8 ^5 Y" C* C7 t# A; t( J
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: `* y5 U9 i% `# k -1
4 k; s1 n/ y* b F1 n, w/ G; c};7 w! Q% w! W5 W: H$ U$ ~
3 Y: S# t( `" W$ {1 k/ c/ Tstatic struct gpio_led da850_evm_tl_leds[] = {6 Z" z3 z$ ~& J$ h- Z. o
{) q* G; U% w5 G' ?5 a) Y
.active_low = 0,1 M0 Q) V& c# @% U) m! C
.gpio = DA850_USER_LED0,
/ H, b5 v l, U, r .name = "user_led0",
6 ^8 E" v- R9 v .default_trigger = "default-on",
2 U& q8 |+ }; O' S( }3 s' O% t },, r- Q& T \9 O& P0 Q; X* S
{" u9 r: {% B& L# f% m
.active_low = 0," F% d& i& n: ?+ ~+ J
.gpio = DA850_USER_LED1,
3 p3 N0 D7 e2 u8 B .name = "user_led1",6 d# \/ K, O4 E0 V, b) |7 }, i
.default_trigger = "default-on", t* S, q4 d, D* a
},1 r2 A) {3 [( U" v( \0 Z9 R
{
+ p! T* ?$ `8 b7 A3 g3 t e' ~ .active_low = 0,8 v, y- p! d( I) i
.gpio = DA850_USER_LED2,1 b8 z( i# ?0 p n) i
.name = "user_led2",
$ m3 ?7 X. x& N8 z& t .default_trigger = "default-on",
) c0 j$ x; w: e) d+ R* ` },
I1 n% ?5 J8 k2 t) l: J% o$ v! x {
( W3 i; F0 `. W, v% A+ j- Y, s .active_low = 0,
9 J% l0 ]. J; B9 i& Y" S5 F, b5 ` .gpio = DA850_USER_LED3,
" z1 Z: ^, O* t5 H% N: u9 A .name = "user_led3",
0 f5 A- w _7 O .default_trigger = "default-on",: y' E5 y* A L9 d$ M! |
},
5 z* w6 J# Q; _+ w' d- F7 v" g};
8 r9 n# z+ ]* z9 w
9 K& z5 ?9 W- H9 \; dstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {4 _6 n' h C6 \$ J) N5 j9 O8 ^+ T
.leds = da850_evm_tl_leds,
# r: m7 R0 [5 x" T `) I: |) r .num_leds = ARRAY_SIZE(da850_evm_tl_leds),6 R( Q! }$ k: \1 z9 z
};
' {% q4 R7 P0 U$ s+ X: Z( k% g2 H( }8 A3 J5 p2 e6 T% ^
static void led_dev_release(struct device *dev)0 |& G( d6 `" J$ m: \7 }3 P3 _( Z
{2 i4 ~# M4 a$ E# D2 W0 i
};
" a }( L. j v
, a B& O3 Y3 u) O' }static struct platform_device da850_evm_tl_leds_device = {' s6 e7 R0 F Y6 }0 P
.name = "leds-gpio",: l/ T- Y5 |! d' T/ |
.id = 1,: Z: g9 X% F" e3 N% D) n
.dev = {
# y8 {6 Y8 |1 W4 f+ O4 [ .platform_data = &da850_evm_tl_leds_pdata,1 V. N* L/ I% B4 v( Z' w
.release = led_dev_release,, x- E5 w& j% h5 ?# `
}
9 S8 \/ O8 Z+ P& I8 Y: b X1 Z; @};. r; i+ H# J4 s
2 y5 y! m( V; Z# h8 b
static int __init led_platform_init(void)* q; o2 O7 D1 h, |8 }) {6 b! R, O1 V
{
u; O& m& R8 Q* i* l Q5 b* Y, m& @; w int ret;" C2 ]4 w5 [' O j! u
#if 07 k3 ]# A/ |0 {( f" p; ?6 k6 F
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); d& Z8 g. i, h+ s- y
if (ret)
6 ^& ?7 F# b( W# _; Y: K pr_warning("da850_evm_tl_leds_init : User LED mux failed :"5 a4 B, F8 K7 q7 q
"%d\n", ret);
. w: G4 M$ S& I6 x#endif
% C. v! p2 J# w$ k" i ret = platform_device_register(&da850_evm_tl_leds_device);
1 P( g. R. w6 U( R2 A, r+ v if (ret)' e, Y# x' e( E% Y/ S7 |' k( a
pr_warning("Could not register som GPIO expander LEDS");, W' K y4 T/ R3 @' \, E
else
. @; T5 H6 E3 e y printk(KERN_INFO "LED register sucessful!\n");1 p2 K- J( X! I6 c K) u1 v
( x4 k& @- Z) v return ret;
- x; a& }& q! t3 A+ J2 j* D}9 l) f6 G5 Y7 d( r2 o2 i
& K; ?' e3 C+ b3 ustatic void __exit led_platform_exit(void)
# N2 I- T: ~$ M; s }{
' Q6 w& W; {5 J. `- L5 r" m$ ]7 y9 L platform_device_unregister(&da850_evm_tl_leds_device);7 @3 r& z! }- v2 S# s) V* m' R5 j% I
' D8 w1 I% z" p+ Q% J8 t: H printk(KERN_INFO "LED unregister!\n");: D! X) z. ~& H7 `/ T) B) Z5 V
}
7 }" h7 m4 {/ Q( s5 t
5 r$ t V% a& \# C- X% q; Xmodule_init(led_platform_init);9 p9 s3 E5 B: m
module_exit(led_platform_exit);
& `6 Z5 c0 G" l1 c+ r! s1 W5 B: {. P/ z/ V" ` a7 G7 J5 ]
MODULE_DESCRIPTION("Led platform driver");6 v4 S5 \ A! ~- `( M1 C
MODULE_AUTHOR("Tronlong");
3 E3 d H8 s$ U: NMODULE_LICENSE("GPL");0 N* L* Q% N9 D0 ~4 O& S
. C# v3 q* ]) f' Q) T% y |
|