|
|
求大神给下面的程序做注解,请稍详细些,谢谢。4 X( P! u- B% Z0 k
#include <linux/init.h>& E4 V, b& t" k8 W6 R( J
#include <linux/module.h>- t4 r7 Z) R7 t% g
#include <linux/kernel.h>
( @, b3 `0 U+ [5 X( j \# z- a/ t#include <linux/types.h>
' M+ \4 j3 U, L#include <linux/gpio.h>. W5 r/ X# j0 }9 u/ r/ m0 |
#include <linux/leds.h>
8 b2 i' S5 v) Q. B. N: Y1 |#include <linux/platform_device.h>* r! Z6 R1 `4 z7 G# h6 u& V+ Y1 }9 x
, M ?# ?9 V& i
#include <asm/mach-types.h>+ H' D# V5 C! a8 M6 S& ] O9 V& L
#include <asm/mach/arch.h>( ^/ X9 S S; ~, M0 {/ l& N4 j
#include <mach/da8xx.h>
2 c: ?6 _/ N9 Q0 ^, o6 k& q#include <mach/mux.h>
3 z- ~: A' \" l5 z( @- s0 t8 |6 y% {( Q
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
: V# _ A5 [/ K; D/ ^#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" e- h( B9 j4 X8 @* A a#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
, ~' @1 U& q$ u7 R% P2 j#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)1 Z) |3 o( N; r9 A t, `( M- u) p
# y" C' Z! A6 i2 \0 G, k
/* assign the tl som board LED-GPIOs*/: w$ r! \( x' M6 t
static const short da850_evm_tl_user_led_pins[] = {
4 o; v: X; a/ p: _$ ]' c+ ? /* These pins are definition at <mach/mux.h> file */. D4 H1 T3 @; t6 u# [5 m
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' ]+ a* c7 v, Q, t( j: k# X r
-1
6 n6 N" z1 B+ x) c$ q};6 a. t* y. k+ A- }9 Y% i8 z
3 u E6 s) f; Xstatic struct gpio_led da850_evm_tl_leds[] = {
# ?- _% v3 I8 D {: C: q1 y" ^/ z6 {' F0 ?, Q
.active_low = 0,
- K( r7 \+ w; A3 V3 b- o: L+ O .gpio = DA850_USER_LED0,
% M4 x9 R' _# S3 z X1 D% c .name = "user_led0",
8 W1 E3 N3 d9 h1 z- Y( s+ M .default_trigger = "default-on",
* u$ l8 h) q' V8 v( k: N8 h },
4 y( N* k7 q3 j. d$ T; q {' k. } w% N' X! Z! ~5 T4 E# h
.active_low = 0,) g3 e A; S" R# J! k
.gpio = DA850_USER_LED1,
9 u3 o1 w5 H V4 n* K5 P; R .name = "user_led1",, D8 f2 E$ a$ }; b# Y, [
.default_trigger = "default-on",
% n0 {! s$ S' m# J( _ },
! h7 h* ~2 y Y4 C$ [. e, e {1 m0 |' H; L/ a5 q( W' z) e
.active_low = 0,
) i2 W7 F# S* Y0 b0 N9 ~+ d .gpio = DA850_USER_LED2,
& n+ r }, T! [: ` .name = "user_led2",8 ]% B X; K3 C' l6 I
.default_trigger = "default-on",
' ^6 h" P2 Y: a7 H, U },3 S3 V' T& X: x7 u# _& F/ _+ r
{2 `( z9 J$ L H# l1 b& j; Y _
.active_low = 0,# O2 _. h2 r! n5 G; e( D
.gpio = DA850_USER_LED3,
5 v; o- Q l$ d0 p2 r9 s .name = "user_led3",
( O/ n9 k0 D0 d" P- r: N .default_trigger = "default-on",( m; a1 l6 q0 L6 D7 \
},
' r# `) {& g0 g- K8 ~, l};, U8 D# T: T- ~; a0 M; i- `
+ f$ G0 i9 g; u1 Q0 w
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: L o% Z2 r) `+ S .leds = da850_evm_tl_leds,, M. T* F/ z/ F
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. \ x# m4 r9 x};
7 `* R" W; Z7 U, ^8 ]% s. c" Z$ T' I3 y0 n5 }) e
static void led_dev_release(struct device *dev)
4 T6 L+ Z) d& s{
1 E; [ X. y. i- R/ x5 M6 s, K};
1 o' N( l7 K9 r. a7 K: }
) \' Y) B5 d8 P7 ^; ]" ?static struct platform_device da850_evm_tl_leds_device = {
. G) K% \8 I5 ~# Z n$ t .name = "leds-gpio",
4 `9 i$ Q$ W* M) r1 _5 P P .id = 1,+ I4 D$ [3 @6 [/ E0 k$ \ _0 R1 P
.dev = {
, z2 o2 h2 i( q; N' z0 z- H/ I .platform_data = &da850_evm_tl_leds_pdata,
2 I; k# s- ?% i3 g& ] ^ .release = led_dev_release,
! e- C6 U0 a( l+ [! k }
* \7 d* T) b: X4 I6 V9 Q};( A* G' z- \7 [# g# U. `
. g; }% V6 e7 Z7 Ustatic int __init led_platform_init(void)6 z! b; M( R. g8 \& H! h
{* z+ u" u& t! E7 O' H' I2 o, t# _
int ret;
- t, X3 P* L' f* ^" T" H3 R( X#if 00 J. `; _. A2 ]& b% H( |
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins); \/ }5 A, P- T! z' t) U f
if (ret)
2 s! J. ^: Z L p# | pr_warning("da850_evm_tl_leds_init : User LED mux failed :"9 K h O; f2 V
"%d\n", ret);9 P9 k c& Y% M( t% J5 [$ [
#endif
2 g( P6 I& u( A8 e5 i4 T5 p& D% m ret = platform_device_register(&da850_evm_tl_leds_device);
N4 y. h+ f: e if (ret)4 C# O) y8 n; G, P: s
pr_warning("Could not register som GPIO expander LEDS");
( X# ^1 \2 i6 d' ] else2 ?, D8 k2 k6 y4 ? f2 {: ?
printk(KERN_INFO "LED register sucessful!\n");9 k. b3 h, `7 ^0 b6 ~
4 X& {- Y' F0 | return ret;
. [9 j6 j" u" D+ s1 w8 a2 \% y}
. Y) e& ?1 W) R- \! P* F# h9 `% W7 y
0 C# `) h* j" w. I! n a0 xstatic void __exit led_platform_exit(void)
- T" |! ?5 H9 w X{
4 [; g4 N* t1 ~6 v8 S7 m: X platform_device_unregister(&da850_evm_tl_leds_device);! r- L8 ~$ y2 W' q% W2 [6 S- k5 d
2 k( Q, D/ ~0 u0 I" l2 y1 s printk(KERN_INFO "LED unregister!\n");
, F. v' f7 k' i& W}% |+ `0 w3 L& D; z$ ?5 G" R2 V
6 G3 P% A% z3 C# e5 Y6 d
module_init(led_platform_init);
0 a' x1 `+ Q; r+ m& [module_exit(led_platform_exit);
# X2 J5 H) n' ^5 `+ d% P8 {# P1 z4 m% r- U4 v, ^# v6 C
MODULE_DESCRIPTION("Led platform driver");
4 M+ Q6 ~' x3 S, f3 o DMODULE_AUTHOR("Tronlong");7 J8 b3 ~" L: D
MODULE_LICENSE("GPL");
$ p& q. M" h. |+ t$ h7 K
# g0 P; w6 J1 n* I# t |
|