|
|
求大神给下面的程序做注解,请稍详细些,谢谢。( o& W" l9 |, u& P/ s( {
#include <linux/init.h>3 {, l; o3 w9 M* e7 z2 K
#include <linux/module.h>
% z5 ~# m. l; q) S$ a4 I; T4 A#include <linux/kernel.h>
0 H9 z* n/ F u% Y& g/ ?#include <linux/types.h># z, u$ k* y, m9 K5 |
#include <linux/gpio.h>5 |& W) e- H- b2 U2 J. I& q7 |
#include <linux/leds.h>" }) C0 ? w! T
#include <linux/platform_device.h>
+ j7 \- t) L, C- n% H' r1 M7 a# P' m0 R7 h6 b; }" \
#include <asm/mach-types.h>- N [0 |" B5 Z. {' n
#include <asm/mach/arch.h>0 Q9 x3 }, _: o3 Y
#include <mach/da8xx.h>( u5 }" Z9 c* @; N
#include <mach/mux.h>
( ?" w0 |0 Z7 j; H+ {( K: O7 ~
% T I5 r5 A, M" v2 t#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)- ~/ e4 M6 l& V( V
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)8 l6 T9 d6 {; B: K3 a
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: h' `8 x3 f7 |#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): ^+ w* I0 D; g% ?+ r' t8 F# Y
$ k8 g4 D- O" z$ V |1 b. @
/* assign the tl som board LED-GPIOs*/
9 W1 `) E8 [ w. k5 Q. J1 z n) vstatic const short da850_evm_tl_user_led_pins[] = {
2 L' m& N6 b! z, k4 b: y /* These pins are definition at <mach/mux.h> file */% P' W$ `4 ]5 r7 z4 C" H. J
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ j. F& N1 K0 A0 {! U
-1
6 X; q4 X) v& `& S; N1 Q( ?& m};
# d. l5 n" M% k( \$ A8 M+ v. R q% o' R0 E0 r
static struct gpio_led da850_evm_tl_leds[] = {. j/ Q/ A$ A' i5 k
{. Y' ~3 k0 q5 U3 E5 T" o. @
.active_low = 0,
4 q, \* m4 `, w$ K% F& n" c .gpio = DA850_USER_LED0,
: E5 d4 R5 z$ B: v1 z A' i0 k .name = "user_led0",
7 q, x1 F; W7 L0 I6 N1 `' P# X$ ^ .default_trigger = "default-on",
% }: F" ], h2 ^" ]0 D },/ t/ G- ?4 \$ Y: r# g
{
+ Q! s) W5 v6 |. D .active_low = 0,
* f7 v$ `6 p% T .gpio = DA850_USER_LED1,
/ q' l( p2 F4 g# Z8 a .name = "user_led1",: D: d# @- j8 A& K2 _6 T* u
.default_trigger = "default-on",
9 \ M' `" T5 [. B },: K2 w- |6 E9 _# _: O/ d
{5 \* H, {* `+ z9 G; i% ^
.active_low = 0,
% b( I- J7 I5 O e8 R: ~1 g .gpio = DA850_USER_LED2,
; p( M2 P. V- ^& @ .name = "user_led2",
% c6 P" R8 U( W1 ]7 ~ .default_trigger = "default-on",% R! H( x$ t1 D" `+ b; _
},& x4 {& @8 m8 p6 G% u
{
/ h" ?+ h+ O# X" q# `; o1 @# O .active_low = 0," L6 C6 W( r9 Q1 D
.gpio = DA850_USER_LED3,1 l2 I7 c1 x8 u. i2 A
.name = "user_led3",
4 x, [+ i! j5 f( B: Y) @ .default_trigger = "default-on"," @6 c5 c* h8 E2 D5 i' C1 {
},% h4 Z, U h# G0 S' p3 {
};
]6 `% L9 l+ \& G! G1 q( D9 s$ V4 r8 o2 e9 ^/ @+ i- `
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {, H- }; S+ z/ t( N+ w2 r) T
.leds = da850_evm_tl_leds,
$ {1 B) T( F" u) q4 `' E6 k .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
" {( J* F( u9 ]" r5 i. G, R};
$ p H* |! d0 P9 f" |9 | P8 A0 E5 U, d5 Q( U
static void led_dev_release(struct device *dev)
% e d- ?$ ]( m! C2 w; Z{
* {# g: N1 V& E: ^};# _1 H0 ?. K. S: b$ r
" m) b T, X9 z2 P) |static struct platform_device da850_evm_tl_leds_device = {
" u: \' M# E' V7 c7 T .name = "leds-gpio",
3 I+ R& e# m8 u: R2 s9 U* F: C .id = 1,
, Q* |! C* ^) G% p) A4 p1 z$ u) d .dev = {
' X1 \! S% h; f9 r1 V; n: `& J .platform_data = &da850_evm_tl_leds_pdata,
$ {- p5 g0 m" I4 V5 Q .release = led_dev_release,0 B1 j, b, G( C; U
}
- p( a# Y9 C P }* d9 f4 S};
- f' _. J8 V8 d/ x" l+ [5 @/ _( q$ d% P0 ~8 G" Q9 I
static int __init led_platform_init(void)6 S( |! p+ ]. A/ v1 ~0 s
{8 v$ R( @% g( ]4 b+ h/ v8 f8 x
int ret;; q. h2 Q a# R/ o5 E# G/ Z. c
#if 0+ h% c( G: S! Y1 a! S
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
2 N; z& I3 @+ w: P4 X if (ret)# t; v& t8 ]! i1 I* z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
/ e. r! l! m) k" K: Y, ~2 t "%d\n", ret);
4 _! q c$ H/ O#endif3 w8 c% O% U4 U0 k' O1 \. z
ret = platform_device_register(&da850_evm_tl_leds_device);
! g+ j' L2 R7 w if (ret)2 R( O2 g/ B& \& n6 N" `. D
pr_warning("Could not register som GPIO expander LEDS");
# H' E( X; }4 o else
5 I" @. o# E; a7 R+ q& | printk(KERN_INFO "LED register sucessful!\n");
M8 J5 \4 a, S7 F& h1 Z/ B h8 |; Y% q
5 u2 h5 ^ Z" a% D3 _/ `3 o; d; c- | return ret;5 p* f6 c: W$ c& ? G& V
}
& r6 }. k/ S: Z2 ?/ t" X" ]% V0 N7 @% p
static void __exit led_platform_exit(void). q3 |. K0 O2 @ p
{
8 ?5 ~; x2 \. p; V, z platform_device_unregister(&da850_evm_tl_leds_device);
7 S5 u, Z+ k: R0 K/ P$ P" n5 R0 z m; g/ r: y) K2 j
printk(KERN_INFO "LED unregister!\n");; L9 I2 X+ ?$ u5 N# X
}1 \: w2 A/ u6 N4 H/ L
9 U# H6 C/ r8 ?3 E1 w5 `* Q
module_init(led_platform_init);! D' Q4 P$ a: B1 G2 O
module_exit(led_platform_exit);# h! u1 m' X1 o- P0 O7 o% h$ t4 j
' y9 |+ I4 A4 e! T
MODULE_DESCRIPTION("Led platform driver");0 {6 i& U! r! M9 u* s
MODULE_AUTHOR("Tronlong");1 R5 `1 a6 m2 s0 e" i; `0 y$ Z; P2 L' t
MODULE_LICENSE("GPL");
! j7 ^: C* z1 e) C, G: j
8 r& R7 Q8 X" X6 t {8 h1 w |
|