|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
; T* N! `- F! S1 G4 t7 W#include <linux/init.h>% o" `) Z! W& D
#include <linux/module.h>, U1 T$ K R; l
#include <linux/kernel.h>
- E9 t H/ [) K#include <linux/types.h>
! m; r3 h5 k! j% q2 h#include <linux/gpio.h># V3 }8 o, `) k& w; O4 f
#include <linux/leds.h>+ Q: m' |, X! d0 Z4 b: X1 G# x$ `
#include <linux/platform_device.h>: R: _) _8 }( I
. X L: i# z8 W
#include <asm/mach-types.h>
5 U1 x, S! w; N. @* {#include <asm/mach/arch.h>/ [" E! q+ k a
#include <mach/da8xx.h>
! B7 C$ I5 w7 K, P+ v- q" q#include <mach/mux.h>
u e G: X5 F9 U7 v k' B( E. W. R" P J5 I
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 j4 Z8 k* a& o4 X: `+ a$ i
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 g1 P: j6 l6 s: K! {- y( r: m
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% |9 X" I" P% ?' x4 n. G#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
0 @, K( K1 o6 c) o; c
6 {) y E1 t) i. w+ R) e/* assign the tl som board LED-GPIOs*/
) l. K. [( G/ cstatic const short da850_evm_tl_user_led_pins[] = {" {6 x+ R# B' O! |& b1 n" F) r
/* These pins are definition at <mach/mux.h> file */) e4 z' D2 k( N! ~0 \
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,2 n& l x8 m; |! G/ f
-12 f; X" q% U! ~3 g* } F8 F
};$ |. |, A) {9 v k
- @8 l) F+ K0 l# rstatic struct gpio_led da850_evm_tl_leds[] = {- j: ?! h- l0 b. y% F) Q
{
3 v* W: M* y2 v! b .active_low = 0,
+ F! A0 K( o- F$ s& Z0 L0 _ .gpio = DA850_USER_LED0,
0 Y' A) k5 r5 z" A7 V .name = "user_led0",8 y2 j" I; c/ x! b2 g+ u
.default_trigger = "default-on",
4 f! X! m* B3 J8 A. W% i3 n },
; D& o- P. q6 {$ z. @ h {- t+ ]% E* M& ` {' \5 U: j& K
.active_low = 0,
* r% ?2 F; z8 _1 ~6 t .gpio = DA850_USER_LED1,
$ h! |8 K5 c% x) E& s; N .name = "user_led1",
5 B8 j" J. e- l2 | .default_trigger = "default-on",# U, \8 B0 w$ _8 a- o! f" G
},+ p! ~ P+ T! q5 {" c$ `) g
{
8 Q8 C) ?/ n( u B! n .active_low = 0,
7 d$ S! _6 q z4 R) |+ A% u* Y .gpio = DA850_USER_LED2,
8 i, M( ^ _4 r& m% a .name = "user_led2",
6 w h, _7 W/ \' W9 J# _4 e .default_trigger = "default-on",
& A6 i* D$ k& Z },8 g7 G3 O1 q! o& l/ b- ^% h
{
! _) l! u9 y( q; q) N .active_low = 0,
# G( d; T" G4 _$ H .gpio = DA850_USER_LED3,
4 l3 ^; ?+ D( j3 t .name = "user_led3",
8 g' `8 f7 {1 h" t! H3 A! s8 V .default_trigger = "default-on",) E0 ?! J5 \7 s. l* \4 ]3 q8 e: O
},
( d0 j$ o* M- Y};
7 I2 `( E* q8 H) e( ]4 h; c- F9 s- R/ T b/ O
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 `; @! F0 b" m( P
.leds = da850_evm_tl_leds,
( [/ j: M3 @; R+ @9 i& a .num_leds = ARRAY_SIZE(da850_evm_tl_leds),/ D, L& v" |! t
};
+ x$ B0 |- X4 U {% |/ Q; E6 T+ i- u4 Y" [( a% W* e
static void led_dev_release(struct device *dev)
0 G7 x& x0 T+ A{
% a( R: A i0 m2 {9 U; x# H};
: O, r2 Q3 h. y5 m
0 T$ h+ d' g7 V) k; J, x/ a7 kstatic struct platform_device da850_evm_tl_leds_device = {/ N9 E0 `( N7 d' {0 \3 Z
.name = "leds-gpio",
4 Z/ I8 f& V9 `" U V8 ` .id = 1,
# f! t/ U. q$ K2 { .dev = {
' J" j* I* n9 q x3 n5 S) E$ o .platform_data = &da850_evm_tl_leds_pdata,' @' S, P! t: Z& n
.release = led_dev_release,0 C/ b+ k4 c. l' I( c
}- |& u Z0 ^1 d
};
# c7 W) K1 z b1 ^6 j. L3 @! x1 i: f" |! J4 X
static int __init led_platform_init(void)% q9 u( i7 ^9 p2 p9 H0 M5 m/ ^
{
+ e) _- M. M0 E7 X9 ~ int ret;2 c3 b$ M n: m3 Q/ {9 _% s4 o
#if 0' i r! K( y8 c1 ~
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 H( B8 T: G! a, m$ o6 F8 x$ |; q
if (ret)9 }: y. b- F! U( X- ^8 a
pr_warning("da850_evm_tl_leds_init : User LED mux failed :") l. |* K; ~7 Q {- |
"%d\n", ret);
2 M1 u2 k0 W4 M- H. E2 Y# H#endif4 W; v/ \: x Z/ b6 s5 O. h5 [5 f
ret = platform_device_register(&da850_evm_tl_leds_device);+ A% D I( C- @" n1 L0 h1 k
if (ret)' i# q2 k, b0 g- d
pr_warning("Could not register som GPIO expander LEDS");
) M6 s8 w5 }! S$ ~+ j7 D- q! f. L else
" ?6 K1 s, n" k6 Z/ Q D printk(KERN_INFO "LED register sucessful!\n");
9 f9 e7 P! z, i1 a4 P/ |/ }/ _7 p5 @8 K8 A1 E9 G
return ret;
- h- ?- Z0 D2 G- h$ p}
( v; ~9 k7 }! g5 w' B2 r" ~3 }$ C: T+ {1 s b- w/ H5 O) M
static void __exit led_platform_exit(void)
+ N0 L; `# }9 c5 d" ?{' d! U7 D- B8 B7 {: M. c$ F4 Q
platform_device_unregister(&da850_evm_tl_leds_device);1 B9 [1 S. i1 [9 W
* B; p' i, g( Y9 M! `7 y printk(KERN_INFO "LED unregister!\n");6 \, X5 d+ w6 x& {# a1 ?
}# b( U" @' E# B0 G6 s! ?: p" _$ V
' d" ~1 H: {) n3 W( f4 bmodule_init(led_platform_init);/ D$ v: l6 I4 |% q9 A# w$ U! r/ l/ y
module_exit(led_platform_exit);
, ?, x ?2 K, z: c/ l! j3 Y0 R6 R: O/ c) `0 Z5 ^. e
MODULE_DESCRIPTION("Led platform driver");
$ [4 P( F' U! o+ Z2 T, _MODULE_AUTHOR("Tronlong");
5 l! e( m& u; J$ M1 o3 D+ fMODULE_LICENSE("GPL");1 t. G% z% |5 [! x* R5 p; L
; T# w8 b* w* R* H |
|