|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! A, S( k4 {4 R9 o# u- Y#include <linux/init.h>/ t, A/ U" y+ b3 z9 C6 n7 b
#include <linux/module.h>
5 B- }: C! _' d/ p2 Z+ p! e/ j#include <linux/kernel.h>
. Z' S0 q$ i/ S# x5 j8 a& D7 y( [) y#include <linux/types.h>
1 F3 \1 V- s# I9 E: M! \: P#include <linux/gpio.h>
! e' T; ?6 Q; N& {3 ]9 o#include <linux/leds.h>2 G( F" Q- s1 K" g. H6 k- ]1 F- ~( s9 l
#include <linux/platform_device.h>1 p3 r: x }; T) t! a& r% k7 H
6 H% |9 E7 ?" `1 ~
#include <asm/mach-types.h>! @; N* ^7 W/ z: H7 `" O5 n
#include <asm/mach/arch.h>; u: Z5 Y1 Z: C' c' u
#include <mach/da8xx.h>) m! c! f7 s @3 V. ~* w$ |
#include <mach/mux.h>$ U) n* D8 D `9 G& r3 M
9 V# G- l E% N- Y+ A#define DA850_USER_LED0 GPIO_TO_PIN(0, 0), J- P" t, |/ K6 b( v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
0 D# W* N$ I* \) ]5 T Z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)2 e7 u# a2 Y: s* B7 n
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 t. a' R5 d/ i1 r/ {6 `
" h& h( y6 C) d5 }9 o, j/* assign the tl som board LED-GPIOs*/
9 B* @+ i1 p8 U% sstatic const short da850_evm_tl_user_led_pins[] = {9 i& E! F% z; k
/* These pins are definition at <mach/mux.h> file */
8 m; p8 f* K5 ?3 o3 G DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! I( q9 C* r+ K0 r% z) b# r: [) c9 R, L
-12 m2 w( d( \" }/ x
};
6 y- ^# ^, k2 U3 N. {
, T2 U7 L& ]2 hstatic struct gpio_led da850_evm_tl_leds[] = {/ U8 b/ T% g+ L9 g" _
{
1 O" H* l7 n7 [( I .active_low = 0,
9 D$ g4 _; J' j3 a+ {9 ` .gpio = DA850_USER_LED0,* `& e' O/ ~0 i$ J5 l
.name = "user_led0",& ^5 H+ F8 |1 C, Y) _: c& L! L/ F5 R
.default_trigger = "default-on",& \/ e, V( g" E6 p
},
2 t2 C, O5 W# M& U {6 b% o" k7 n) e8 G
.active_low = 0,1 I# I+ x p4 Z o
.gpio = DA850_USER_LED1,
9 z) `9 B- E* O& Q5 e6 c% V .name = "user_led1",# W9 t" i! y# W3 X- u5 _$ w
.default_trigger = "default-on",/ I4 |7 \% K. o( t2 m
},
0 E& D2 y% L3 w- E$ G7 K+ E {
8 B! U3 ?( h% M& \7 d1 T .active_low = 0,2 ^' z2 u" m2 K0 ~* @+ p( A
.gpio = DA850_USER_LED2,
w9 G- a4 v) Q( R% I .name = "user_led2",7 `$ r* E. h( t) G% C1 {: e
.default_trigger = "default-on",$ \# E1 ?2 T* }) I6 x* x; V
},
( x& U \: K% v. c# u5 f {# Q( g- Z2 }5 ~8 l. H7 J
.active_low = 0,
5 S, z6 V; {& s; A2 {( f" | .gpio = DA850_USER_LED3,9 r9 k2 w9 L2 H b) }& E% k! y
.name = "user_led3",: K7 \% d/ k% j; M
.default_trigger = "default-on",
# a* ^3 o3 @2 t1 ~1 H! [: { W },, {( Y7 `) r2 h3 t
};
, B5 \" r' O6 \( [4 y6 f: u0 L/ ]+ Z; n2 N& ]
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' @# {% r3 T F
.leds = da850_evm_tl_leds, w' w( O/ N% D& e- c
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ U, Y; b) t- @' r
};
3 X- T* w8 t- q. }- t) V# N. Y- k- ^: T1 Y% n
static void led_dev_release(struct device *dev)
1 I M9 V: U% ]{* b1 r- L! }! ~$ i* s6 d
};
, L- o7 V/ k9 N0 \/ w, N( Y3 e# ]' M: X) c1 _# v& v
static struct platform_device da850_evm_tl_leds_device = {! A0 ^( k# _" Z( d$ y0 p
.name = "leds-gpio",
2 i" _' p$ m2 s7 s" w .id = 1,- T( p$ L0 T& \4 l. y. Y! b
.dev = {
6 E$ v$ c6 B/ p* X .platform_data = &da850_evm_tl_leds_pdata,4 y( O" S- v( J$ [! F& H
.release = led_dev_release,
) N) W% J% N# K1 A- p1 U }( D5 C( c( |+ o8 i( C1 m
};$ l( R: s2 v1 g1 J3 I1 M
d2 g, L) e1 M( x! e5 c
static int __init led_platform_init(void)' L5 H/ E9 |3 v0 L8 C0 V
{ | _1 G& p+ P/ ^' @
int ret;
3 G2 b$ s* J0 N7 K) u, r. E#if 0% N7 ]9 F! y( y. V; U2 I( }
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
. F/ ^) F$ ~ d0 y+ T if (ret)
- [" ^( [: J/ n: F pr_warning("da850_evm_tl_leds_init : User LED mux failed :") h9 g; u; {# c! f4 k
"%d\n", ret);
- R; G' j, Y0 y#endif
" d7 ?% z7 j* o% H ret = platform_device_register(&da850_evm_tl_leds_device);
" T% l- n4 t7 A0 W/ v4 H0 e+ X: y/ X if (ret)
) w" M& S6 d7 X+ j pr_warning("Could not register som GPIO expander LEDS");
& O1 F' B9 A3 r# M3 E9 z else8 v7 k) @, C8 f6 Z" V
printk(KERN_INFO "LED register sucessful!\n");* u8 h; k! ?0 f3 c7 \+ @
) q0 [7 T/ f; d: X% I. ]/ I return ret;
; ]- o7 `) t P. \}- V! g, L% j6 A
7 ^- H8 R7 J# \- j4 Z
static void __exit led_platform_exit(void)
. r v# J6 r+ E# g# w* g{* x, L' r* C& M, E! t2 e0 ~
platform_device_unregister(&da850_evm_tl_leds_device);
5 p, H) v0 x3 l" {: q& y5 s" x
* c& j* w- Z# b- }6 K printk(KERN_INFO "LED unregister!\n");
0 f* j3 x5 d2 e% g& N; R, R* I- p. T y}0 x0 f! R/ }4 H. c& c7 d0 P
( v) R3 V7 |( T8 U6 f) F% P$ m
module_init(led_platform_init);: u! _. X! F$ n* B* q
module_exit(led_platform_exit);
% k; b T0 y' u+ G0 x
2 m! z9 L/ S0 ]/ o3 [$ LMODULE_DESCRIPTION("Led platform driver");
; f; O& ^/ C" l5 Q: l8 yMODULE_AUTHOR("Tronlong");
/ e3 a! Y4 R9 x' r$ c5 NMODULE_LICENSE("GPL");
# X, {# ]! A. Q4 O" b2 B
- @- i! O. P/ Q# K0 Z i |
|