|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
# [5 h9 U& q! b#include <linux/init.h>
7 [- u9 @9 F5 R#include <linux/module.h>
- L: K/ s% c# [#include <linux/kernel.h>
/ D1 W1 ?* f9 g2 q& i8 \+ Q#include <linux/types.h>
% h x: |( J, h5 `6 g$ v! w- Y#include <linux/gpio.h>
( {( x* ~ B. n/ b+ M+ A#include <linux/leds.h>$ e% `& D; X: [$ o" W) s+ x
#include <linux/platform_device.h>7 s' E2 P5 b; j5 j+ `6 _$ e8 }$ P# L3 ?
2 j/ `; a# Z1 N! r" L5 D#include <asm/mach-types.h>
8 M" v# y J9 N0 e) M#include <asm/mach/arch.h>
- v! a7 \: O" y#include <mach/da8xx.h>
7 T% }$ x) ?; p6 v1 q& F#include <mach/mux.h>. {2 g+ a3 b8 T1 d4 V( d% j5 p
1 K$ j/ S2 j, P+ B) _" [9 u; ~: |' c
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
- d. J) u4 K3 C* O3 V) Y( ?#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
6 U6 `; e- I4 H/ q5 `5 _& \#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)( J* k3 m' L3 i( h" C7 F: c
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
, H# _1 C, L* m. ?! J- S9 \ }4 i- t$ ?! X) f
/* assign the tl som board LED-GPIOs*/: Q# k4 O8 }4 @* \
static const short da850_evm_tl_user_led_pins[] = {4 l8 N! N) a+ X: ~
/* These pins are definition at <mach/mux.h> file */8 I2 F$ n! }# i, V4 `- W g
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,7 A8 r3 Q( X0 d$ o' }% a8 A* G
-14 `( x+ R9 C' X: |$ j. }2 S
};
" }1 l2 N6 y" M) `
5 d& n: L* ^0 ~# j+ ?static struct gpio_led da850_evm_tl_leds[] = {. Q; L% l; {4 R' J5 |, w# o, P. ]
{
: H' a' l. ]% _5 m) x' g .active_low = 0,$ J5 u5 l* ^$ M/ e
.gpio = DA850_USER_LED0,2 `, E' J0 g# U( r$ [; u5 I
.name = "user_led0",9 h: u7 L; r5 L8 {
.default_trigger = "default-on",2 [. S6 F* |( a/ M( }# W: d/ G
},* |) X: e$ u* ?( _; _3 D
{
8 r! \5 k6 G$ e; t .active_low = 0,' B4 @ t7 v9 y4 u. K
.gpio = DA850_USER_LED1,
\/ S# |2 p8 [- K0 O .name = "user_led1",9 z* \. S& \% q$ V1 b2 w/ ~8 h
.default_trigger = "default-on",( G0 h! ]% x2 l3 T0 v. m
},
+ l+ w* }+ c) B! _% \# w {$ V" ?. A: X7 |8 ~
.active_low = 0,0 w# L6 K8 q: y& U
.gpio = DA850_USER_LED2,- Y2 C1 N/ ^! A/ p# h0 T1 Q# Y
.name = "user_led2"," u0 G7 u: D% e) l4 i, v" `6 ?1 L
.default_trigger = "default-on",
% _, ^1 K5 W' H' r9 G; T },* E# s3 e u. ?5 D. I! u9 e
{5 u$ K4 d9 C; H6 G2 R
.active_low = 0,
( \: F0 o# _* Q .gpio = DA850_USER_LED3,
% y9 b+ r; ^4 @+ Y# Y .name = "user_led3",7 T: |, X0 c9 u7 N/ M/ v" B7 y" S- b
.default_trigger = "default-on",
6 g! Z- e& A! ~- b9 ^" _* M/ X },5 [; W2 }, @# l* z
};
! i5 M% d6 w }& @5 Y* ]; o9 I- k+ P, G- ^
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
3 Y# L8 o; e( B& m4 y7 E7 d .leds = da850_evm_tl_leds,; t6 i0 k9 f: Z
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),0 K0 W# o1 L' k# l: d5 x3 D
};6 h" V) d6 N- m6 Q
, B+ b0 p( Z5 t# R$ Kstatic void led_dev_release(struct device *dev)
/ i+ ?# D( J2 a1 o{
' x2 J! X, R7 W, t- C7 S( Z' U};. h# k5 M" L7 ?! U) H
1 R( G. W t7 P- w$ e6 X! D
static struct platform_device da850_evm_tl_leds_device = {
( v/ Q1 {# {, B .name = "leds-gpio",
* y& S# g9 q3 @4 _6 L$ [ .id = 1,
$ ~: d" K d" U0 U2 T8 F4 z .dev = {
5 u: Q2 P7 y) A& W. l- } .platform_data = &da850_evm_tl_leds_pdata,
" v7 C- \/ H' v .release = led_dev_release,
0 u$ E9 k# k f% z }
/ }/ J; a/ j4 B: g; E7 b* s};
% A0 P" z( J* O1 d! e7 H9 _0 v2 m+ {/ U9 x" v" r+ p0 c; }7 }5 @
static int __init led_platform_init(void)$ f, z, V% O4 ~2 O
{
. F0 G1 Q d5 n: t9 {( Z" i" S int ret;
7 Y' ?* c5 o3 E' g7 {9 Q#if 01 I' Z3 c0 e: a# Y9 ?' b
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ r+ G- L2 c4 o8 n3 |- N
if (ret)
9 r7 Z1 M6 G# U; y% w! S2 i5 n pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
4 B* ], h) z1 C( Z "%d\n", ret);
) j: k# }/ b/ m f8 t#endif
a# H W a8 P5 j6 H0 W% l ret = platform_device_register(&da850_evm_tl_leds_device);
; y' C/ {0 W, j. m% t( N if (ret)# v3 D0 \" q; y
pr_warning("Could not register som GPIO expander LEDS");
1 y' F, W) f2 U- A: b else' ?8 O& _7 R. N2 v
printk(KERN_INFO "LED register sucessful!\n");4 j# r9 ^- l- r6 X
7 ^& f& A; l! @- X# \! A* P
return ret;
" G9 Z" ~% A: M0 B3 P}2 Z$ `5 x2 d" L& V4 @# j
& I" K" T7 t0 V* W. j* M. T5 F
static void __exit led_platform_exit(void)
2 c* c- W# S) e- `0 v{7 A3 r# q" `$ p- u
platform_device_unregister(&da850_evm_tl_leds_device);
0 v6 l; ]: ?6 b, x2 ~- e9 a* Z! R2 w2 e& Z+ L. H. O
printk(KERN_INFO "LED unregister!\n");
: `6 N1 J4 n1 G+ S5 v0 ?+ G/ m+ u}
/ h) v8 l" `% _2 a/ R+ y& E
j0 ?8 M' o6 e8 Z, E$ Nmodule_init(led_platform_init);
( r# A7 X- J9 `- O4 y! V+ fmodule_exit(led_platform_exit);
6 Y% P' R) n5 q
8 ?1 d) `, u8 yMODULE_DESCRIPTION("Led platform driver");
. o8 S( e& t" V! XMODULE_AUTHOR("Tronlong");
# Y6 V1 @; o; T+ uMODULE_LICENSE("GPL");; z( V5 y( B, c7 R" _
$ l( y& k$ l3 ^1 y0 M& K* V
|
|