|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) t- l5 L) @2 t- l- F7 e#include <linux/init.h>
# D6 I% ]5 Z) ^/ j+ s5 R+ s#include <linux/module.h>
" q- o- `- v7 t* k- u4 L* {4 F2 d#include <linux/kernel.h>
: p7 F. y4 E; f#include <linux/types.h>4 f+ f) F! @4 i/ |
#include <linux/gpio.h>! P7 X/ [) x6 }' y1 b
#include <linux/leds.h>
; ?; e# l- m5 E2 Z0 u W#include <linux/platform_device.h>2 j6 o3 f4 f% ~4 f
; s" w. O; D. H* j1 [0 u; G#include <asm/mach-types.h>
8 ~9 B- }+ c2 Z#include <asm/mach/arch.h>
% N9 B6 Q# |7 G/ ^#include <mach/da8xx.h>
U6 @8 ^* d% E8 J#include <mach/mux.h>& O6 @7 I0 M5 {; D. S. ` f8 q1 g
/ z8 z* w, }+ Z& N! {- D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ j/ \( H3 [1 \: \2 v4 D b
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)3 j: Z* O) M+ |6 i. B3 J2 m' E3 L
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 Z* n7 K/ ]+ w% [#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
8 [$ v0 d! V+ a/ e5 X
: h5 {, G9 E7 s: }/* assign the tl som board LED-GPIOs*/
- N. h# P9 U9 ^static const short da850_evm_tl_user_led_pins[] = {- P7 K, x/ k/ A
/* These pins are definition at <mach/mux.h> file */0 j1 j+ V* x- @/ g8 B3 r8 y
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
; y& K: C7 y# g' Y+ F -1
9 w" I+ e: T+ b" q0 u};& E0 ^6 X+ p: v0 }8 u. E
+ U1 t) f+ b! m2 u
static struct gpio_led da850_evm_tl_leds[] = {# a3 W. j0 y; f! b/ Z, A
{
" h# f$ k; ^' y: A! { .active_low = 0,
; p4 S8 Y2 a; l; z .gpio = DA850_USER_LED0,
) I( [- _! E9 J2 y% i# p' Y d. y8 I .name = "user_led0",
/ E( G1 I5 j8 n; ^9 _7 G .default_trigger = "default-on",
# F4 k/ X4 X3 H( p4 A& ~, V },
# z3 o$ t5 ^: S9 C {4 r2 U M" C; [) s
.active_low = 0,/ \8 d) j3 t' r6 E6 I8 g
.gpio = DA850_USER_LED1,
8 Y3 Y, K- w5 } .name = "user_led1",
1 F/ a- z% H# v. `1 h1 G8 z .default_trigger = "default-on",5 C3 n0 j; y- A* y" \4 {
},2 c, U/ P( B9 |- x# q
{* _# Y0 y3 ^; F2 [4 Q ^
.active_low = 0,7 L. r/ i" f) y X$ d
.gpio = DA850_USER_LED2,
* \7 A! f# t5 G .name = "user_led2",
$ C, K3 j a1 U4 _9 K .default_trigger = "default-on",
4 D! S" f: _6 r* g1 [8 f$ B }, K9 v7 {6 I, L! h" O4 |
{
/ D* V! W) l& J3 B0 K) m. ~. r .active_low = 0,0 ~5 `# D% W( h- Q+ ]) U) y
.gpio = DA850_USER_LED3,
. `) D: M5 N# t4 ]8 V .name = "user_led3",
2 X, y& f5 i3 K .default_trigger = "default-on",
6 }& q- ?, |5 m1 w- o },
8 r, t. C9 T' L}; x" E( f' t% w5 T) b
% T& X! E8 \8 w4 Hstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. [8 ~0 O3 K' p6 g
.leds = da850_evm_tl_leds,
" _8 n3 s2 U1 |. s( c @& e; Z% s I .num_leds = ARRAY_SIZE(da850_evm_tl_leds),% B9 C5 p9 [% ~! z' R
};
- j3 V) d1 G% s. b8 k
. g# H* \7 b9 ^, {6 \static void led_dev_release(struct device *dev)
1 ~ N8 M3 N4 r6 ~$ h% E9 J' v& i{# s# d. }2 q6 S0 x
};
1 J6 G' t* Y9 d7 k6 s& Y# H/ J! o9 f& g. K' d( a; J: }
static struct platform_device da850_evm_tl_leds_device = {
, |& v" y1 m4 k: f) I2 W$ _ .name = "leds-gpio",+ `4 k7 d/ r/ L) q/ ], N( ^) L9 }
.id = 1,
8 V5 w; s- o7 S .dev = {$ ] V7 x) I R9 F* l7 a9 |; r8 R
.platform_data = &da850_evm_tl_leds_pdata,
$ B' G+ [# U- K .release = led_dev_release," _, L6 x. r* C' u; o- b
}
' y* j1 w: p& z( B5 g};
. b9 j' |, j" n4 c4 _6 Q9 f- ^ V9 Y9 J7 }( P
static int __init led_platform_init(void)9 z$ r4 M6 y% }- [3 R) k* W
{1 l/ x! n+ ?9 P) f2 f I
int ret;
2 Z5 c/ z1 y; R#if 08 R8 u# ^- U6 c v$ e6 K0 z
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
. ]1 V2 F6 i; b: N0 Y8 x% }! F if (ret)" ?3 n& c- @& F/ _: e1 r9 H
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
' |* Q: \% F; H' T "%d\n", ret);
: Y2 y* X, l7 k1 x( R" Y7 H. [#endif1 f" P7 u2 E3 t1 s& d
ret = platform_device_register(&da850_evm_tl_leds_device);
2 c. K+ U8 x: M, _ r if (ret)1 {3 u* f5 J! @8 N* ~* a! y
pr_warning("Could not register som GPIO expander LEDS");" N* n4 M7 U4 [$ C
else, ?: i4 {" J O7 c7 D
printk(KERN_INFO "LED register sucessful!\n");
/ ?! n) H: Z3 o) |, V- g: k5 b
: V4 {/ M; @& u7 C+ ~ I; f return ret;0 i4 w' p1 N+ R7 G+ Y5 R! Y
}" M4 e6 n7 H7 U) v" E
t6 d) N0 ^. U
static void __exit led_platform_exit(void)' Y9 B- f/ Z8 ]( X
{+ N# ^. D2 g$ q q* T- o
platform_device_unregister(&da850_evm_tl_leds_device);$ ~. L) V/ |! R# P1 x" b R
4 ^ K& Z' P* H printk(KERN_INFO "LED unregister!\n");8 X. K$ F5 I8 G
}
/ n7 ?; R% m5 U2 ^# S! I; N9 P2 K
module_init(led_platform_init);2 c* e/ B% G/ @# `3 Y3 B* s1 i
module_exit(led_platform_exit);2 ]" }4 ]4 E9 p8 {
$ @% A; F; ^+ ~# D. IMODULE_DESCRIPTION("Led platform driver");
. q- H. { I3 Z) W4 o* j3 F* ?MODULE_AUTHOR("Tronlong");
% ~ a( N# v, P w0 B9 ^MODULE_LICENSE("GPL");4 }, ^2 g5 V9 l& t
3 I6 G7 ~7 v0 T |
|