|
|
求大神给下面的程序做注解,请稍详细些,谢谢。) V, ^ F! n0 A& c
#include <linux/init.h>0 o3 T6 U9 @# W, L9 T( i5 f
#include <linux/module.h>7 ]/ [9 U. ?2 g5 h5 r
#include <linux/kernel.h>
, ]* O9 Q' ]0 x#include <linux/types.h>) G& j& {6 L3 p9 C* X k. f
#include <linux/gpio.h>! U* M. X% e3 O9 y& c- Z& G
#include <linux/leds.h>
% \& o1 |7 c# v0 T5 h#include <linux/platform_device.h>& W4 o- \) [1 G) Z) k' Q4 N
6 [; `, p$ O3 M; D
#include <asm/mach-types.h>" d- M/ T, v, |+ W3 I/ k( g
#include <asm/mach/arch.h>
/ S3 p+ ^ U+ M4 j( X#include <mach/da8xx.h>
7 r, s3 {7 R8 r& j#include <mach/mux.h>2 U7 r& i& \1 ^% s. v
) L3 z( w" s$ k* n" e# ?#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ T- j/ h+ q0 z8 M# E
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 @4 x$ N$ r6 D0 c4 z, z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)+ W# F0 q7 I# l8 @: J
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
, ~: i1 k, J0 d0 i( F
6 g, y0 I3 s+ ~5 X- i/* assign the tl som board LED-GPIOs*/
8 p8 L3 n4 G; w/ G- ?, `static const short da850_evm_tl_user_led_pins[] = {, v, F) v" n' w6 T, i) R, O
/* These pins are definition at <mach/mux.h> file */0 y* `& m" m- v! ^7 C6 P+ I5 _
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
4 q+ _4 J4 _6 L* S& ^ -12 f" M [& T9 W5 {! L3 w
}; C+ [' j; t" Y9 w( ]
/ U' E6 s7 W6 _' k( @static struct gpio_led da850_evm_tl_leds[] = {
& }2 j! b& y" L2 ^; Y8 i) | {
+ _- v# e; ~& ~ @3 a3 R7 B" j .active_low = 0,
0 @7 n/ s9 o* A& d5 R. @$ g. S .gpio = DA850_USER_LED0,
& d2 N0 Z' |6 C! Z8 j" ^+ p; b .name = "user_led0",5 m3 S/ L' T% d( r- `% [/ A3 b# G
.default_trigger = "default-on",# K# k% f0 c- d7 R: [
}, o4 e$ D' O- ?: A+ |0 F. [8 b# K
{2 P" t& G M) V4 ]) \
.active_low = 0,, g2 ?8 _+ b% i+ [& [
.gpio = DA850_USER_LED1,; X) I5 B1 M4 ?0 F. U6 o2 S/ j) p
.name = "user_led1",3 g8 `/ c! ^/ t2 s2 z1 r) c* k2 V
.default_trigger = "default-on",
. s' @# A$ v! D2 d: D },
J# o$ G7 J- l5 \# l9 s {
: y! R) i+ D G- S .active_low = 0,- q- R' D- h6 H7 {& U
.gpio = DA850_USER_LED2,
7 _0 p% J! @* O1 d- k4 A7 j: w .name = "user_led2",9 L7 ` F' y6 v7 |/ e% V1 |2 E" e
.default_trigger = "default-on",% B: Y$ r: c3 P0 b, \
},
, X0 u( L. z2 j7 o* | {
) A% N% v5 Q+ W7 c .active_low = 0,* ]& d5 P5 W, |! z
.gpio = DA850_USER_LED3,
; ], a) j x5 @/ ?9 k' G% g .name = "user_led3",% z6 b2 p5 l# L5 L
.default_trigger = "default-on",4 t( _+ Q. P' _4 k6 A: p
},! w, ~# c$ o7 Q. v5 _
};
7 C5 p$ ?5 ~8 y0 X+ c$ ^/ G6 @4 B+ o/ S' {! L
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% ]) B9 g; H7 p4 ], A .leds = da850_evm_tl_leds,
( v$ y8 T& n/ t) e$ `; p- N6 y( F .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 b1 A R& u* F: o/ W/ x; [};
# w5 W8 G4 c. @! S2 n5 J" ? j1 x5 o( Y' j. N+ H
static void led_dev_release(struct device *dev)) y0 C# ]5 y; y. }% z. a" c
{
# Y+ v6 f ^7 Z5 E/ {" Z};
4 L- Z- P! I4 |$ j! v4 f7 U+ a% x/ o8 z O2 G6 i& S5 o
static struct platform_device da850_evm_tl_leds_device = {2 L3 z* {4 }% h' r1 w" R9 W
.name = "leds-gpio",
4 L: a. G% a0 K/ t# H$ u0 ~ .id = 1,; C9 t2 I3 x' { C7 N7 h: c7 n( M/ c
.dev = {2 |! c$ O1 V ?
.platform_data = &da850_evm_tl_leds_pdata,9 q+ ]3 o) I% }% u9 U+ h9 i0 x
.release = led_dev_release,, S2 M) f& o( @5 o Q( Y
}
; p, Q1 J$ j% h) H) h' T/ z};" z% u4 h- b1 v
/ I9 e" ~+ z- T* M2 }. j8 m- D% Q/ xstatic int __init led_platform_init(void)- |+ i+ _2 f; S1 R% O
{( Q! ?4 v2 M5 R5 |! K
int ret;
( p7 z; {" }5 w5 F#if 0
9 j r! p8 X5 i7 X9 x/ B ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 n% s% E$ j H$ _' \8 w' @1 A/ Q4 Z# U
if (ret)7 @% F) V& l$ L* F, {
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"( Y# G$ ~0 i7 w6 a( F
"%d\n", ret);
/ ?; B/ g. W n" H3 E- P#endif, c$ w+ z6 N/ J4 x
ret = platform_device_register(&da850_evm_tl_leds_device);
6 x7 Q5 ~& Y4 }7 Z! Z" w if (ret)& v! i l4 J/ y3 _
pr_warning("Could not register som GPIO expander LEDS");9 e) P5 B1 z9 }
else
0 R; @! R+ Y; T4 d" ^: } printk(KERN_INFO "LED register sucessful!\n");. [% N. w6 K4 A0 t
7 Z$ ?# s/ V+ F/ y return ret;
0 Y7 C4 a( R& x6 _( {( b$ `: b. s}
# }5 M' e2 M7 |# ^. o ^
7 C+ X2 g1 g: Z! O4 O5 istatic void __exit led_platform_exit(void)
+ v: q5 O1 C6 _: h{2 m; K$ p4 b. b& Y; I
platform_device_unregister(&da850_evm_tl_leds_device);' c A# E0 R0 W. _
3 V& w/ ]7 V0 l- s. |7 b, s
printk(KERN_INFO "LED unregister!\n");
8 r$ T) F3 X( b}8 S4 J& `5 w. y6 w! B8 g
5 b$ O7 r) \: j* l7 O0 J" U
module_init(led_platform_init);- K6 j9 T. ?( {
module_exit(led_platform_exit);# F6 D) s" O4 k1 j) N% q
. E% F g0 \0 B( {MODULE_DESCRIPTION("Led platform driver");# b) Z$ A) X5 N
MODULE_AUTHOR("Tronlong");1 e3 b8 R/ f; J, S
MODULE_LICENSE("GPL");
3 h9 g# s4 K/ d& i1 \4 D0 q$ ~0 i1 I% _" C, I* o# P8 n& l/ R
|
|