|
求大神给下面的程序做注解,请稍详细些,谢谢。 W; q% ~2 ~ Y. P( r: @4 }# Z
#include <linux/init.h>
+ }. @! |$ f+ C$ b# B#include <linux/module.h>
# S* s, b( o$ a, ^1 v7 `#include <linux/kernel.h>
* t$ N2 {3 R5 m0 C' H% o5 n#include <linux/types.h>
' p( _# s; H( Q2 M' d! V#include <linux/gpio.h>
" _& h8 ?) b1 M) d; E#include <linux/leds.h>% N0 g9 }" h& {
#include <linux/platform_device.h>' s, f; b# M$ O" g
5 U; C) W, F6 G' \: H2 {2 R#include <asm/mach-types.h>' ]9 z) C& \0 P, A
#include <asm/mach/arch.h>
* j# w8 k- D7 V$ c5 R#include <mach/da8xx.h>! I+ `/ R3 G% x# U- X
#include <mach/mux.h>) A" H5 p, W8 R" i: X& ?
7 z- W1 `( b; y8 g( }#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 P, n$ E' X! A& G
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 P; c Z9 a- Z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 B. O) `* o+ R8 ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 F# s8 R/ M4 q( J/ Z6 r; X6 Q0 M, @2 _4 ~5 |8 Q( O$ x& n* n- @
/* assign the tl som board LED-GPIOs*/9 ? O1 y' K$ U
static const short da850_evm_tl_user_led_pins[] = {
. |' \8 ^$ s# o C# ?8 t8 i7 D: U /* These pins are definition at <mach/mux.h> file */* v z7 v! W/ v3 f i
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
2 [8 }" ^ T+ t5 U1 A6 N8 {# X -19 {6 S+ u0 X g8 a m+ u
};- {5 C% z B; W! m, t7 B! I V
! @; v3 ~- H1 O$ c. z, `static struct gpio_led da850_evm_tl_leds[] = {% u0 O8 w% s: l2 u" s S" Z/ N# y
{
% Z _' `0 ]6 v, K g5 H5 Q; f .active_low = 0,
& X) D4 B0 a" r9 j; N .gpio = DA850_USER_LED0,
3 j& G% ^, t7 n7 c4 n$ E .name = "user_led0",
( X+ V7 W6 e# E( B% ^! c# Z .default_trigger = "default-on",
$ |( y/ c3 o& \: G k" S0 G+ L },6 }0 B. P) g( h1 p) U
{$ o% Q" N3 a9 N9 b7 Z) C+ {
.active_low = 0,4 w/ U% Y8 @3 |0 n
.gpio = DA850_USER_LED1,
. D0 o, m2 y a/ c .name = "user_led1",4 r% {- E. ^/ {+ f0 I
.default_trigger = "default-on",4 z* J% |. f M3 m7 A; z9 U
},
K. C* l# w! V7 q$ ?2 m {: M. }' e" y9 ]; u5 A
.active_low = 0,9 ?& M; v) H& n! K" F0 D
.gpio = DA850_USER_LED2,( Z! a0 o7 M* n: p' [1 }. m
.name = "user_led2",
, e! q7 v6 G1 ]' U. c% Z .default_trigger = "default-on",( v2 d- c2 x; O S/ h
},0 u5 j' g% d( Z$ T' }% \0 \3 r
{
9 W+ Z- u. ^5 @ .active_low = 0,
/ `9 Q0 h: R& @2 |: y- W .gpio = DA850_USER_LED3,# w9 g) }9 i7 z6 j( b5 M& z# Z, E5 P
.name = "user_led3",9 U% [$ U- n- r
.default_trigger = "default-on",
* V/ p8 M. l( S5 x. Z },: G. j% r' k+ ^6 k, l. K
};
% F8 T( ?3 ^, E/ h& K. Y, W
& D4 N% h" i0 O: Jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' p8 `: T7 d5 H0 V
.leds = da850_evm_tl_leds,3 I* n( S X" k& p' G
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 E. q- V0 q9 r4 t! l) W};9 \8 q. {) R7 S& f
2 K" I3 p0 v; y' `
static void led_dev_release(struct device *dev); y& a3 p) } c
{
+ Z- v6 |# X/ Y7 D# _, u; e$ Z, _};; j# z. e5 x( r) \% ^( A
4 H5 ?/ s4 i5 D! Gstatic struct platform_device da850_evm_tl_leds_device = {" E! I) q5 J; h3 j, X! M5 R
.name = "leds-gpio",
2 F- W. v: V5 j0 y @1 Q+ Q* w .id = 1,* P W: k5 U, l. [- O* f
.dev = {
' g( @- M7 b4 X! V .platform_data = &da850_evm_tl_leds_pdata,
% k Z' s/ N7 q, A& W- r .release = led_dev_release,
& `7 E9 { j1 y! I' G }% ]; D. `7 _) p1 B9 @! J! w
};
6 R6 \$ R0 D1 z2 D1 O
" t; A: i2 S# m: b. z0 \2 U. C: Bstatic int __init led_platform_init(void)
! a' H0 A8 e5 L8 B6 R; ^/ Q6 r{
1 C9 \4 l6 w: b/ G o5 ? int ret;; h5 B6 j6 @7 x9 \1 Q
#if 0
' {( M- j1 q# G& h1 ^ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
9 }' W& I* r" p: U1 K if (ret)" @2 ?/ q0 v, C. G. T
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"* ]. J) r) }( V9 p2 g
"%d\n", ret);
: U: ]' n1 I S, M#endif2 ]* w& L$ N+ F$ y& A2 J
ret = platform_device_register(&da850_evm_tl_leds_device);
# ]: R1 v* {# t$ G; C$ t if (ret)9 |) \8 D# p, U* }7 o/ S
pr_warning("Could not register som GPIO expander LEDS");, U6 g( A) _# s3 N* j
else
8 r& F p/ r( Z( o printk(KERN_INFO "LED register sucessful!\n");
: P) w7 C/ I( t! H2 ^7 b( s. A; P3 ^
return ret;
U' ?! _% i* Q}
& D y. k/ \5 \! T+ w- H0 k, R: \
( m- a7 R( Z- q/ r3 Pstatic void __exit led_platform_exit(void)
. F* J/ K# _$ R8 C: F1 I! k! G{
! [0 A0 Y' m7 s" f- }6 l* Y* r platform_device_unregister(&da850_evm_tl_leds_device);8 g- f* x* y& y2 d
3 |7 L2 S9 }' S" U# q; K4 T: S6 t
printk(KERN_INFO "LED unregister!\n");
9 Q% Q' v, j+ X. I+ o5 a! T# L}+ Y& p0 U( q+ I4 k6 Z1 [( k( e' ?
7 e5 e! C, I+ d) {# @
module_init(led_platform_init);
: t2 l! v: N3 R ]' D$ z8 j8 cmodule_exit(led_platform_exit);
- }$ @* r5 O6 V& V+ V% @" T3 S) a5 k3 Z7 ^* z$ P+ g
MODULE_DESCRIPTION("Led platform driver");/ M+ G8 d) W e
MODULE_AUTHOR("Tronlong");- r+ h% ^) D0 I& f5 j, Q. A& k7 [
MODULE_LICENSE("GPL");7 i2 G+ C6 L `& K7 C0 x. c* C
& \1 n1 z e/ q4 b) _" `* M& S |
|