|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
5 F; @. r" O( G' k5 o" R4 Z#include <linux/init.h>$ N7 o5 ?0 ?5 L- k
#include <linux/module.h>& {3 X$ F' r( ]8 d4 j
#include <linux/kernel.h>
; L& a; N! o& ~8 c#include <linux/types.h>" H/ R& X; w. i* w8 f# g
#include <linux/gpio.h>" Q+ W5 x2 R; q* s8 E' D
#include <linux/leds.h>$ O) Z# {5 i0 h$ J$ U: D
#include <linux/platform_device.h>' J$ s( W- U. r! E' Y# V: P5 [
$ r5 f( @+ a' B# Y+ c, p( q S#include <asm/mach-types.h>
/ B* G9 h+ y+ I0 D/ Z4 X#include <asm/mach/arch.h>
8 J1 O4 ~ H+ v& `! }& `#include <mach/da8xx.h>
2 }. w9 I. e& ~) G#include <mach/mux.h>+ d/ N& p! n R7 b
4 h( P. U, j F: b
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
5 r0 Y, \( {4 _- r# ~7 _ Z#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- D4 ]+ _& B, B. i#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
6 r3 E/ o, k: ? \#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 ~7 @0 K& S( m4 J* F
/ B8 ]6 g6 h N: D+ {: v! A/* assign the tl som board LED-GPIOs*/0 R8 A8 Y3 r8 Q7 |
static const short da850_evm_tl_user_led_pins[] = {
# u( C/ [% t3 f& O/ E% D1 G7 Q; x /* These pins are definition at <mach/mux.h> file */+ ]6 ]0 H ~/ k' u
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" O* G9 J2 \$ T& \! X0 C5 ] D1 [+ [ -1
! k9 h. a: w2 [2 Q6 p8 J};
% q+ ]: C% t2 l. H7 {$ j
' V, x" Y, V; l1 G, istatic struct gpio_led da850_evm_tl_leds[] = {
% R5 ^* M3 K: I5 x/ q, k {
0 b6 ]% O* b% g2 ]+ j9 k2 `4 c .active_low = 0,( w# j, a- Y0 b
.gpio = DA850_USER_LED0,4 h# Z" A1 v- \4 z. a
.name = "user_led0",$ z: J3 w B9 x3 A2 U
.default_trigger = "default-on",+ P) A% D5 d8 d( i# S
},
" G, E' p) Y& }$ b; G+ K: ]' b {5 O# B0 w" e% f3 a) E! w0 }0 C5 C1 ]4 S
.active_low = 0,$ x$ ^: H; j8 C" M' q
.gpio = DA850_USER_LED1,
- e0 t9 g6 _8 N+ E .name = "user_led1",
3 e/ Q) Y0 b0 w2 e. G .default_trigger = "default-on",
9 N1 p! U) }' n" z },8 M# N- S, y% X
{9 ?$ [ k3 u: k
.active_low = 0,
5 _8 w0 \, p: r% r6 i .gpio = DA850_USER_LED2,% s# A% o: Z% Z9 |
.name = "user_led2",/ S: x- V o' ^8 s
.default_trigger = "default-on",( R9 Y) T/ r6 m- X" Y. F
},
" H8 e. j) z, ?+ f6 U' I {* j0 K: W2 |! _4 B
.active_low = 0,- V/ f+ U5 y9 o4 h: D" Q0 p
.gpio = DA850_USER_LED3,: F' ^* c i5 B! ~
.name = "user_led3",
8 K* _, ~1 n" N" s9 R/ Z: n3 R; f7 T3 I .default_trigger = "default-on",/ y, y* z3 R* k8 L" d
},
4 ?9 c6 h$ x/ W( H: t, W2 Z- g3 r};
; _+ U7 ^ \3 i4 H2 g
' ~# z# W) W+ c8 o' X- h) Cstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
" X/ f0 y* u& y# T .leds = da850_evm_tl_leds,
. r7 r' h* j) n; R) H0 w" i; P- ~ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),# X0 h. r% A4 w+ f3 D; I
};; D4 a. u% k9 n5 C4 `: J
. z$ W4 U2 l2 k' y8 `% Y5 ]static void led_dev_release(struct device *dev)$ M" q5 n- h) x3 G9 M
{
" f# r( ^$ { L};
# S/ p3 h/ i+ W. k
c, I& d1 A' j/ @static struct platform_device da850_evm_tl_leds_device = {
6 v: v |+ s3 P8 r* Z( Z .name = "leds-gpio",5 {- V- ^8 x0 W8 w! k8 K
.id = 1,+ Y) |% R; n6 y1 s, G, c: N
.dev = {/ q5 z* e+ @0 _
.platform_data = &da850_evm_tl_leds_pdata,
" K/ u% J+ G Z2 m& d1 V .release = led_dev_release,* H# G+ D+ ~- B4 L8 U: ?
}1 n. l7 R c4 l$ Z* v
};
: [4 d) K; f0 \8 `
* K: j3 ?1 l- fstatic int __init led_platform_init(void)+ m6 u& C' m2 z1 a
{3 ` O" d- o# J( r
int ret;
# X3 g* Y# ]/ s# E4 a#if 0; L# w2 M! i' q- D* V b
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
" I3 `) q! M- g9 b7 X. L6 T if (ret)/ e# X4 p2 [, k1 g @) _& L8 I
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 A) y' G8 ~) {- ]! s0 J! j" E "%d\n", ret);
9 _0 ]9 G5 p$ E#endif) F9 q- Q0 ?* A! X4 a2 p# g
ret = platform_device_register(&da850_evm_tl_leds_device);7 J! s! `1 f5 Q! z
if (ret)
0 a8 v8 F; C! l pr_warning("Could not register som GPIO expander LEDS");
" q- G, X9 o1 L. d. I else% R/ } E: L7 _/ m5 Q: n$ l/ n# V
printk(KERN_INFO "LED register sucessful!\n");" U* n" E7 p" \( E# A& f: q- P
2 R6 h8 G: c; u return ret;2 L, p a8 l& K# L& ~% W9 Q
}
1 R9 D# o/ b- t3 N7 X* k% y% U+ f( O
static void __exit led_platform_exit(void)$ r9 t& Q) R- |3 _/ G8 p+ t
{ s" k3 j o5 |5 m8 C2 v% I8 R/ c
platform_device_unregister(&da850_evm_tl_leds_device);; Y: Z8 l+ A2 J5 \0 S+ w3 Z( S
/ O9 o* Q( {" W$ J6 | U* N printk(KERN_INFO "LED unregister!\n");
. m" O1 `! [( S}, C- x4 e( R) ~0 j1 z
C2 f* f) T$ F1 fmodule_init(led_platform_init);' e/ C# f1 E% E! B5 V
module_exit(led_platform_exit);
$ t4 b4 k; m) o+ l% {
3 W* B) B% b \9 N) M3 r9 r1 HMODULE_DESCRIPTION("Led platform driver");
! x* z! n% Z+ _2 h qMODULE_AUTHOR("Tronlong");0 [4 g! E+ A) ]/ `+ ~& y
MODULE_LICENSE("GPL");% f, E. k& q5 H+ X( j7 l
/ d. T/ B* V& B( r3 T
|
|