|
|
求大神给下面的程序做注解,请稍详细些,谢谢。3 E. o9 G9 q3 o- v: Z
#include <linux/init.h>0 {& {+ e2 B9 |! c# X$ F/ ~4 {) N5 F
#include <linux/module.h>
) n7 r: U- Q( |: E5 s#include <linux/kernel.h>
$ j7 S2 l" y5 x' I#include <linux/types.h>/ ], l! Y2 A' _. n3 r" q( w( Z0 {
#include <linux/gpio.h>7 Z4 p4 K h3 |% c1 n6 v0 V. ]
#include <linux/leds.h>, z0 K; [& d/ C; b
#include <linux/platform_device.h>7 h* f8 i+ N( m+ Y8 ^1 A, T
: }& T5 e) X0 Q h4 w4 o8 L7 t2 J
#include <asm/mach-types.h>
* z _/ n9 o! \#include <asm/mach/arch.h>
% h k U3 U& e4 U#include <mach/da8xx.h>
5 W3 Y) x* b2 H0 K$ [% N8 }#include <mach/mux.h>
/ [. @9 z8 k9 E% K7 I8 T- D4 I U' \# y+ v
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
' P2 K. d3 Y' K#define DA850_USER_LED1 GPIO_TO_PIN(0, 5): I% y; ~6 _( {5 J$ T( d
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 g. |/ I) ]' I6 J' n" \7 X. z( S
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)7 W9 l5 z2 o$ [; D' {" I8 j8 M
8 W- [* J& Y/ o" E
/* assign the tl som board LED-GPIOs*/" A( f, `2 A- K7 u$ I1 \- h$ D, X
static const short da850_evm_tl_user_led_pins[] = {* _) g% p6 N: B- \, k
/* These pins are definition at <mach/mux.h> file */' A( x o. b9 _ Y e$ i7 J
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
& H% |- `/ T$ E5 o -1* _3 m; c/ d/ K
};# g4 M3 v; U# L& W- h) @/ ?3 g. p
6 ?) A8 R+ N+ w1 e% o* Fstatic struct gpio_led da850_evm_tl_leds[] = {
' ]# Q4 w$ C" Q9 L" ^* E5 f( E {0 O/ K/ f( ~. V6 v+ V
.active_low = 0,& O/ [1 g* ?/ Z/ W) |
.gpio = DA850_USER_LED0,
( u/ w, d; ?+ m1 I .name = "user_led0",
- s9 p0 |$ |- k7 k0 R .default_trigger = "default-on",& I% _, f, x( _* w
},
$ r$ r% L: |1 N$ t# y% z, ^ {
6 |% n6 s6 }- Q .active_low = 0,
5 k6 x: B S. E3 c$ U .gpio = DA850_USER_LED1,
' i! \) }; |8 Y" Q! t" a .name = "user_led1",
( Z+ L `) L8 i s, z4 [& ~; P .default_trigger = "default-on",
! V; B- m/ J! j! P4 V B# s },
0 V/ k; ]4 }5 L# a7 ]1 M {: {% K. i& B H5 h! R$ t' z
.active_low = 0,
9 p; w% C* @7 D. q" G5 Z .gpio = DA850_USER_LED2,
7 P# f! f7 z A .name = "user_led2",- Y8 _7 {" _* N2 D
.default_trigger = "default-on",
- q# p& c4 D* ]! u; d# g },
5 f0 G4 o& o! F3 G' \7 Z {
) K( L5 @: Y1 o4 F: i .active_low = 0,
4 X7 b+ c# d( h. N9 m U( P H .gpio = DA850_USER_LED3,
$ u+ W& ?4 Q) B5 _7 W3 o .name = "user_led3",) x4 a' f& R) L3 F( r9 R! i
.default_trigger = "default-on",
5 P5 [. K: s* d" n% r) } },
+ L5 y: Z4 {, n O3 p( Y9 Q};: O5 g( C2 o4 A+ ^9 @5 t
v# t9 t6 U6 k% J
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {! q5 U7 ~; T; t
.leds = da850_evm_tl_leds,& e2 m* f! [0 w" u2 h( N6 U
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 Z9 g$ i% p! i O) z% _) r0 q8 v};
3 Q6 z! R+ Q: A* u3 Q! q
( q- V' i5 D7 O- V+ b' e- N" Istatic void led_dev_release(struct device *dev)6 i, W/ c+ w, X0 u& P, m
{
& ?- E3 T' N$ j' E" O};2 ^; f5 m2 a2 ?/ a: Q
$ A3 h& C9 Q! s; l n
static struct platform_device da850_evm_tl_leds_device = {
# x6 G7 r" g* S; X1 j7 n .name = "leds-gpio",
) O; p$ Q d# k1 i5 C- J$ S2 t .id = 1,
* G; @! Z' |0 z1 b9 |6 \+ X$ ^1 R1 T .dev = {& _ G6 U4 t& [1 m( l
.platform_data = &da850_evm_tl_leds_pdata, g! b6 O7 }& k1 q* p4 Q# [! x3 a
.release = led_dev_release,$ R1 ]* g* E( M6 d0 }) _
}
4 ^5 j+ B4 k5 ^+ B" Q! f1 S};
- Y* \) o6 V% K, ]/ p |7 O, d9 g, H
static int __init led_platform_init(void)) W3 K' B2 F8 T( P, s
{
1 h8 f$ B+ v8 M1 Q* c. Z0 F int ret;
: f( a( V0 @ L* I#if 0
) B+ B' r6 _2 t) ] U ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
, D) k i* ]; K" @9 ? if (ret)
6 E3 ^7 E! X: t pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
, @: r' M7 }. y- | "%d\n", ret);) E3 h" M2 S4 z$ J# T
#endif) ], i. N* O7 }: s: Q
ret = platform_device_register(&da850_evm_tl_leds_device);
3 J7 b: I1 o% N0 |- n if (ret)
! J( G$ f+ O# u6 ]% J6 W: d- G* | pr_warning("Could not register som GPIO expander LEDS");: k/ T; {/ ]' d% ]$ `8 y9 I, M1 M# N
else
: F& j2 \+ b" _9 F w% z! e printk(KERN_INFO "LED register sucessful!\n");, t7 z e6 L+ s; O
" ?5 Y* w V- P! Z" v& i
return ret;
. z' [0 u' j, Q2 [! o" W}/ t K0 V3 S0 z* u R
! i f5 a$ D+ X* U' ^# {3 m( x$ d, vstatic void __exit led_platform_exit(void)
& X- w7 t2 P+ [9 b9 ~8 W: v+ R) n{5 w; K/ _ F$ l5 L9 C
platform_device_unregister(&da850_evm_tl_leds_device);
( T5 p, X$ ?( [' ]# X3 p2 @5 S7 a6 r6 V3 x2 t
printk(KERN_INFO "LED unregister!\n");
3 Q; R9 {4 s& g A& ^% O4 `}& h8 f1 B' p$ ~
5 M) P: M. M k* T7 M8 J
module_init(led_platform_init);; d1 b/ C7 X; b% d5 q* }9 M
module_exit(led_platform_exit);# ^8 S* U' V9 M1 R% u) O( N) _
$ |. `/ s7 T& Y7 S/ \) x! S) }
MODULE_DESCRIPTION("Led platform driver");% `0 y+ z' f/ Z3 M9 i4 [
MODULE_AUTHOR("Tronlong");% \/ H! |! G# B$ H0 C
MODULE_LICENSE("GPL");( T; h; u1 R7 u" h, L; u% F- Q% E
2 W! I) _) o; U9 N |
|