|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
* I" x6 u2 W, }- y0 O9 c#include <linux/init.h>9 E% X I! W# a2 N0 Z: x, e+ l3 ]
#include <linux/module.h>
2 J, J" P( U% @0 U#include <linux/kernel.h>
, V w/ w0 R. N! `- E0 [#include <linux/types.h>
$ B& Y3 N9 N: E7 a* I- R, x6 w" V#include <linux/gpio.h>6 O. h' n& O2 i0 `3 V1 Q3 `
#include <linux/leds.h>
5 e0 q% J/ ~# b#include <linux/platform_device.h>7 q4 B5 c* h! t' f2 ^7 h
' }% e5 U7 ]& `/ i3 _6 G
#include <asm/mach-types.h>/ ]/ W S: ~# v
#include <asm/mach/arch.h>: k; H+ N) k1 U' X! t7 q
#include <mach/da8xx.h>' ?% B; S# p, d9 h
#include <mach/mux.h> r [. n6 m, ` V, Q0 d
- q& j) E6 }7 T# r3 k0 |. Y& }5 l6 ?
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
" m# j1 u5 H Z9 [* l: F#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
3 P! k# p3 }+ p& Y#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)0 R1 ]5 |. h( v% O4 R
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2) i W) M* I' X8 E; R& i y
( ]& h( X9 o- h, Z y/ ]$ w7 x" e5 p
/* assign the tl som board LED-GPIOs*/
* h- g2 k, V9 M, x4 ~" Vstatic const short da850_evm_tl_user_led_pins[] = {
( Y3 K, ^; W, G& c7 O% F" M: ^/ @ /* These pins are definition at <mach/mux.h> file */
1 @! X* Z+ N' e7 q DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,! m* X: ], M5 }
-1
) I1 n- T9 x8 Q};& q5 x7 |# Z Y/ m1 X6 E
. ?0 y- w& r3 L3 E" @0 _
static struct gpio_led da850_evm_tl_leds[] = {
; H. [& J% v' |6 G; m {' C, y* ]0 ^# Y" z
.active_low = 0,
B9 N# }- y! e0 J .gpio = DA850_USER_LED0,
7 o8 J/ y+ a, ]8 x G; i+ {& v' v .name = "user_led0",
) |5 M$ G* W+ H* F .default_trigger = "default-on",6 ]; r; T0 v" ?; H
},
* |/ U; H t2 m6 a# h& f {
: w x, t1 d( K' N* F" D! M .active_low = 0,
! J0 x* ?. \' ^0 _ .gpio = DA850_USER_LED1,$ U+ x) y# m4 D$ P/ ~
.name = "user_led1",
$ o8 ~" L# \8 ?! j: f, G .default_trigger = "default-on",) @2 R4 @% x! t: a
},; Q6 y8 {0 E" c O( W Y, g* e j9 \
{
7 f# D0 p8 |) D% h& x1 x .active_low = 0,
/ b$ z. o( w( n6 L% p .gpio = DA850_USER_LED2,
$ Z% L* m2 F3 i4 _ .name = "user_led2",0 o2 v; f: ?' \/ Y Q0 b) ? R
.default_trigger = "default-on",- j. F, X2 a) {! O
},4 U+ c1 Z. }. X: i i, O- m
{
# i) p% }6 {/ ^+ e .active_low = 0,
$ s8 a9 w. ~* Y .gpio = DA850_USER_LED3,' T1 G! J# X( V$ w& h' t* v
.name = "user_led3",
, q1 U& L2 W& o' R. m9 c .default_trigger = "default-on",) {" y% d4 Z/ @ z
},
( ^( ^; b6 _( Q1 a. Y" q4 X& b& Q};
# ]2 }9 T6 u6 _/ n0 j9 Z
{$ j h8 v9 @- a1 R. x. r7 D9 Tstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {% B8 v* H- j5 r
.leds = da850_evm_tl_leds,* B& i1 @! y6 @1 f% j
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
6 V4 }: X+ C( _& I};
+ \- b+ T, W& T% Z+ H
/ t3 z$ J9 c/ R; _+ [static void led_dev_release(struct device *dev)
3 E" _4 Q% ? `{
$ s! Y: E' i0 `# D/ c, {8 `% i};
9 ^6 f' T2 V6 y) t( n Z2 f0 A4 x8 T) @& c3 [0 d
static struct platform_device da850_evm_tl_leds_device = { O6 X9 v6 p0 X; W8 z1 Y
.name = "leds-gpio",
3 }( v- J. N( A7 ? .id = 1,
2 x+ M8 L3 L4 B# A .dev = {
) t* O$ W/ s, N. u7 H, r& w! F# b .platform_data = &da850_evm_tl_leds_pdata,6 K: e; ~! J# ~" w8 K. H
.release = led_dev_release,- o2 d6 O# W) U- `9 l4 h
}
7 P: i( R0 Q& b# B0 U- d};
4 ?& c2 A0 G9 N# L8 C* l+ E0 F
6 U/ J! f$ n- w- Ystatic int __init led_platform_init(void): x ?2 Y: o4 g* g3 g) ^
{3 W( J# d! V# b; T1 o
int ret;
" F4 ^8 V, v* _" r#if 0+ g- e" T& |8 T L$ X
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 l; d$ _! ?3 j8 G0 | if (ret)" V& Z% n" z+ \5 d/ o. d- l: g+ \
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
8 |2 R* r5 l5 q c* f "%d\n", ret);
' p* @6 t# v/ U0 q4 }+ O$ a#endif
3 [0 g7 i; k2 ^# l7 B& P- i6 m ret = platform_device_register(&da850_evm_tl_leds_device);2 a, I0 A D3 j; M5 g
if (ret)0 j4 \. }- p" `1 t+ f$ `2 o+ P
pr_warning("Could not register som GPIO expander LEDS");
" z/ R; p6 k4 P else6 J4 o! M8 X' H7 S! _" f: w
printk(KERN_INFO "LED register sucessful!\n");
/ |" P- C6 c. t1 ]$ p$ x( }. z& X/ c3 v9 b
return ret;
* ^; g: m% b1 f, H& Y' Z}
: J z2 {8 V' U
: I0 t8 z" S7 n5 p4 Estatic void __exit led_platform_exit(void)
B$ r( ?1 r7 x( w! G( o{. S5 a# @' j+ n3 M" @' B7 }
platform_device_unregister(&da850_evm_tl_leds_device);! ~( ?; l7 \/ |0 A+ N! N$ g
( ^7 ?0 x, E, m6 i
printk(KERN_INFO "LED unregister!\n");
% ~& G6 n4 G$ U& m1 U}( b7 Z! _0 h0 f, ^
* A) Q4 t, }1 n) P' Mmodule_init(led_platform_init);
3 j$ u n! H: j8 S# U5 Nmodule_exit(led_platform_exit);+ v3 V8 g+ T( Z2 H
7 @* c0 d4 S8 V2 N- M) Y
MODULE_DESCRIPTION("Led platform driver");; i6 I/ `' C- W
MODULE_AUTHOR("Tronlong");
* f$ W% h; C# i$ QMODULE_LICENSE("GPL");
5 @0 Z9 E# M: I9 g% Q) L% W5 X, k8 Y! \9 b; Z e2 g/ e
|
|