|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 a3 ~' G" X9 x. V$ U
#include <linux/init.h>
" s d3 f0 z4 {2 c#include <linux/module.h>" Y: J7 a1 r2 U
#include <linux/kernel.h>0 c' v R$ b6 ^/ J
#include <linux/types.h>* [- N& n% q* b3 K
#include <linux/gpio.h>
0 [' y! ~" X' r+ {#include <linux/leds.h>
; z' p: D2 [* {. F- N" l#include <linux/platform_device.h>& t2 @( G R# l
I' Y7 D+ P& [7 h t2 _; a#include <asm/mach-types.h>
7 K8 I9 z- e6 l/ f2 K9 j: l#include <asm/mach/arch.h>; u+ P: W! m; N
#include <mach/da8xx.h>! U( Q- {" w; q$ y9 [( h
#include <mach/mux.h>
; Z2 u7 E( N& p% W0 @% ^# f. q$ j" K1 R7 e7 U, W t6 o% {+ b3 E j
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( T3 y) a" J! b( I6 q0 ?#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) N$ z) ?% }3 _0 V; S6 P
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)' I% G$ w8 s$ B" G' O$ j0 z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- N V# a8 w7 d' q. n+ L3 @5 q j1 y: U3 N& v; G' V, t
/* assign the tl som board LED-GPIOs*/( f1 h+ N2 v! \% a# C: C# x# r I9 p
static const short da850_evm_tl_user_led_pins[] = {: Q0 H/ o6 O7 Z4 b2 r; N |9 E
/* These pins are definition at <mach/mux.h> file */
2 l6 u l2 s# a0 i1 X DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 y) G( j8 u& B8 y$ F -14 Y6 ^. i$ R0 G/ A; H
};+ g( I# q% ^2 {: ^ q
+ i$ {3 C" N" S
static struct gpio_led da850_evm_tl_leds[] = {: z' y! a' f; Q/ o, ~( \- {3 X' f
{5 P p6 r% V C. b% u. @% y
.active_low = 0,
% b$ }. o2 {" l6 p+ Q1 y .gpio = DA850_USER_LED0,
' V1 e5 _- H* f4 G+ U. c2 B9 k .name = "user_led0",
5 ~& |. Y" {9 W: b S, v4 z .default_trigger = "default-on",
3 g9 L) Z( r9 H },: w r0 G& v; G1 D& H' \
{
& e7 Q' K2 I/ F! C3 t8 E0 z9 f8 | .active_low = 0,& z9 |: a1 f9 g* Z4 Z, h
.gpio = DA850_USER_LED1,$ m2 N& m8 E+ w5 o
.name = "user_led1",
/ t5 ]7 |; ^. `$ {" r% V- D' `! ` .default_trigger = "default-on",$ i7 ^. g' z) g x1 f' U" l
},
8 k5 W9 U( R8 o2 \1 z S {3 u! \2 S- h* f p6 a4 r
.active_low = 0," m# B& Z/ f! f+ q2 z$ I/ J9 p0 c$ v" j
.gpio = DA850_USER_LED2,
$ k0 i) x. ~4 g4 n( o .name = "user_led2",3 ]/ B7 \/ j. O( k; N
.default_trigger = "default-on",# ?6 U y5 {- c
},5 x B7 V, G) F
{* A4 _ \" p: C
.active_low = 0,
- t, I$ ?! }3 ?8 f7 ] .gpio = DA850_USER_LED3,0 X" [) L; c: e/ z
.name = "user_led3",
# e) C8 T! o( F) q. ]' W* V# K6 m .default_trigger = "default-on",
0 p4 e2 I% L) ` E1 P },; u7 W& f$ U5 R' R; b
};9 \5 H3 h5 ^. b# E: \5 h
$ Q7 x( j K1 O( D2 v/ Qstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = { O% W1 q- E7 [+ B1 ~& c A
.leds = da850_evm_tl_leds,7 O+ Z! d0 h5 r( L
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
9 j [- W: U% j1 B" X: o6 R};
# g6 ?% [4 c G# T0 Z: X5 ~3 L+ Z, ^# K5 w! D
static void led_dev_release(struct device *dev)) o/ w3 `1 t& {$ ?) p
{) g# a3 S% D1 a t0 K" a# B
};6 Z& R; X7 M8 b, v- u. t
( ^$ J& [0 P& w7 m% i) x
static struct platform_device da850_evm_tl_leds_device = {% b1 p* c# x: M5 Y
.name = "leds-gpio",+ s: c0 G5 r s2 E4 u
.id = 1,
: ^) G6 O7 Z) c% V# f: y, Q8 a .dev = { V/ {8 [7 z0 c d: K
.platform_data = &da850_evm_tl_leds_pdata,1 S% G+ L" B0 G$ W/ j0 w
.release = led_dev_release,7 O$ s, M b9 F
}; G' [; s" h7 P y) I$ K
};
" ^3 U2 |; k' d. Z. _( r. ~8 K; L; h5 J$ z- \/ s" n2 j
static int __init led_platform_init(void)6 E0 H% [) v8 I' m' T+ [6 x
{; c) y* c9 D" y) @# @* ~2 q5 g
int ret;7 y4 X1 S H' U
#if 0
. k8 ]# J3 L) K3 J% h5 b. I ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 X0 Z1 C: ^2 x; w1 k
if (ret)" B, j" B% u; d A8 \. ~% l
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
* W" n1 v( y6 O- u7 s0 N "%d\n", ret);
6 c/ G3 y7 {$ U0 E& e. L$ M p# T#endif
V( \8 e# F* I8 }3 d ret = platform_device_register(&da850_evm_tl_leds_device);
' w/ |# k( E) A if (ret). V! ~9 f3 E/ e) M' K. |( E7 H
pr_warning("Could not register som GPIO expander LEDS");
' h+ |6 `- r6 l else
9 q; E+ e7 B. F- i) C; C6 [ printk(KERN_INFO "LED register sucessful!\n");
# R$ n8 U j! O9 H& _* n/ ]0 p& f' [ C4 T& t D* H5 s% w
return ret;( Y. L( p8 \4 e8 |* O
}$ o# g F' C+ W L+ E) e
$ ^+ G0 r' f! S3 W; X6 z
static void __exit led_platform_exit(void), g: X' o- ?! ^$ {: w. \
{
" M- F+ g$ b( t9 u" h: f! y: G platform_device_unregister(&da850_evm_tl_leds_device);
& F1 P, d2 I0 T1 V: a3 \# @
/ F1 Z3 o) x# R5 Z printk(KERN_INFO "LED unregister!\n");" x6 o) b4 Y" T
}
& u: o5 g7 S" ^# k. ~/ K' ]; X- x1 y, N1 o3 B
module_init(led_platform_init);9 E- t; I8 ` Q
module_exit(led_platform_exit);/ }, t% B0 d) J7 Z" m. M
1 x* S8 `& l/ p0 c& }
MODULE_DESCRIPTION("Led platform driver");! X+ l3 ^4 |+ [
MODULE_AUTHOR("Tronlong");
* G0 @4 A# H+ y; r4 dMODULE_LICENSE("GPL");( ^) M+ {. E$ z v
# u1 D5 x& {/ y4 g `$ g |
|