|
|
求大神给下面的程序做注解,请稍详细些,谢谢。+ \( |; u; N, q" l! L
#include <linux/init.h>4 k1 t0 o: z5 u2 m9 \
#include <linux/module.h>
9 z7 K; K5 y/ Y {0 K, ]#include <linux/kernel.h>( b; t6 B' n `6 _2 a
#include <linux/types.h>
1 y" C& L7 c9 [/ m- |$ ?#include <linux/gpio.h>
( I" V' F" W' L5 s( _" u#include <linux/leds.h>
1 _. ]; \/ J1 k8 D2 S#include <linux/platform_device.h>9 g( @% B. c2 _+ v4 ^+ e% A1 e
( e5 _& Q! C/ f1 Q9 M7 |
#include <asm/mach-types.h>
" B% w Q8 N3 e3 Z#include <asm/mach/arch.h>
6 h+ u6 z) w% i#include <mach/da8xx.h>
8 z3 X# B. u. k/ m* P1 D#include <mach/mux.h>% q3 F) _( n( j6 L# L
: C5 B& T0 q8 @& v2 Y- y; e#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
/ e/ ?9 _. `5 K; H& Z. z7 k#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
; m% f* s* p: j4 s8 p7 ^% d- F" g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 X' e5 u0 J3 r$ W* V8 j" E. _9 I#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 }% d' M0 a) E1 o- p" A2 q5 J- j/ @& r, y Z- d' a
/* assign the tl som board LED-GPIOs*/. |& ?- Y. K( c3 ^: a/ g
static const short da850_evm_tl_user_led_pins[] = {
- O( r* g! L$ M /* These pins are definition at <mach/mux.h> file */8 v+ y+ u# @, j$ Q, N1 a; n
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) M4 Q% |. y; @9 w0 d8 I
-1# L- P' ^3 P. K$ m9 U
};# V: ?! P$ X/ g) W8 b! }# i8 H: H
! y, ]: p6 `" s% K P3 I+ u
static struct gpio_led da850_evm_tl_leds[] = {8 F' H( o: K! t* X. b
{
5 B7 g1 V. }' v$ f' O8 u: b6 \ .active_low = 0,
) \; ]5 ?* O3 Q# T3 c* k0 F( @: x .gpio = DA850_USER_LED0,: M! e6 ~) T5 x
.name = "user_led0",' [; M' Q& [ O1 l" g6 ?1 l, {. ^
.default_trigger = "default-on",
' B5 h0 P8 o$ }: p: S5 U },$ H# F& N( a; k- l) w" h
{7 N) \1 k1 I5 i0 {: {
.active_low = 0,
2 w L: G& m6 v5 O$ b .gpio = DA850_USER_LED1,
' X& w* ?3 I$ P- n) w$ h .name = "user_led1",
5 L( @* J4 d x2 g. W0 b .default_trigger = "default-on",
7 f& L/ B+ {2 b. u- w# [ },
( ^9 R. s9 v$ q8 } {( E! v( \7 n5 v) `( J& s
.active_low = 0,
( V: y1 t/ f4 } .gpio = DA850_USER_LED2,3 H/ s: N: P/ \4 w u
.name = "user_led2",5 H- P5 b7 x& \6 u; A8 W
.default_trigger = "default-on",, r x4 x5 w! f/ i
},7 o7 N6 |/ R& e) J# C$ X
{
$ m- V# ^3 I% `7 A+ w6 U! [: W .active_low = 0,' H) h e6 G6 L# t: x3 Y$ {" q
.gpio = DA850_USER_LED3,
) [) q8 x) j. r6 O' ~. O .name = "user_led3",
; i3 @( Y8 w4 P4 n9 B .default_trigger = "default-on",: E- A" Q6 B1 m- {/ P# [
},- x- y$ m" Z; p/ l: f2 ?& I
};3 T. q. X4 l" G8 R' w4 b
$ U4 X% ~4 V+ }& X
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 s5 s- ?$ r9 b2 `4 K4 |5 m .leds = da850_evm_tl_leds,
5 b& E; J% v" M8 e .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 n9 y/ p$ I% T1 V};
: g# K$ z2 I; g1 b7 h
' ?( t; {# k" i2 [static void led_dev_release(struct device *dev); n9 m' @% g3 _5 x9 K
{& ?8 ]! Y& {- ^0 P
};
# i4 y" I2 ~% }9 R/ o) V1 N$ H5 x* t; u" y3 ~- J7 m) m
static struct platform_device da850_evm_tl_leds_device = {
2 b' I6 X8 e$ {) R3 |4 U& `6 e .name = "leds-gpio",9 C# G3 `0 T) o) T! A5 C$ e w4 J
.id = 1,0 x8 y5 i; f3 v t
.dev = {
* C8 w$ E0 X& k% J* ~% m .platform_data = &da850_evm_tl_leds_pdata,
7 |5 Y) P8 G9 P% Z1 M .release = led_dev_release,
- @! I4 E* A6 G' w9 J7 m* C! G( V }: O4 d1 j9 ]$ P$ U$ p, Y
};
; L7 d! B; l7 b9 ?4 R
# P& R+ D% G) [; |static int __init led_platform_init(void)3 `% m" h, `' W0 |
{
% ~3 {1 _: n' ]9 g6 _# u int ret;
. T' j! a; Z5 Q i3 w7 I#if 00 \/ E8 k1 n+ \
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
$ N# Z5 ^9 D+ N0 e* ^& u% T if (ret)
& ^; Y! q7 Y% ~8 b9 N- Z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
/ L* E0 ]3 g% o& o; r5 S0 x "%d\n", ret);
) _1 W6 @/ q& K# |0 g+ v+ T#endif4 X6 o; D9 v. O/ @. i. x
ret = platform_device_register(&da850_evm_tl_leds_device);
% \; K$ o+ ^ ?. ^0 F* `) x if (ret)
& P) O, t% r# X pr_warning("Could not register som GPIO expander LEDS");/ A% @2 x) L/ W+ h3 i9 v# T) O
else6 D4 C; k* K% z0 y- W6 ^
printk(KERN_INFO "LED register sucessful!\n");
' G) E# Y4 E- v( R# j
6 G l; |5 U( b9 Z- s return ret;* e7 m+ q) r# s$ F5 o1 p5 C% v
}+ h: K* Y4 G3 E
8 S2 |% y" K2 O+ |. E. n2 a* ]; A
static void __exit led_platform_exit(void)& A0 Y' ^% q* x) S& N3 i! k7 a
{+ [6 d& j4 ~ e$ j% o6 R' f# r& P
platform_device_unregister(&da850_evm_tl_leds_device);7 a/ `$ m q) p- N8 l
0 \ \, m8 i6 O& _ printk(KERN_INFO "LED unregister!\n");
; L4 }1 j" U, j. j4 N% W* l3 f}/ W1 @/ Q; x) U2 y7 @
7 G" z5 T) n& Pmodule_init(led_platform_init);
/ G# B9 d3 ]. g$ f- W! Y6 rmodule_exit(led_platform_exit);
" h8 I2 D% c% M. s6 Z9 r, A3 F- I# T" y
MODULE_DESCRIPTION("Led platform driver");3 T9 N$ T6 m% f" h5 d
MODULE_AUTHOR("Tronlong");4 q M, R5 O; P6 c) ?
MODULE_LICENSE("GPL");
- Y. k- A1 z I6 f
2 v% H( g/ Q) j |
|