|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
' X8 E' g) S( f& O0 z6 z#include <linux/init.h>
& r/ C+ v' ]. H1 r2 ~# i#include <linux/module.h>- c' [' M+ j. O+ N: n* J. r
#include <linux/kernel.h>& w2 j4 i2 ?8 I! u1 M, T$ I& S
#include <linux/types.h>* } @, l' U4 S9 Q) C
#include <linux/gpio.h>1 O+ [ b, T# o" B# Q3 B; w
#include <linux/leds.h>
, o2 Y2 o% _7 Y C! R#include <linux/platform_device.h>5 L( z) b) t1 u! i+ n7 |) A1 E
; G# M* y2 n( y. W#include <asm/mach-types.h>. O# A1 @0 [/ i3 R
#include <asm/mach/arch.h>* {0 |( Q1 p/ c; I- f% e0 C5 o) Z
#include <mach/da8xx.h>4 b* n7 }1 _' f
#include <mach/mux.h>9 q+ k4 s% h. ~/ M
/ @! i3 r0 w5 G9 P$ J z#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
' V! \; I! h. ]( ~# S/ Q- f1 ~5 v, J#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
1 Q+ T, y! C+ @+ P T3 J% j#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
|4 I( F4 E. G2 ` H- H#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)0 ~% X9 N0 P# E
2 }$ O8 X/ Q( V) J/* assign the tl som board LED-GPIOs*/) c% z# [2 V3 H$ S( k# G2 [8 `
static const short da850_evm_tl_user_led_pins[] = {7 s! D r0 J$ M0 O, r
/* These pins are definition at <mach/mux.h> file */& @; C( }3 O _' Q+ @( H/ o; j
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ j" F L# H! g, H6 W w
-15 O4 _& k& Z# n( t6 @9 h
};# B; c) M: B- ^$ T6 K1 q
( x. F# n- c1 ^- e! d1 x( L
static struct gpio_led da850_evm_tl_leds[] = {2 q8 V" _5 c& T. ~* A
{3 f6 i3 D/ q' ^0 x& l3 E% r
.active_low = 0,
* q6 b+ v* \' n6 ^( N .gpio = DA850_USER_LED0,
4 r: d9 o" R/ r- [+ f2 C .name = "user_led0",
+ F- e. Q- I4 S3 Y6 C8 ?5 F .default_trigger = "default-on",/ S- s4 C, C4 V7 ?& U# ?
},6 S& C. b! O8 c) V
{( M0 c3 T* y- z& s( ?; k
.active_low = 0,1 {4 [' W) x# A
.gpio = DA850_USER_LED1,7 ~9 J$ F- S5 y' s* J
.name = "user_led1",
0 e; I; n, {! h1 Y. b. [ .default_trigger = "default-on",
& q5 ?9 {# c, i S) V" m' T% | },/ P! Y, B" ^2 ~8 A& _: g
{, W0 ^$ K. A" ~
.active_low = 0,
% M3 ^5 X) I8 c) E4 A .gpio = DA850_USER_LED2,
3 f3 \% W0 O- N, T R2 s) A# E& N .name = "user_led2",; y4 M3 X' O; |) J& y
.default_trigger = "default-on",+ r, g5 K9 m, w3 T) a8 o
},
: s) I. L. B4 U1 W. Z0 R. U {
% A9 a3 q) ]! G1 s, f .active_low = 0,
5 p! j& q' N: B* j8 a2 V .gpio = DA850_USER_LED3,0 S6 P, e8 W8 w8 U
.name = "user_led3",& E9 F( t/ r9 ~$ q; ~, w
.default_trigger = "default-on",
4 F' Y' L' k* N },
- Q$ Y" o- C$ I. t; D};" a7 i" k: a) M6 p9 l9 c
0 x' |. @# k8 J' t+ q4 Ostatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 D" o; r2 S4 M' W( G9 x .leds = da850_evm_tl_leds,
. M8 ?4 {; C$ ^' v N .num_leds = ARRAY_SIZE(da850_evm_tl_leds),( P" p6 n6 s* F' c _- F O; J
};( y$ Q3 F! h8 @3 n
$ Z7 t) f; D% [4 Xstatic void led_dev_release(struct device *dev)6 |5 ?8 z) @4 D, V, Z, @
{* J, r; Y, O$ R% P" k; D
}; ^6 N( Z$ @) u! Q
6 v. } H$ ?: K. m8 N, T
static struct platform_device da850_evm_tl_leds_device = {* @. `) |0 E; e3 q
.name = "leds-gpio",
6 U1 a* t6 m$ P3 g .id = 1,
- [0 F. ?; h- D( g/ x .dev = {
4 `4 Y2 U0 p) p! ^ X .platform_data = &da850_evm_tl_leds_pdata,
6 a6 j, y) S! Y4 r. w .release = led_dev_release,
6 s5 V Z, h& ^, D }
+ j6 I$ {+ [3 s: I r+ |7 ^};
# q- M4 C, m- i2 q
9 t8 e* E7 Y9 k# \. o2 s- zstatic int __init led_platform_init(void)
# b) q+ w, E# k2 T" c' \{
, T u. s/ M. [3 P2 {( f3 T int ret;7 z0 r6 x4 l4 W% U" _% y; F
#if 07 P o8 ^$ Y% P7 S
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
( c9 |5 S! Z' i, R: r2 U; M6 g8 ~4 F, H) ? if (ret)
0 k" x4 Y! U H5 H8 j5 L! h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
$ Y% a; D/ m+ g "%d\n", ret);
$ }1 m* M1 E7 O" g& j$ S+ h#endif3 o8 \1 R: ]. Q; X
ret = platform_device_register(&da850_evm_tl_leds_device);
- j$ B, _1 g4 r0 \+ t if (ret)6 ~8 }2 L* {) ?2 m4 Y9 p& k
pr_warning("Could not register som GPIO expander LEDS");
) R5 ~3 V' O/ \6 y; S$ z8 u, ? else
9 ~* o- m K8 H4 s5 [- n" t9 U: M printk(KERN_INFO "LED register sucessful!\n");. J8 L6 v! Y1 q. V& ~
7 e, p0 E }1 R( z' x3 c7 V( o return ret;
$ D- e) j) k0 S3 K6 x}' W. P; W+ f8 i8 E* ?
' e# p( \' N9 f1 W- U) C2 y
static void __exit led_platform_exit(void)5 A, u$ G( p( ^ e
{
k+ A" I" h: @! E: _ l) T# S& y platform_device_unregister(&da850_evm_tl_leds_device);6 t5 C: Z2 c' A
8 c, U' Q) ]8 X5 L8 B* I
printk(KERN_INFO "LED unregister!\n");
; ]( P% H8 I! g5 o5 \& @}
/ n' s9 a3 e0 Z4 N5 I
6 D: ]. Q, J, ^3 C% { \module_init(led_platform_init);5 y4 j4 t- C- G5 M
module_exit(led_platform_exit);1 [5 t3 N1 Z2 u1 w) y/ H, b
+ U' }6 R( {# |3 x
MODULE_DESCRIPTION("Led platform driver");% i! M6 h4 a5 z2 ^9 h: | Z) X
MODULE_AUTHOR("Tronlong");
3 h5 w! Y: D! N0 M' {9 Y& pMODULE_LICENSE("GPL");* R( l# z/ z% Z0 Q
! m! }5 G* Z c+ C |
|