|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
( b, P$ E5 b; M#include <linux/init.h>& O q% N% f% o7 M& A$ V+ Q0 x% J
#include <linux/module.h>1 k) P1 f' v; S; G2 M: A0 s
#include <linux/kernel.h>
" M5 g0 _* H: K#include <linux/types.h>, U7 { |* T3 g. W# t6 P
#include <linux/gpio.h>. M3 j: g' B6 `, @. Q& E7 Y
#include <linux/leds.h>' Y0 u7 V1 m$ K8 T$ c6 Y
#include <linux/platform_device.h>
" T5 O4 U8 @1 }0 B+ K+ j# U) O. _& t5 r" [; r# C
#include <asm/mach-types.h>2 `; m; t/ S9 t5 j- M- O
#include <asm/mach/arch.h>5 D' o; _& r3 L+ _( E7 _
#include <mach/da8xx.h>
8 C( y/ x# [2 g( E" s& X7 g#include <mach/mux.h>2 R: z4 S& h# @( B5 i* G
' ~ K' f1 v! ~# O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
5 z- a7 J; P4 S" M- _ @#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)8 S5 `+ Y8 m7 M& z4 T3 @) @* T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 W, f$ o+ G; O6 m N. w4 F
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# ?" R% c" E; |/ `1 ]/ ^) U1 p* g, Z& _! W0 K. ]- b" d0 d; }5 S% D
/* assign the tl som board LED-GPIOs*/
% s/ c h9 O, x: q) N6 hstatic const short da850_evm_tl_user_led_pins[] = {
) t! m9 D' u5 d /* These pins are definition at <mach/mux.h> file */
! z0 K8 X" |" L/ W- m* o& l DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
6 A5 w6 I2 ]" H$ [* E -1 L. V. Q' [" @9 e$ l: F- q. L
};$ l. I. F( \ ~7 X2 |3 S
( k1 Q) W3 _# _6 F" n6 Z. u- u ]% E% I
static struct gpio_led da850_evm_tl_leds[] = {8 P& \3 M! j! @; q& \. ?6 |6 e6 @# T1 o
{7 x( y: x/ ~) e! I7 V' ` d1 u( k
.active_low = 0,2 W/ C; p R. q* [! h' }2 u1 U
.gpio = DA850_USER_LED0," @6 B; f+ S5 {$ @4 I" E% A( r3 T: \% y7 c
.name = "user_led0",
G, x: e& m o M1 J .default_trigger = "default-on",
/ ]0 }8 c# Z m3 r% W! n },
% c( s9 R$ i6 r O) p, f {
' v9 S Y' f! P .active_low = 0,; }4 [- o8 G" P
.gpio = DA850_USER_LED1,- R3 W6 A# P( v0 Z: Q
.name = "user_led1",
0 I4 E. n) X" R' A6 W- Q# t .default_trigger = "default-on",
" d$ {4 s8 {8 u; H },
" f j8 l+ j0 |. n' w {
' y2 [: U0 L( ] .active_low = 0,. W/ A% f! V0 p* ?% ^1 Q
.gpio = DA850_USER_LED2,4 _ h0 a4 ^( H
.name = "user_led2",
9 k' T3 F$ H4 l9 { .default_trigger = "default-on",! x* k/ B; @! x8 h1 a
},
& ^; f, i7 j& l5 z$ n {
* c, ~' I8 p; c .active_low = 0,
- ~ X3 z- c7 i! d .gpio = DA850_USER_LED3,
; C `* z3 W# K6 s8 v; z .name = "user_led3",# Z, F S9 L0 M7 `. G- s
.default_trigger = "default-on",
3 o) T7 }8 \# W3 I4 h1 H1 G },3 \; w5 F1 w& V& N8 H4 S. l
}; ]8 O/ U$ D4 J* @2 i
5 y# r/ N, J$ L8 H; d9 A
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* {) U% X$ x: ~1 m2 J+ o$ {1 ?0 b .leds = da850_evm_tl_leds,/ ^9 L! v' R# c' V$ a. b& |
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
) P- G( d" H. Q' m$ M0 h$ H& Z};
1 }* P% \, x2 ~: w+ x& l
3 ~0 Q. K) k* xstatic void led_dev_release(struct device *dev)# X" d/ F6 a$ P) I( d" v+ j% {9 N
{
! h1 w/ V9 B- y1 |8 R9 w};" W3 I* l9 P% P, O
2 S* w0 y0 D8 }: m' q4 M) s, E3 p* o
static struct platform_device da850_evm_tl_leds_device = {& i* _. I/ Z6 A: x: J5 h
.name = "leds-gpio",& [/ q3 U3 U+ W# E- N" F" }
.id = 1,, W) X# @, \" a7 \: @1 R [
.dev = {
# b7 w8 O |$ ~4 _6 [; N .platform_data = &da850_evm_tl_leds_pdata,; i% O7 ]3 s. j" F+ L( d: I% x
.release = led_dev_release,6 h, s7 J, m0 n
}
$ Z! y( ^% ?( ]1 [};
) v' @5 H; L: `+ N! S2 i+ j+ N) w, ?: M5 |& y7 {7 F$ b; p1 ]7 _
static int __init led_platform_init(void), `8 X% R+ Y1 ^0 T6 P2 x
{2 ~$ ~% B3 c2 l
int ret;
! C! r) D' B; J# g& a0 Y#if 0; ^/ H `; x: `3 @& Y) u
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);6 u" i# [& @8 R
if (ret)) \3 P# V& {# ^" E+ c, a7 z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :" a4 e* a: ], S1 j, O# i3 E" E
"%d\n", ret);
/ j6 X4 A, A- D- G* e) L) W' L#endif
0 d: r8 g- \4 ]6 i) b6 @, P ret = platform_device_register(&da850_evm_tl_leds_device);5 V0 g$ @; z4 R! W+ l1 ?6 l
if (ret)$ b8 X6 t& E. b) X/ B. w( _
pr_warning("Could not register som GPIO expander LEDS");
0 K) K9 ?9 B7 i; j; J! E else; i8 z' A& b. P% `3 D: x! w
printk(KERN_INFO "LED register sucessful!\n");
! ` Y- l' m' n# k* q+ n5 P3 U4 r( [0 \
return ret;1 o' q, c/ r0 V
}) n) f' x O7 @
5 g9 {) z8 b& T# |5 S; ]static void __exit led_platform_exit(void)
) K: }$ Q/ l8 H. E; ~( j/ Y{
4 Z! `. O# }* C1 h9 z& e+ J platform_device_unregister(&da850_evm_tl_leds_device);# T% `$ W. {+ ]$ J! o. k# x" g Y
; ?" ~& t3 C% r( R. v' q1 g' ? printk(KERN_INFO "LED unregister!\n");, \ G0 J' \# C
}
. U" n7 v- F* K% L* C+ c
* P; |) o! C9 }% d5 Jmodule_init(led_platform_init);
! ^# U Z. a$ [* M, K# Tmodule_exit(led_platform_exit);
\3 h$ j* ^" ^) b
% Q6 u X/ @& y+ V- ?2 `6 u( AMODULE_DESCRIPTION("Led platform driver");
: z4 L6 Y" h; O; @, tMODULE_AUTHOR("Tronlong");
3 k- L3 b, x" e: N& r0 aMODULE_LICENSE("GPL");9 O/ Z7 U" g: f7 H
1 ]" O: V& Y! d8 R8 S: R" ^4 c( @
|
|