|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ |2 N0 Y) y% }* r) P z3 [#include <linux/init.h>
% y8 B! a4 m* {& c#include <linux/module.h>! X f7 |7 g+ U" ^: Z5 |2 l
#include <linux/kernel.h>
" r; @% G0 d4 d% h0 U( x0 F, q#include <linux/types.h>0 ~2 x0 X* b# [9 U- X) y9 B
#include <linux/gpio.h>
, N% T/ T/ a3 p9 q2 t#include <linux/leds.h>
, V' B. G6 b' J8 n#include <linux/platform_device.h>
/ x" T( X+ L1 s5 |0 I" O; Q1 |5 ^' L$ d5 G8 {' R" g- h
#include <asm/mach-types.h>
$ p! F) I" I E3 e9 d#include <asm/mach/arch.h>1 g% [: P5 ?% p, z$ R& H$ d0 D
#include <mach/da8xx.h>% [$ e/ H2 y, U: M& p9 h
#include <mach/mux.h>
1 x2 i3 {, t; N. y# {
9 I3 W, Z4 l9 o+ a1 z, m* U0 X6 d#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 L; M5 q% K. w6 T+ M$ b6 i$ h4 Y3 R#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
0 a0 z t; Y; l7 N3 |8 E#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 |) y5 k) k% g( K' A4 I
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)( {" T$ k/ C; i; M$ ]; v% H
2 R. _# L- Z; o* g: c2 m+ [/* assign the tl som board LED-GPIOs*/
5 f- [1 ~0 U0 H( ?. R( Y, Istatic const short da850_evm_tl_user_led_pins[] = {
4 G3 T, `& B- ?2 N( c/ ^- A, A /* These pins are definition at <mach/mux.h> file */
1 D6 M- ~# E' ?) W$ C2 G DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,/ m/ r9 W# c Q: |
-10 h. F( a! u/ \* ^$ _/ `3 ~2 ?
};. b2 I$ U6 {- J' F# t; S
- R" N+ X5 ~4 I$ a0 n
static struct gpio_led da850_evm_tl_leds[] = {
4 \( W* [" |" M {
2 z% S- D* @ X/ u9 a .active_low = 0,! S$ x, |( ]* m! ]3 F. X' K
.gpio = DA850_USER_LED0,
2 Q6 R' m' k9 d0 m( F .name = "user_led0",
2 y- i3 R X: f% y" \" L0 ` .default_trigger = "default-on",0 ^9 ~% N$ V3 B$ r; p7 y: W* ^
},
5 z/ u0 k' l, n4 J( i {
9 W0 P( C. @2 i. r8 r& l .active_low = 0,
/ y3 F3 E' z6 k. V. `6 j .gpio = DA850_USER_LED1,; w5 Z! ]7 d; @9 t% Q8 c7 N. y( R; x
.name = "user_led1",5 n! ?4 r; w, {3 A6 D4 E8 L
.default_trigger = "default-on",& `9 v( s0 B4 i. V7 u" `
},
( Q7 a# a, [/ g2 F4 T {; E) o" o- z8 B' a. f: @
.active_low = 0,
( D! X' i1 b* c/ ` .gpio = DA850_USER_LED2,% i1 `7 [+ }3 V, ?
.name = "user_led2",
& n2 u9 U8 F; f# u .default_trigger = "default-on",; n A' y' @' Z7 j" \& _4 m
},/ F1 [: U( d" m9 R, K# \
{
* R. N ]2 ?& o9 J( F .active_low = 0,
Y( p1 ?0 t: x8 Q .gpio = DA850_USER_LED3,1 c6 z* I- |: L7 T+ P2 t2 `7 e3 s- w
.name = "user_led3",
2 z5 V+ R. H/ z4 m$ e .default_trigger = "default-on",
7 X* @1 F) u/ Z. J: s& w },/ X3 s: z# ~ U4 G7 K
};
2 q+ m, O- ?% _6 O# w8 T- M- l* V/ G
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
5 @4 T" Z- l+ W( K6 H/ h7 o .leds = da850_evm_tl_leds,
- Q8 p. \ q) i% ~ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 q8 g1 V7 y+ @};
' \6 `4 O1 o# N- W& a2 L# p C; o! c" w/ ~9 G! K
static void led_dev_release(struct device *dev)9 k, f& Q( U" ?$ ]
{
! V, w0 }& }, q* c) X6 q};
; }' A# G/ h. K. s/ _8 y, `( i. M& } Q! f7 z: J9 y: f2 H' w" N: P
static struct platform_device da850_evm_tl_leds_device = {0 d" a# C( ]# W6 q! S1 J5 |8 {2 C
.name = "leds-gpio", e& k) ], u4 h2 j. v' ^
.id = 1,$ X! t0 f" q* k( E, a3 i8 R$ H
.dev = {
/ G' N5 Y1 Z" ^ B* d .platform_data = &da850_evm_tl_leds_pdata,
. P% X @! J& @ .release = led_dev_release,
( c) `* N! n) B) Y2 g, n9 o+ n% _ }
1 R) t8 e% |+ q7 i8 J};% i: V M, i" I5 r% _
- x5 E9 s3 a) x- N
static int __init led_platform_init(void)1 V7 }1 @+ R# n) [: l
{7 R5 d7 q- b% ^' s p% q Z
int ret;
" [* Q! q8 ]6 U; e D9 n1 ]#if 0! I1 ?7 h# ]/ G" [0 V6 m
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 n0 y4 e, ?+ \) `1 i f if (ret)
9 \3 _$ ]" o' r: A) d8 `% w pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ c2 D- W, v) i- z- q+ S
"%d\n", ret);9 l( y2 G' c7 C( v9 s5 v& g9 s1 X
#endif
6 R8 N5 ^8 E3 d7 q- j5 k# l ret = platform_device_register(&da850_evm_tl_leds_device);
" }3 n, ?# [2 i5 w/ y. l5 W- | if (ret)3 i' i6 F6 T% U" S
pr_warning("Could not register som GPIO expander LEDS");
2 W. W- X9 G2 _7 Z else
# h V8 w5 f5 T+ X printk(KERN_INFO "LED register sucessful!\n");
$ [. f; R" g* l" n9 d
4 {. M6 K: O, z9 V" r$ T/ Y return ret;
2 y- V8 }( i) O2 u4 r+ _" v* z}
z) R- v, x7 N! f# X! Y! s" N" B3 }8 P
static void __exit led_platform_exit(void)0 j" I8 F2 |* j- ~4 _+ J' O: v) y3 o$ V
{
7 G6 N8 J& h- U- H1 s platform_device_unregister(&da850_evm_tl_leds_device);0 M; W1 a/ _+ ]- z% a l9 z0 B9 R
% u. O" f% h7 z5 M7 Q printk(KERN_INFO "LED unregister!\n");+ s. N% b( X: J# T2 Q6 v& d
}
- J% Y# ~- x5 d- S9 E7 H; B' y& f: a( L b- v& g
module_init(led_platform_init);- U" i* C3 @8 G7 V
module_exit(led_platform_exit);
9 }9 F% b7 W$ z, Y6 ]1 x8 t9 D; `- N- G' ]- W7 x, q, j+ P0 |& ?
MODULE_DESCRIPTION("Led platform driver");" G$ S. O J9 S0 s' l+ F5 P0 P- Z, v2 T
MODULE_AUTHOR("Tronlong"); O8 m R( W& S% S# v) H. X. x
MODULE_LICENSE("GPL");& r5 j; o4 t5 q+ h6 `
4 D5 \5 ^' K) }# m) I |
|