|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* b; \0 h8 V1 X) J4 _4 W
#include <linux/init.h># f8 x" t1 \1 r" J
#include <linux/module.h>
. t7 e$ a8 }: D6 C#include <linux/kernel.h>
# a: \. k) S. f#include <linux/types.h>/ A' h5 ~3 s y+ [( W
#include <linux/gpio.h>) Z/ v6 S7 j* `* H% I
#include <linux/leds.h>& _ i- D; F+ n/ B. Q6 C
#include <linux/platform_device.h>
/ f; c4 u& _$ i5 g1 c3 n3 W# ~ T- K4 q D
#include <asm/mach-types.h>% O4 M* J' `( b
#include <asm/mach/arch.h>
7 {' v' |% _- p4 m, A#include <mach/da8xx.h>
! r, Q( g( F" o: ]0 ]#include <mach/mux.h>8 p. @: z: Y2 X7 ?% ^
, |2 N' C. N- Z
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)- a3 [* S/ B: K- `( |
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
6 L' D3 P" |9 k#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)0 q, n* }5 B6 F( A8 `5 K) c
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 |: x9 D% u$ {( H
. O( F2 m6 A, G% i/ n* r1 I, ?/* assign the tl som board LED-GPIOs*/
) ~ R4 h/ i6 Kstatic const short da850_evm_tl_user_led_pins[] = {
* j+ Y( C; k# x1 A. _ /* These pins are definition at <mach/mux.h> file */; U$ Y# }' H# b6 N0 X2 @$ {, C# V# g
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,5 s4 K9 p* J, v, V& Q$ ?
-1% F+ j$ u$ a' q( V
};
, R$ G- o0 L; B! W' y+ K/ q& z- K" K- _8 `( Y
static struct gpio_led da850_evm_tl_leds[] = {1 e8 O; v& x* D5 L1 d
{" W9 X2 O2 L! G3 o$ F
.active_low = 0,
0 n# e1 V8 y, n+ l* ^ .gpio = DA850_USER_LED0,% o% ?9 O& p c: Z- D5 r; f
.name = "user_led0",. `1 F5 `8 V& H. I
.default_trigger = "default-on",, f6 p) S* n0 N' v% w7 P
},; I5 V* P& r2 l( N0 w8 R
{ X! y! ~ B; t1 Y9 t
.active_low = 0,& P" D* y E6 C) ? r/ d
.gpio = DA850_USER_LED1,# o6 m0 O6 O; s4 `1 @! e
.name = "user_led1",- }6 ?- A$ j7 }8 u G
.default_trigger = "default-on", m; s( y# S3 Z: g, o: b. L
},3 Q( N2 Q0 t1 |! r! K; o
{& H8 b$ z4 z; D# t1 |
.active_low = 0,
, v0 m z/ F E+ X( P0 C) g$ N! ^& E .gpio = DA850_USER_LED2,; q9 h: f; L; }: y
.name = "user_led2",
+ n. @ @' B* u* a) t. ^ .default_trigger = "default-on",7 o \. y& F) ^" N: Y3 M( k
},
% j% B5 ]! u$ P) z* O# J4 E* n {
" l5 _8 Q+ N8 ] .active_low = 0, {% f3 I8 @5 J% v0 Q8 \, z
.gpio = DA850_USER_LED3,7 D$ v9 C- I- A0 j
.name = "user_led3",2 \! o" Y9 \ D# Y# Y$ I0 f0 Q
.default_trigger = "default-on",) B. c. e7 E* v' x/ s: f) G% ]
},
. f! A2 A: c# e" M5 z};
' Y# s9 V3 M1 D/ Q4 ^. d( H* ?& L; H6 ~. O5 g$ W8 C
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. E% ^6 L+ \$ W# f# [
.leds = da850_evm_tl_leds,3 R+ J8 ~& J' D/ ^& X e& |& i
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),, b; z# @6 I# \7 Q
};, G: w( L& _ D) r6 O
/ \1 V% G& R) E$ p3 N2 ]static void led_dev_release(struct device *dev)
% b7 v, `+ }& [0 |{
( R. U" ^* Z& }( h- e' V% l ]};3 S% p) j) y! R. {9 i7 o8 v
. `& Z8 A7 u8 Lstatic struct platform_device da850_evm_tl_leds_device = {) _! q1 \7 ~; `4 Y# v
.name = "leds-gpio",6 A* _; u5 n: @, U5 \+ Q: b8 l& j
.id = 1,
+ e7 Y) p7 t$ q: Q7 U" ~( F# o .dev = {
( B/ N ?0 j+ ^ .platform_data = &da850_evm_tl_leds_pdata,; S P$ l6 ^& X0 v0 [7 D g
.release = led_dev_release,
4 Y) R* h) Q1 e3 w5 N }, m c/ L, }& O
};' `2 X1 ?, x! `" P! o
* E3 Q; j( _1 U& ]9 j5 }0 ]' e8 m
static int __init led_platform_init(void)
4 m+ f+ t4 f9 P{( x) @+ W+ F+ O+ s' L% r
int ret;
/ B: A5 ]2 r4 Y5 C#if 0
' ?. t1 ]! G" S ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 v2 R# l: F5 j& e# W+ R
if (ret)
0 {3 h0 w7 H+ ?) q" z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"4 s9 C& T0 j6 ?1 R7 y) o
"%d\n", ret);1 Z, ~+ O9 k6 D' c0 ~5 S1 @
#endif
4 q* [8 d0 `% [9 ]. w ret = platform_device_register(&da850_evm_tl_leds_device);8 ^# p4 D6 S2 j' r+ i
if (ret)1 `, b8 `, w2 K3 a/ K2 b) g6 j
pr_warning("Could not register som GPIO expander LEDS");, g8 e4 B* z; r' p3 ^8 Y5 x
else
8 A) r. U ^5 U printk(KERN_INFO "LED register sucessful!\n");
G$ ~5 i: b8 _# c+ }. o7 q% N
% Y/ H9 H) |* X: O return ret;
( e7 m; A, R- ~% T$ l( {0 E: o}6 O* v" s5 n: a9 d2 w1 @2 G
. K; L2 d: F! n" v) kstatic void __exit led_platform_exit(void)6 F2 I) r$ ] \* f& ], s) r2 _/ g
{
) D$ @: N2 r4 \: D# S; j platform_device_unregister(&da850_evm_tl_leds_device);
3 a2 [( k: v- K+ } }" E5 @( L; e H9 P
printk(KERN_INFO "LED unregister!\n");! N/ O# A2 Y L. o6 |2 M3 q
}
8 E" x8 j7 h z) f1 _6 `. b/ n* q
module_init(led_platform_init);
( ~: \! u& F7 q& W) W, p& [1 e8 }7 t3 C3 Amodule_exit(led_platform_exit);
7 I( B d7 w" n* G9 {" g, a+ H
MODULE_DESCRIPTION("Led platform driver"); S( Y; b G, x2 N
MODULE_AUTHOR("Tronlong");+ @- u0 X( w! v* ?4 A& w
MODULE_LICENSE("GPL");
/ D8 r5 E% O$ b, ^6 A1 j w1 w) u8 x7 \: O0 O
|
|