|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
$ S! i$ J6 |+ h. J6 Y#include <linux/init.h>5 }9 D2 k6 @% }, J
#include <linux/module.h>
" M% V7 L$ l6 m+ {2 |9 ?#include <linux/kernel.h>! M# z" u. L% h% X
#include <linux/types.h>/ G% B# N5 K7 Q* |( z# l; M
#include <linux/gpio.h>; B0 o: F% ]4 n( K( X1 C
#include <linux/leds.h>
8 S! ]' \8 B& n9 L2 z/ l3 T& X n) Q#include <linux/platform_device.h>
% M8 o, u$ ^$ U/ E/ ~8 }$ ` K- _8 I
#include <asm/mach-types.h>
) O6 L8 a! p1 U, U9 G" J+ o#include <asm/mach/arch.h>
S. j, R7 [1 H' p+ ?! G#include <mach/da8xx.h>( c. x- p2 ?( O( r* V/ m
#include <mach/mux.h>% J% q- C% X+ H+ j" ]( o
$ q, i: x, s2 @8 Q( \6 w
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 T0 H4 K3 G% a( \: q% s#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)9 p y4 x# c% M$ Y6 q. H2 m
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
/ Z6 o2 [ q8 G2 g S% c. B#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 z( P/ C- ]$ c, G8 t1 l
6 I" [, x& c$ O* ]) }/* assign the tl som board LED-GPIOs*/
) k- n( v' i! i, X! @& Estatic const short da850_evm_tl_user_led_pins[] = {# ?4 T: M( K* }" Q/ u' |9 L
/* These pins are definition at <mach/mux.h> file */
, Y& e) J, _7 g3 B2 x DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,; @8 T5 G2 T- p! z5 `
-1
4 [, F/ z" c; }+ _};
+ y' C! U+ V7 n4 i) g$ h
4 S6 s- o# X. |/ d- c) D4 X o- Tstatic struct gpio_led da850_evm_tl_leds[] = {6 c5 d# _, D0 I9 i% N
{1 B% j! h/ D5 D) w
.active_low = 0,% D; N: T4 N/ _1 y, q
.gpio = DA850_USER_LED0,' \& ?9 o2 y2 x4 L: A0 p
.name = "user_led0",+ ]. c1 l9 M9 ~7 O
.default_trigger = "default-on",
! N' Y, s# N2 \ O1 y; u" `8 ~( [( w },
E/ r6 `: } Z, \ {: B# b2 ~; B( x8 d
.active_low = 0,
, {* `% g- ?, }7 T; m @ .gpio = DA850_USER_LED1,
; Y6 S; V1 `3 Z) M' o# |# Z# } q .name = "user_led1",6 C" e! @. U6 s: w4 Q: y' B
.default_trigger = "default-on",
& w; Z3 l7 t- d& y },$ ~) ]- ?7 a2 {8 l6 d$ a& x# N
{
6 M' z; l( x0 `- |: L .active_low = 0," Y6 S% R: l) _
.gpio = DA850_USER_LED2,3 F7 X! b, B5 u6 G+ t
.name = "user_led2",
: F$ w$ \% C2 `5 r+ d0 s .default_trigger = "default-on",
& p) V2 | J" z q4 M/ g. b8 O# l },8 X$ G* i$ @) e0 v, x) M3 [
{
( q+ {& {5 e& H. c2 F .active_low = 0,0 ~- E" ~7 `* w' W3 \: r
.gpio = DA850_USER_LED3,5 w3 \# N9 p) v) V' ?! j/ w
.name = "user_led3",
H/ N3 D2 G# ~& x- n c7 }( e6 h1 M .default_trigger = "default-on",/ l0 q: ~, L, k# k2 C
},
, ?6 W# r$ P/ d9 [% S};4 _6 l4 D e* p) v" _
9 u0 ?/ a+ W* ], S0 N2 O( |5 V$ cstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {6 w6 _2 L6 o& C z6 v* a
.leds = da850_evm_tl_leds,
$ n/ z7 c" N7 b9 k8 X .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 l; j8 k% r+ x, U8 K) G- _1 k};
$ m' l: T3 Z/ }$ w' u- e9 v& n: |+ a1 i4 @7 f
static void led_dev_release(struct device *dev)8 D L' J, ~: I- q2 w+ K9 P
{
5 R8 I0 ^0 j0 U$ e% w};
: T' | K% ], @- Z( ?6 f" u
9 s. Q" T$ A+ u+ f( t: _$ Fstatic struct platform_device da850_evm_tl_leds_device = {2 X% |( v# c" u
.name = "leds-gpio",7 w+ T& [; o7 `
.id = 1,
4 a0 m9 q' m& \ .dev = {
1 v; d5 ^* w% c7 s+ } y4 P .platform_data = &da850_evm_tl_leds_pdata,
* y8 I8 [7 q: h5 ^) X- T .release = led_dev_release,5 @- J) z$ D7 f
}
+ f3 e$ ~ G. d& v};
& y" \* @! V3 R2 U
0 w! Z5 e+ U+ w1 Xstatic int __init led_platform_init(void)$ J+ p5 w2 P( Z
{8 j$ U) o% j! M2 r3 r
int ret;
% O: j; w* s k. e# U#if 08 T# u$ C+ s, }5 i, F
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 V: x/ @9 T* F5 e, s' M9 i if (ret)9 j+ P% a @; ]* g
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"4 v6 K9 `: T6 ^% Y- v1 `- q
"%d\n", ret);' Z. x/ s" V a& I9 D: A5 m
#endif3 S' }& ~" U, Y ^6 ?
ret = platform_device_register(&da850_evm_tl_leds_device);
" i0 ^) Y+ R( a) `' i" d if (ret)
' w' b n+ e1 i5 i* U6 v/ y! _/ k7 I. h pr_warning("Could not register som GPIO expander LEDS");8 J$ m" G m" a7 L8 `
else, Z. G# c; g7 C9 }4 s) I' F
printk(KERN_INFO "LED register sucessful!\n");; }+ T9 l( \0 H# p
* ]! h$ ?9 L; |$ c& \, Y return ret;& } L& @% b! ]
}4 V5 W: \% k. ?8 o4 t/ M1 Z
6 v( w2 }6 ]4 e; @static void __exit led_platform_exit(void)
D/ Q8 F" c* H& [) B) x{; U$ ^; P0 u; y0 v1 m- N
platform_device_unregister(&da850_evm_tl_leds_device);
, A$ d s7 g* X! X& s
! s" k! e1 b0 T) z printk(KERN_INFO "LED unregister!\n");7 l* E: m/ C1 E) [2 m. A/ I/ ?
}& R/ a$ c( j; e
. \7 C" n- g$ U/ i5 Z: p+ l- |
module_init(led_platform_init);- u5 c! K- n2 d& `* @$ X: o
module_exit(led_platform_exit);. F0 \5 ]. \/ b
; D! |8 M1 u8 a
MODULE_DESCRIPTION("Led platform driver");2 L' k3 P5 N9 o
MODULE_AUTHOR("Tronlong");
$ _* J4 I0 c+ n* wMODULE_LICENSE("GPL");! y! L4 T: \, c: |$ P) j2 B# F
5 ~9 N7 Y7 B1 J# e8 { |
|