|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
$ |/ R8 { B9 J1 G+ \: o#include <linux/init.h>! i. r) ]2 w9 K4 e' S' ?6 k
#include <linux/module.h>6 m2 X6 L& h6 q) w9 l% c
#include <linux/kernel.h>& t+ @3 |6 z9 g" t0 Y4 s
#include <linux/types.h>$ f3 h5 {) u+ z" @; y) H
#include <linux/gpio.h>
$ L7 J1 z% ^1 {9 H- @#include <linux/leds.h>: T) h% f5 ^$ t/ h
#include <linux/platform_device.h>
- l0 \5 E( F! c6 Z* u7 n
- Q) R2 J4 S6 Z7 q7 y6 \( I" f; W#include <asm/mach-types.h>
5 G: w: p% z. E( ]#include <asm/mach/arch.h>. b6 W7 F, T3 E
#include <mach/da8xx.h>9 l6 N! X, s; N* d L: K
#include <mach/mux.h>
9 s" Y6 n! L+ q, m" h! {2 b+ e/ }$ z9 A, P# E U
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0), F5 o6 M) i/ a
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 ` v& v$ x, w8 |! w, P( o#define DA850_USER_LED2 GPIO_TO_PIN(0, 1); n8 f8 F4 t7 h( C+ g+ v$ f
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; }! B* p: z. T9 D" k L9 x% Z* z% R) ?, h$ {+ X
/* assign the tl som board LED-GPIOs*// E8 V7 Z4 p1 ?7 I. l6 k5 j
static const short da850_evm_tl_user_led_pins[] = {1 y( a3 ]& ]# s( r+ y _/ m e
/* These pins are definition at <mach/mux.h> file */
9 n5 C, D+ S7 f) |/ p0 H8 S+ ^ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) ]# K. L% ?( F2 G2 T9 L4 ], c
-1& B3 N! j7 I" q2 j4 ^) S- v
};
" @# O/ v" G) Y! _ o+ X0 [( q/ i6 h# a3 @* D* g
static struct gpio_led da850_evm_tl_leds[] = {! o$ x1 A7 u1 Q' @& j
{1 w4 t8 B$ m- y$ U6 l' L
.active_low = 0,: O4 u4 s _) \7 q \* ?
.gpio = DA850_USER_LED0,% `3 V, I9 o+ G7 B
.name = "user_led0",
/ q. w% Y& m* d- u( R1 H B: N .default_trigger = "default-on",
B! H6 ~4 Q4 b6 n- ]5 f$ u% z },7 Y4 t$ `6 l9 T; \7 e4 ~/ ?8 R, L1 a
{1 U& k8 E0 j3 A' i3 N9 Z
.active_low = 0,2 N, U0 h9 ]' O: K; f: U
.gpio = DA850_USER_LED1,6 \+ D6 o/ {4 I' j
.name = "user_led1",
4 x% l. Y5 Y3 h. F+ }; ?1 _ b .default_trigger = "default-on",
: _) ?3 t: `6 ?( K C$ j; \ },. c7 y1 W9 w7 ~0 q, G
{* K& d7 V7 Y, i6 Q& Z) \
.active_low = 0,
+ J# M2 G# p7 g- Q& b+ S, G .gpio = DA850_USER_LED2,; F: k7 D9 W' J5 T: j$ J
.name = "user_led2",( A. e" _6 [" j7 B1 `4 O0 F% S
.default_trigger = "default-on",3 s, G! t$ ] i0 d" g1 L
},6 @1 d u& K5 g2 V* i7 T
{
- I. U$ |" H! f2 O* E: W .active_low = 0,; c& V! [# p1 V4 g+ P+ Q
.gpio = DA850_USER_LED3,8 t B8 q2 i4 R, F% U6 k7 W$ s% q2 _
.name = "user_led3",
! P, h% q5 \- w .default_trigger = "default-on",, I" z9 v# E9 V# z: A' G
},
% X; W6 F, g6 j2 \3 ?1 t5 [: ]" z};+ I1 d* u* V5 L# a# U$ _3 _- p
/ V/ s. P7 \9 i+ k* C' Z0 P' n g
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: V7 I) }9 b+ W0 q1 u7 {0 R .leds = da850_evm_tl_leds,
% I. b, X2 P% q) Z- { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),9 S# V9 ~- \: t, S, v8 F1 y- B
};
# R: Z( M$ x( `3 ]/ n' n
2 }, F2 W* v$ [6 Nstatic void led_dev_release(struct device *dev)
4 ?" J1 e- K! H8 l; ?{6 Z& s$ y* a3 s+ A+ p
};
% R4 Q1 s& M" j* z+ I+ N: D% [& m# x& J: }: ]
static struct platform_device da850_evm_tl_leds_device = {
8 \: \6 K4 A/ e1 {* {+ e0 M) o- I .name = "leds-gpio",5 T7 B0 A' K! Z# \5 g% I+ }* ~
.id = 1,4 S \4 G. `' L; W1 s5 Z
.dev = {; m2 }$ X( L ]/ s
.platform_data = &da850_evm_tl_leds_pdata,; |3 z( ^1 d8 [: ~
.release = led_dev_release,
0 i# Q+ _& \' M- f }
9 `$ {0 V# T. ]};8 v% v7 H' f" P
$ Q" b# f2 W! H
static int __init led_platform_init(void)
9 \! P# }8 s1 Q- _( z1 [/ Q: J9 ~{7 Y( t$ c; }' F$ t9 w
int ret;
6 |7 t% F8 m- z* U, l2 o3 d#if 0
( ] S3 W- c+ A& Z/ T# ? ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
! H) b/ b, j7 o s if (ret)
5 o: n( c Z$ u( V pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
: v6 @, R0 v, Z6 P; |+ S$ L "%d\n", ret);
0 J; {! a& f) t) j9 K#endif: e1 o) G7 J( f2 c! J8 i4 g
ret = platform_device_register(&da850_evm_tl_leds_device);/ {9 e ?3 `- S2 j' x% s
if (ret)% p3 B2 t8 v8 F& T
pr_warning("Could not register som GPIO expander LEDS");
$ ]: m& e6 L; n( y else
+ _2 m# R) T0 M d6 l printk(KERN_INFO "LED register sucessful!\n");
, t* Z6 m I4 ?7 Y
/ l3 P% X! d, w1 {8 d$ A return ret;
1 M0 F: o2 U4 ?, J4 l}0 M. b+ j; |+ ?! I- `
+ k% }+ v/ J& w/ h7 G& }
static void __exit led_platform_exit(void)
$ p; ~0 Q+ P1 f: q{1 B+ i, t9 ?: q; V
platform_device_unregister(&da850_evm_tl_leds_device);; X# G* [6 @" p+ T
% U" m# ~, }' ~ printk(KERN_INFO "LED unregister!\n");# ~" H% K) j: ` w0 P
}
: {7 g' A. r- y1 A$ g$ c) z' r9 @$ O7 g$ x, I" Y
module_init(led_platform_init);
# {+ o, A( j' g, m0 F% Nmodule_exit(led_platform_exit);5 e8 m# w' U" V5 C$ G
5 v. ~: X" K5 RMODULE_DESCRIPTION("Led platform driver");
: {5 @+ Y9 X* S/ W V" P$ rMODULE_AUTHOR("Tronlong");" @2 e& s1 j& ?- {6 D- f0 w! o
MODULE_LICENSE("GPL");
) g+ d+ Y8 F0 q: c) Y9 J5 u1 \( Z8 x C( S8 m4 t4 B
|
|