|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: b N( L: k* v# P3 {2 g( a#include <linux/init.h>
8 p1 c+ V6 z8 U6 T; I#include <linux/module.h>. e! a( w& q* M; s0 i* G
#include <linux/kernel.h>: Y2 h; H+ N) K# O
#include <linux/types.h>/ `+ l8 Q* C% S" i
#include <linux/gpio.h>
. S1 @) T/ {5 k) [2 ^6 v#include <linux/leds.h>+ E: \+ K6 [ r
#include <linux/platform_device.h>1 i' l. I( T* j0 G5 n% r
# T+ \2 k+ h3 z2 U" H( P" ^+ s
#include <asm/mach-types.h>3 ~" u! f% a# m/ `+ I2 N- ^# q
#include <asm/mach/arch.h>$ W8 a0 Z' j2 V7 F/ h6 ^9 K
#include <mach/da8xx.h>8 ?% F) Z G, o2 J. Z; w$ J3 _
#include <mach/mux.h>9 S+ a2 G& T( c5 D( N
( @* s' L/ Z2 y6 j8 G. r
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ ?. o' n# r+ u$ h, l5 p
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
5 @6 y! t6 g" d e- s. U5 K q#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)7 C" k8 O0 v8 r5 o5 i
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2), e; H' K2 D0 m2 E, e5 M
/ W! u' b5 L' k; f/ ^- W( U, ?1 C
/* assign the tl som board LED-GPIOs*/
' b8 f1 i a- m+ ostatic const short da850_evm_tl_user_led_pins[] = {& J3 Z7 g* T& U
/* These pins are definition at <mach/mux.h> file */
2 R0 s- F" P2 C6 v( Z DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
$ P- y7 K4 |- m -1
8 g' I. z0 x' h};
) n6 i- r/ {' P& a: A9 S
! @+ X( r8 N8 ^1 ^" b7 \static struct gpio_led da850_evm_tl_leds[] = {
4 N% A2 |) d$ A$ t, q+ C {
& x: p& J* w. P4 m .active_low = 0,6 S# K! {+ G- ?/ D
.gpio = DA850_USER_LED0,
% n: Q: J* n [5 @( Y6 a .name = "user_led0",
+ E7 r! @8 T0 P! R% ~: j$ D .default_trigger = "default-on",2 O0 m- Y' O9 e3 C; e/ F
},/ a6 l \3 c! B6 O( a
{
/ h2 m, {0 |' H! u; Y2 P; u4 D; Q2 \ .active_low = 0,
$ \" y$ }7 u1 ~4 q4 H- W .gpio = DA850_USER_LED1,
% B0 \8 M# H, I0 K. B* N- ~, p8 V .name = "user_led1",: N. s0 z* o5 m5 ]$ e
.default_trigger = "default-on",
% H7 Y+ q1 Y7 u },8 P6 t: k+ S. {3 e
{
- T# u! n0 b- N! | .active_low = 0,
/ Z: {3 ^7 u$ E6 y& N5 [7 k1 W .gpio = DA850_USER_LED2,
s+ ^$ e7 N. M) S# P .name = "user_led2",
$ E. l* }, r/ a .default_trigger = "default-on",
; C* D" C8 H; ^! F1 k4 r# V) ` },
8 X2 ]9 E \* I2 o1 x/ H {
& n, F H& l0 m. x .active_low = 0,. s2 V) p5 W* k$ ` g
.gpio = DA850_USER_LED3,
' `! z3 `, t' s9 S" h .name = "user_led3",$ A& Y2 j/ A3 t6 @
.default_trigger = "default-on",
+ W; `( Z- U4 S3 J },
: K6 ]1 [% t% n% T$ D, g4 Z};$ x8 }8 E) L3 F9 m$ Q+ y& R
/ ~0 r2 d1 Y7 `9 istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
" [/ }& h G! ~* J .leds = da850_evm_tl_leds,% G1 j2 R$ q* O& M* P7 `
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
0 O V# ~3 {. d* d5 v8 \) P};
8 Z: j6 D" I* i5 G1 b4 L
7 ?* F1 \3 i+ xstatic void led_dev_release(struct device *dev)
5 [5 ^3 Y. {" i% g Y; s8 ?{0 A: j+ F4 N- }" b2 I$ }6 R* P
};
8 d0 I5 u# h o, u( w6 S
+ y8 \( A* g& W5 d r# d/ C8 Ustatic struct platform_device da850_evm_tl_leds_device = {
& _: ]; b: L4 j0 h7 G' z .name = "leds-gpio",* Z. a; s& J# }8 B: s. p: s
.id = 1,( X% U6 Y% i) |, |. }/ E" r1 \7 b
.dev = {
1 {0 k8 s/ E& [1 p0 o4 N# T .platform_data = &da850_evm_tl_leds_pdata, ]# w& O& d0 p; ?
.release = led_dev_release,# z7 R. {/ t! X V/ }
}
: y# A& ~9 y* O1 ~};
; J& R& d0 j5 Y4 h4 B1 ?( b
2 a$ n* G7 Y1 `static int __init led_platform_init(void)6 [ b$ K% P0 p$ r: m
{5 P+ \0 l! U& N9 B0 n: Y
int ret;* N F; V( p9 m1 m2 R7 t8 j
#if 0+ T5 H; Z+ b" J* ?
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 M' T- L( K* s6 Z& ~$ H% D: P if (ret)
: W1 L3 ]/ _) ]+ Z! K pr_warning("da850_evm_tl_leds_init : User LED mux failed :"5 L5 @+ ]# q3 w3 c
"%d\n", ret);
6 I# b5 H1 H; k/ H) j0 [#endif
% V+ {2 c- ^! U+ B ret = platform_device_register(&da850_evm_tl_leds_device);
+ h" W7 X) ~1 L! `9 c5 v if (ret)
; n4 ]4 l3 c& g- j+ w pr_warning("Could not register som GPIO expander LEDS");/ P8 k+ K e" t" M- q E; W
else
, }# p$ f4 \! Y8 k1 A6 [ printk(KERN_INFO "LED register sucessful!\n");
/ W" C$ }( k% ^. J* C9 S6 E. r) j- D6 k* H8 ?; I. t! c9 m& M% ]
return ret;! v7 B: L; \& y5 p
}
7 S- I `+ A4 g
! F' z0 o+ O& p4 w/ b! R7 t6 w1 sstatic void __exit led_platform_exit(void)
& u, E9 G% N6 A% A& @{/ ` Z% s) [% K) p2 b
platform_device_unregister(&da850_evm_tl_leds_device);4 B- _, e! K- z2 J1 ?
1 i# k' W4 C+ ^' v' M" \3 ]9 g printk(KERN_INFO "LED unregister!\n");) ^1 {8 k3 e# l' {) U7 [- Y
}
$ K; ]$ G0 p8 I: h6 j, u. j- }9 A0 L+ _9 r$ n% X; q9 e% F
module_init(led_platform_init);6 U8 c! {6 T: s P
module_exit(led_platform_exit);% Z7 L! ^# y9 x$ V
; o, b1 h6 _# L D
MODULE_DESCRIPTION("Led platform driver");, G1 U ^8 q9 F8 M, d
MODULE_AUTHOR("Tronlong");9 h) z( E1 J8 {" O0 N
MODULE_LICENSE("GPL");
w9 _9 z! j5 l" k- ^8 u9 \4 G
4 P( ^9 A; ?! `$ `- | X |
|