|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* U, Z5 \0 \# Z- m/ P! Q$ O
#include <linux/init.h>
4 Q) l/ ~( v6 i2 O) O. T0 A#include <linux/module.h>" i9 p! d+ r9 ^# i$ t: h, t2 l
#include <linux/kernel.h>
1 y. A7 E2 N L" ^( D4 x8 @6 e o% A#include <linux/types.h>
" [5 q. @1 `! q4 X* Q8 ~#include <linux/gpio.h>! R& v$ ?' R; D3 g
#include <linux/leds.h>
V$ m+ N1 j% G+ w, Y8 z#include <linux/platform_device.h>
, q5 u# m0 V3 i4 ? E! B d) H1 z% e8 \ ?+ F1 W
#include <asm/mach-types.h>; G2 H7 g" X4 `
#include <asm/mach/arch.h>" H% l4 e4 ]( k2 T
#include <mach/da8xx.h>
, k7 c6 o7 c; K: L8 t#include <mach/mux.h>6 p2 K4 ]. @6 S" u) s5 G; `
: W) W- v5 \/ t# w, k
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
1 T- c5 c' `# e' f* h#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
7 d9 u6 o: K6 a& h#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
# Z. t4 a! \$ o z6 b0 U6 G#define DA850_USER_LED3 GPIO_TO_PIN(0, 2), P2 [9 [2 V( y' g& B
, B' S# P/ S' j! }/ q9 b7 G
/* assign the tl som board LED-GPIOs*/5 s# w2 I! |& o" r+ |- d
static const short da850_evm_tl_user_led_pins[] = {
* l2 C* Y. v! s8 t! _( D6 d /* These pins are definition at <mach/mux.h> file */9 o& K; N6 {; x: G
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,/ t+ y3 N4 \0 j# S3 y( w
-1
, o ]7 l; f+ }# {3 o: k; L};
& b% R8 c7 Y! A- U6 K- z- q. T% L6 g' k$ o
static struct gpio_led da850_evm_tl_leds[] = {7 U. i. |; |8 V# W- a* t' a
{
3 ~1 f" \0 S9 L, k5 q, G .active_low = 0,
) d9 E" |; y7 w5 }# }) n% t- c4 X! r .gpio = DA850_USER_LED0,5 O( h4 L6 K1 p& R
.name = "user_led0",0 L% y4 W0 n7 S/ [" L2 n! Y
.default_trigger = "default-on",- N* H# p% s2 J1 C3 R& q
},$ g$ a4 c2 e& L1 C7 p9 r
{) s$ y( ?1 [( y& T D! \! @
.active_low = 0,
- A5 [: D& `3 s6 o .gpio = DA850_USER_LED1,
( M; K u" g% E! ^, E5 W; v .name = "user_led1"," y- S, Z3 m2 U* R4 r3 n
.default_trigger = "default-on",
* ^. Y, s/ K3 D; o( b2 \ },
" `& ?+ q! z% ? {: M; |9 @6 K- D, o
.active_low = 0,9 E9 Y; Q- {& K$ o. T, E
.gpio = DA850_USER_LED2,
; N4 i* r% ~3 b% [ .name = "user_led2",: o, m9 `6 v% N7 v3 ?8 V
.default_trigger = "default-on",
$ t6 h2 V" W Y. Y$ M/ r },
1 |+ G( x" K' R9 H$ t {
8 T1 V" Q0 Y/ {6 G& w+ J# e+ @2 f .active_low = 0,
5 X0 G. s+ _/ B .gpio = DA850_USER_LED3,4 v) u$ T+ X- H6 q/ V; l
.name = "user_led3",3 X3 b/ Y+ r" A+ y8 F/ h& X
.default_trigger = "default-on",2 A& q/ N) [ Z3 k/ ~
},1 ]2 v B- w9 U4 t
};
. R5 Z/ N, d$ u
( h" b" r# E; }3 K, ~) fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, i, e: T, P m) g4 M C# y# R .leds = da850_evm_tl_leds,
" E4 O6 ^5 X" ]# H' { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. i% u0 s8 ~% q8 B2 A' V) ?};
) C7 `6 |$ h0 L v' U5 ^+ V! K3 w( c) O; \0 A5 v; @' G
static void led_dev_release(struct device *dev)
# \' n4 e2 ?0 f* _9 W' o6 X$ t{6 Q7 ~6 E5 W$ {
};
5 [9 s$ e; {( Z w8 w2 f# S x0 H# D1 ~- n% G& ]+ { }& |4 X
static struct platform_device da850_evm_tl_leds_device = {
- O* S2 _' L) Q) r: D; X/ J$ v .name = "leds-gpio",
& h5 ~' {9 R- ~7 ^: n' I .id = 1,
8 S! L' J9 h; X6 a" h2 C+ M: R .dev = {
: K/ q2 |. n/ W) }# P& o! W .platform_data = &da850_evm_tl_leds_pdata,( z+ X. P- D7 e2 [! {9 f h+ j0 w
.release = led_dev_release,
Q4 z; d2 D/ b% M7 w9 @ }, e7 E( S+ L0 v% U# E
};
c, s: J0 r0 y+ y+ L. G- J5 E
L) F+ z( D1 q m# C& ~( ?/ Astatic int __init led_platform_init(void)
: y& O" Q/ z8 j. F{* F% z% t" T% q8 Z. F5 X
int ret;% I) ]4 W4 J+ |( O L6 k: F# B
#if 0
7 t# n( W6 x* Y% z+ ]. B5 G ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 W" K8 K+ G8 Q
if (ret)
/ f2 r3 r/ H8 m6 C3 ^: S pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; U* E8 i% K5 n
"%d\n", ret);
2 ~$ E7 G" B2 ]$ E. A#endif
7 |" ], s. M/ V. r( l- q ret = platform_device_register(&da850_evm_tl_leds_device);
0 Q/ w% A' G% E if (ret)+ b# F( h8 Y/ Y
pr_warning("Could not register som GPIO expander LEDS");
2 c+ a& O) I6 C0 g) t else5 C8 o) y+ s1 ^
printk(KERN_INFO "LED register sucessful!\n");
; y7 W# {& V3 H3 @6 F5 u0 y4 C
4 I3 \4 l, y' t0 D# o8 C' O Z return ret;% | U/ P! y9 g( g4 q! f3 h
}
* O0 c+ n( V/ q- \& ~, c2 @7 |1 R! G; l1 l5 G
static void __exit led_platform_exit(void)
3 O1 G4 U& {, p$ L7 y" ?4 |8 g& S; r{$ s7 T, @7 J* U# |8 ` D- b
platform_device_unregister(&da850_evm_tl_leds_device);& H# r( z. J8 u% M1 `& n2 Y& j, P( g
/ b- {8 U9 K H- m* H& F printk(KERN_INFO "LED unregister!\n");& J8 z2 R L; T( h( N$ A
}
# I/ g" A u4 M8 L0 J1 a7 j1 S$ p$ z0 f7 z* [
module_init(led_platform_init);
' k( d2 T8 u8 B) W* x8 S1 L5 rmodule_exit(led_platform_exit);
5 E* l5 [( f# P" m7 c6 o' y) [# d/ H+ M3 g) w
MODULE_DESCRIPTION("Led platform driver");; K7 }7 {3 T( m3 P e0 e' o, z* {
MODULE_AUTHOR("Tronlong");
( l0 R, w% \$ i3 g; J2 U7 ]MODULE_LICENSE("GPL");, M, P: h& V/ Z" ]& E o6 w1 _
6 Q2 C& g% q6 X; t |
|