|
|
求大神给下面的程序做注解,请稍详细些,谢谢。: C2 B7 ]0 c) A
#include <linux/init.h>( _3 Z2 G/ }/ \1 c
#include <linux/module.h>- q1 m; c% T: X( \( l
#include <linux/kernel.h>
9 f; V1 d0 [8 Z! {% _+ H7 K4 n#include <linux/types.h>
+ s5 y( b4 `+ |. r% f& ?#include <linux/gpio.h>$ X/ G$ _/ w& ^# X4 m
#include <linux/leds.h>: O4 `9 g* { b% O1 |! t
#include <linux/platform_device.h>
1 H$ |: k' g( V! y8 Q* A9 I2 h, ]7 l9 G, _. S9 \* Z
#include <asm/mach-types.h>
) `5 ?4 m; e# {$ @3 v( W6 _1 X#include <asm/mach/arch.h>) @, {2 I5 T3 l9 l9 M# ^4 {' v
#include <mach/da8xx.h>
' W9 F0 y" t- g+ l; C! s& ?$ n: v#include <mach/mux.h>$ f {8 Y- M0 l" K; R% M2 v* d0 ~ o; S. g
' b) M5 X' Y1 i) e#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)! C/ W8 p) N7 M5 T) @
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)$ t3 K, I, p6 a6 B; Y9 K
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)" M) W% g- G. j4 X9 d: ^2 q! d; I: W0 E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
A. d0 U4 H2 M! h u: Z& X- `) T, r! M' L3 O% W$ h. w
/* assign the tl som board LED-GPIOs*/* Y- }2 R0 ^/ T) u
static const short da850_evm_tl_user_led_pins[] = {+ Q# @: d( a8 C" t ]& |& _
/* These pins are definition at <mach/mux.h> file */
* c+ c& N& O4 \& b DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, j$ k' X; M& Z4 E/ V
-1
1 C5 E! D: }# M; e& d) L1 U5 J};
4 b$ s8 e+ D. _
9 b( F7 O. _ x5 t1 [$ h2 m; q/ I. Q" rstatic struct gpio_led da850_evm_tl_leds[] = {+ U. r- T/ w' T8 z; F7 d
{
6 d$ D5 o" ^) g8 h1 T5 |) s* ^ .active_low = 0,
4 X& `3 l/ ]- N( C .gpio = DA850_USER_LED0,
$ _, _( \* ?0 e' S .name = "user_led0",
. P2 k' `8 j* h9 O9 c .default_trigger = "default-on",+ G2 L* s0 ]) ^- q6 o; K; f1 ` z6 T
},- W* ~( B* @6 ], m
{+ k5 A- L: j$ E% J; r
.active_low = 0,
7 G1 g" C* |( b .gpio = DA850_USER_LED1,
$ w4 d8 \; D0 u# u) H. ~0 l* \ .name = "user_led1",4 O& K: Z0 s9 j1 i0 b. e' H
.default_trigger = "default-on",
8 s, y" V* A$ y },8 C% l8 n% Z) i( I& l; p3 ^0 j
{4 Z3 K1 J0 s7 v. v( @
.active_low = 0,. r' A4 q% d5 e$ B
.gpio = DA850_USER_LED2,
7 M8 A+ R; ^5 s& H$ R .name = "user_led2"," R2 l" ?1 @1 I. J
.default_trigger = "default-on",! `6 S& W* m( V8 c/ }3 `4 f
},( T1 P! F( s, ~9 v
{1 n) J/ e/ q3 C
.active_low = 0,+ o( `. K& h- |& H4 w
.gpio = DA850_USER_LED3,: E) Y, S4 w3 D
.name = "user_led3"," [( N. j- E4 l
.default_trigger = "default-on",( {8 u9 y% D# M7 c7 G
},
8 ^2 T8 K1 Q2 X$ P k};
3 u& s( X* U& T4 U5 p. u+ p6 m. Y6 F, h( `! _
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; D; P+ T8 q: d! S; i5 L .leds = da850_evm_tl_leds,, t: J- s: L- Z% y' H$ u" u* v' `
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
: h9 C& S* l' o) O; H H( r}; a$ h9 p/ R; U+ h
0 Y$ d. Q( D* Y e: |" f* M$ _
static void led_dev_release(struct device *dev)9 w3 R% @# e& A* S, O/ [
{
$ C4 H4 T9 M9 Q( X, ^, L; [( `- [};4 g" f- V' t; q5 R {3 C' [
3 H0 w$ E) c6 V; v
static struct platform_device da850_evm_tl_leds_device = {
3 H# d$ z% ~6 ^0 x .name = "leds-gpio",
" a6 g# N8 H* u- R6 w .id = 1,
* q- r0 o' |2 g3 C# A .dev = {
+ q# \" V+ t* \+ p .platform_data = &da850_evm_tl_leds_pdata,' U' }2 w0 s# E, X. a5 M* i
.release = led_dev_release,
K. u% e; h+ |7 T$ `' Y }
& Z9 h1 B2 f- ?: m" C};. L2 ? ^$ W" F% J5 \
2 L* ] |8 u4 E4 C' B4 B7 h9 N |1 vstatic int __init led_platform_init(void)* s, N. K- y' W. ?
{
) _! s0 b) C# K- ?% E `, {1 b int ret;( _+ h; n U: l6 N/ e5 M% f6 c" w
#if 0
/ q* ~3 @9 [4 r" q* F0 i% J4 C ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
! ~3 d5 `* w* [) ^% f7 U5 v if (ret)
+ w/ {" y% B4 j. o; G0 Y pr_warning("da850_evm_tl_leds_init : User LED mux failed :" q% S3 N3 t8 N. _% y
"%d\n", ret);3 p, c. p: r0 F# _% Y& n0 |! H
#endif" {. a$ f1 b" N0 L) O. T3 H
ret = platform_device_register(&da850_evm_tl_leds_device);
) F* e$ j- G# C ]; ] if (ret)
9 [7 S! H( @1 f! N* o* O! u* m pr_warning("Could not register som GPIO expander LEDS");! {: \% s4 \: z4 {1 ~
else
6 \* \# ]3 a- x& P! X printk(KERN_INFO "LED register sucessful!\n");" i- C$ j3 D6 E: S% t5 Q
& I+ r' C/ @0 E8 e
return ret;8 J# Q- D' ^/ v: D! Y+ t
}
7 H# U+ g5 V3 s/ l
. I" q, h3 z' a, ^0 l. e: c5 Fstatic void __exit led_platform_exit(void) W) H J* S& ?( o4 a
{. a4 h# f' Z% Y! }$ {, {3 `" D6 l/ @) @
platform_device_unregister(&da850_evm_tl_leds_device);
# b4 O" H) I3 S4 R3 V5 ~ f8 i2 g0 ~
printk(KERN_INFO "LED unregister!\n");* a. g) q0 O7 \# U* ~
}, [( P/ w! U) q" w+ F/ u
% _ [0 d n3 o2 g; @5 G; d; @& ~module_init(led_platform_init);
9 C2 _9 t# ^! @" n; n/ omodule_exit(led_platform_exit);
$ P* M& q; \: ]' Z+ g/ B% v0 a$ ~: R7 v0 o1 f
MODULE_DESCRIPTION("Led platform driver");
# _ q9 ~" s# f* KMODULE_AUTHOR("Tronlong");! P0 k; w; A O; b0 g
MODULE_LICENSE("GPL");
# y5 W/ o1 _/ p3 y0 b
% |7 n9 D ?9 a# S7 B* p |
|