|
|
求大神给下面的程序做注解,请稍详细些,谢谢。9 ?) l `3 N& W* Z2 a0 Q9 }# X+ v
#include <linux/init.h>
" S5 I5 [, H. x# }8 L#include <linux/module.h>' d1 w9 w1 A" O; N% G
#include <linux/kernel.h>
3 }5 U; l( \1 h/ O c3 b#include <linux/types.h>
: X/ }- N- |! L; M9 O#include <linux/gpio.h>7 |# a# d: f7 J& U0 g1 L( k1 D, \
#include <linux/leds.h>
4 j, K5 a- z0 f7 _# ?2 W2 x1 V/ U6 f#include <linux/platform_device.h>
: f0 q; }' C3 C" u
) @* R. I. T4 _* o#include <asm/mach-types.h>
$ W' O, Y( B3 z3 F#include <asm/mach/arch.h>
4 P! z/ \. Z; O6 q. b3 | d- u2 S#include <mach/da8xx.h>& N3 }: ?! t1 ~# j" ~; d/ {* }
#include <mach/mux.h>+ P% v9 Q0 k- I3 Q4 C
% o) U) C$ x" |) m. j- k0 K% s#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
: A/ [% g! P! L5 [' ~+ W: L f#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' E+ J- S R9 o: Y t. F( l
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 H- H3 j! u) B0 f: h
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)& ]8 e# W; m$ F3 w* o8 g
* n+ Y& A- e' f: v
/* assign the tl som board LED-GPIOs*/
0 h y" z9 G: X8 r2 [. F% x! tstatic const short da850_evm_tl_user_led_pins[] = {
! A# i, v( [ n+ [: n5 E' E /* These pins are definition at <mach/mux.h> file */6 C' x3 D3 m. ]& C' L1 t% B% f: c
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
9 J! z- h! f0 \" i -1- q' d' s* i1 Q5 l# H% `
};
/ x1 F, w3 R0 j1 s3 ^8 n2 r- H
9 Y0 f7 a4 m4 |0 x9 Q' zstatic struct gpio_led da850_evm_tl_leds[] = {: u7 M% Y8 r; O% I& v: O* o4 O
{; K+ Y- E8 q* ] `
.active_low = 0,
+ r: q+ M6 t# D/ G2 r .gpio = DA850_USER_LED0,4 ~3 A9 S4 v% D' G) N- u$ d) ?0 n. u
.name = "user_led0",
& _0 @* i' |% J" W/ T .default_trigger = "default-on",
1 O1 `: Q1 D1 ~' M },
" y7 l' m& E0 n/ C( _ {
/ `7 u- ?5 Y7 z .active_low = 0,
& i" `5 y4 r+ O1 ?" ^# e: X .gpio = DA850_USER_LED1,
; @ }+ V$ a- X, K" ]+ O. ] .name = "user_led1",2 V( e& g8 ]! d. @
.default_trigger = "default-on",
, f4 @' B* Z& Z( X },& Z- D; v- o! t, ?* Y; C3 w
{* j- u0 _8 ~# t, w
.active_low = 0,/ B8 c5 g: u2 o& `7 N6 z
.gpio = DA850_USER_LED2,% H% `5 v: O7 Z" j( k
.name = "user_led2",/ a" P9 r1 ?+ q2 |$ x
.default_trigger = "default-on",9 w6 Q1 f% w2 ~+ f) r ~$ i
},
" C! ^5 U# | J7 c- Z [ {1 x; v7 G' A4 C
.active_low = 0,$ q5 c' l( u4 y4 ^
.gpio = DA850_USER_LED3,
/ t! g8 ^. q0 {1 t b+ I .name = "user_led3",/ w- H& ~% l4 c! K
.default_trigger = "default-on",# f: y: k O0 @; q
},
' m: I; e' b! s0 J8 O$ x};1 y# k' h7 ^3 }/ k9 i
H* y1 l) R, z9 p+ L+ d
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
- K- j' y3 A% K5 F .leds = da850_evm_tl_leds,# R2 h% n8 e# ~9 f- @9 L8 |$ N
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- \$ r. i0 L1 J4 t( i- ~};' A0 d1 M5 J2 R
5 B! W- ~+ y, }5 Q6 P" tstatic void led_dev_release(struct device *dev)4 _* Z! L& u l# A$ p
{
( d2 f7 A% s) a};1 o# i% q* A7 j Q
: m% L( c B8 |
static struct platform_device da850_evm_tl_leds_device = {' ?: z9 Q0 b+ F( k1 h
.name = "leds-gpio",. {6 R' M; p3 B4 H7 Q1 ~, B
.id = 1,
) W: t% {9 S! ?8 |! f; b .dev = {
0 z3 k/ x! n, O+ i2 Y! k% I3 S .platform_data = &da850_evm_tl_leds_pdata,8 A& ^& c4 i" ^
.release = led_dev_release,
! f, t/ s& o9 D3 H }% i: @" d" u% k1 q# W+ v7 E+ t8 N
};/ Q9 W# z3 T1 Y& Q* ?0 C& U5 s
1 r. D7 ]( m" I0 D% C
static int __init led_platform_init(void)& v1 I& b, R7 }/ V
{
3 L5 K' G) q2 Y" |7 o! ` int ret;
Z* L* c8 T1 \#if 0
i G, E; w! n* P8 T& b1 a3 y& M2 n ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);. d; i5 r W# r
if (ret)0 ]9 G0 O) H+ h) o
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
( q4 O) m, ?. J' |3 \! x8 o "%d\n", ret);$ d5 T. Q8 W5 U4 e u- W
#endif* \0 [% l1 m; L9 E3 d9 c7 |/ U c/ ?
ret = platform_device_register(&da850_evm_tl_leds_device);
; x5 V% z" I% m8 o' x if (ret)& D2 h6 \. R$ |9 M. q0 V6 s
pr_warning("Could not register som GPIO expander LEDS");( L9 M4 \- ]2 F7 G
else$ v7 `; J4 `2 `; n7 Y, z$ ~
printk(KERN_INFO "LED register sucessful!\n");# i5 R, M' _# M: _% W
" j# V o% i/ Z1 [; X
return ret;
* _: L+ \( L6 [5 {}8 y q& N+ V( }! e; Y5 N8 E
- u) B! l: ~7 _ D
static void __exit led_platform_exit(void)
, ?8 I% Z8 z$ g% d6 z{
! }, ~2 o, R0 o+ p. S platform_device_unregister(&da850_evm_tl_leds_device);
! a4 |) f% C' [* E0 ^* n# l
) d. j2 M) M7 l; i$ F$ |' _5 j printk(KERN_INFO "LED unregister!\n");
! ^- B0 } o Y}& X5 v8 T! {+ t
' B1 S5 `* w4 Umodule_init(led_platform_init);
. M3 ^8 ^+ W8 Dmodule_exit(led_platform_exit);
! [0 v( ?+ n8 ?+ m( r4 k1 N
' n) Z1 g5 x5 |: y) `; rMODULE_DESCRIPTION("Led platform driver");; k; f7 ?3 N/ f' E1 Y9 @
MODULE_AUTHOR("Tronlong");5 G( x* p9 Y9 M5 m! f
MODULE_LICENSE("GPL");
$ R8 F, F! A' N, b: V! f3 W9 }& ? _ }/ L
|
|