|
|
求大神给下面的程序做注解,请稍详细些,谢谢。& h8 T6 E, X: N# I+ A' p5 c( l; G
#include <linux/init.h>8 Y% s7 u6 T% |5 [+ R7 B, j
#include <linux/module.h>
/ v/ E H$ H$ W#include <linux/kernel.h>5 h# f, h0 X" p
#include <linux/types.h>9 B$ w8 O% `" U
#include <linux/gpio.h>1 B* H' G# v, X0 m1 r* e8 F1 x' `) E. \
#include <linux/leds.h>7 V* I! I: N' R+ j. p8 |% x
#include <linux/platform_device.h>/ I7 a7 ~! P. g; U; x0 W
- `. M7 y. T% h: A5 G
#include <asm/mach-types.h>
?* y; L z& U+ c0 U#include <asm/mach/arch.h>
& x0 _# A3 H8 k* |! I, H* h& w% C#include <mach/da8xx.h>
4 a1 D# D; n3 C& l W a#include <mach/mux.h>9 L+ P$ k. @) X' t$ m( w1 N/ l
: A }: E$ Y( Q1 D' }! `2 g#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
9 W& \1 B; l( Y$ `#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) T4 Z) v7 a0 J# d* n3 B#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 W& q- U5 B" [+ |* B
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
& y t. D1 G3 n- l* n
- [5 j1 |5 `! t+ S" [/* assign the tl som board LED-GPIOs*/
2 {4 ~3 x+ G, d0 lstatic const short da850_evm_tl_user_led_pins[] = {5 N. t$ M+ r+ u o0 ]' Z
/* These pins are definition at <mach/mux.h> file */: p0 [. C. o7 N! Q( F7 S2 B* n9 T0 |
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,( d3 | G6 B* c
-1) y0 p& U3 G6 o& }; `4 A
};7 w3 j6 \: Y$ ^) J) Q9 Y5 K* ~. ?1 T* ]
6 n) S+ ]! k* \% X0 t% vstatic struct gpio_led da850_evm_tl_leds[] = {& d, ^% H2 y9 c& f' ]9 z
{
2 u6 W3 D$ J4 K( r .active_low = 0,
1 N! A7 ]6 R+ c, _% d .gpio = DA850_USER_LED0,3 w- s% T) A$ E/ `. Y/ n
.name = "user_led0",
0 Z7 f! D( F3 v% V4 T t5 ?3 ` .default_trigger = "default-on",
u# w2 ?* W+ Q },
) b7 H$ n7 N; ~/ T2 Q6 }" g {- y. S# \2 Y' g" {4 i( Q
.active_low = 0,
4 a3 T& m; t" o, A6 M' ^ .gpio = DA850_USER_LED1,
* L! t, c' L) Q: N% W .name = "user_led1",
! U7 Z/ ^* L6 n/ [. B+ d O .default_trigger = "default-on",
0 n6 k1 R2 [ J },
& }& P& ?& Z# y1 ]" k' D {; r/ U* C9 y1 \; j! u+ ^( ]9 t
.active_low = 0,
0 y; ~% Z! T1 R# ^ .gpio = DA850_USER_LED2,
7 ?% Q5 R9 v" x6 L1 U .name = "user_led2",
" \. r0 T0 C* z5 S& i4 I .default_trigger = "default-on",
' `7 G/ m$ E% B Q# I/ U6 `% G },/ y3 \6 z9 L/ d
{& x6 ?2 \, {9 o3 d8 a) Z! c: n
.active_low = 0,' @# Q6 V8 K, V. |# `8 P
.gpio = DA850_USER_LED3,8 p8 V/ Y0 l" l
.name = "user_led3",* I% c+ _* L( |9 z
.default_trigger = "default-on",
4 W% V: P3 U& Q$ E( A },1 M0 F# W* D, @- V
};
, C; a/ j1 u# j0 V6 `- P
0 A* G: f. [, O; qstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {* ]. j+ `$ N$ W3 [$ R$ r
.leds = da850_evm_tl_leds,
# g( u: A) `4 k+ [4 G6 f3 b6 M .num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 c. c. X! z# J4 i* Q' {4 ~
};
" b/ F9 _0 K8 O% C) j- N7 }" s4 g9 y
static void led_dev_release(struct device *dev)3 | G3 W7 w% f1 v. P7 `- e3 n3 g4 a
{' l" v ~8 Z2 |: B0 Y
};5 L% x0 v8 l5 S& }
4 e0 z9 b- o! }4 n8 n! k# {9 {static struct platform_device da850_evm_tl_leds_device = {
- l# ^7 y5 S5 x3 e! u0 A% R6 b .name = "leds-gpio",
) f6 e7 J& Y5 r5 m4 } f t% o .id = 1," u( n; o" i$ B
.dev = {
* ^( T; S8 _& n; G N8 d% H .platform_data = &da850_evm_tl_leds_pdata,
" |4 d0 n& K1 R9 q% y+ L+ Y .release = led_dev_release,
( H2 K. J5 V# z# g% c9 K2 e }
6 Y' f+ ^2 b# l) A8 U9 z2 v8 [0 j};3 [0 @% a7 Z, J' E# W: }8 M
R7 P* a3 T6 M k8 Q! n8 g/ kstatic int __init led_platform_init(void)$ l3 m9 o9 D6 A7 g7 \
{
5 R t9 E" |' U; { int ret;
. K# b: I2 }2 {& O#if 0/ o V" I5 i _. s) o7 w' k
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
8 @* a, s7 o- a& z if (ret)
; t* Y: U' t3 |, H pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ N5 I; S3 o- f- Q; f
"%d\n", ret);
% j4 ~# h( l* X$ j#endif
2 m! q& D+ s3 W& |. l$ j' r ret = platform_device_register(&da850_evm_tl_leds_device);
- f, S8 e K& A if (ret)
$ l1 v7 W2 }3 M ]8 J o* x, L pr_warning("Could not register som GPIO expander LEDS");5 p1 w' d u! Y0 t
else
+ }/ X* F5 e+ F printk(KERN_INFO "LED register sucessful!\n");# K. w. i" k' i' [7 J+ y7 u
" X- p A: S& ^7 d& `! } g, { return ret;1 i- P; p' A6 R; F
}
, |- M/ H2 o a5 W+ X9 P: x. u8 s7 I, X5 x1 q
static void __exit led_platform_exit(void)% n3 [7 _; e2 \, U" t
{
- f5 z+ H d8 z) Z platform_device_unregister(&da850_evm_tl_leds_device);
1 f/ N+ f, o+ m+ [4 k: K/ ^5 k% I- Z: V9 p0 W1 M
printk(KERN_INFO "LED unregister!\n");
4 e$ i: G% H/ U}
0 O6 G8 S( E+ O3 ~! R: v
4 `& L: a* X9 B- }8 u$ Gmodule_init(led_platform_init);
; S1 f& k/ Y+ c6 v- [( g& wmodule_exit(led_platform_exit);
/ | F7 d% y( |; V" @* u$ o& A+ E5 I# h- m
MODULE_DESCRIPTION("Led platform driver");
3 t, x8 {- i1 iMODULE_AUTHOR("Tronlong");4 d5 P) g7 v; g' v5 c5 T
MODULE_LICENSE("GPL");
- U5 \3 d) s7 ?+ l
/ q' S9 }3 S* v8 [8 E |
|