|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% `+ ?5 _: j: }# s) t5 W
#include <linux/init.h>) G; u( }+ u; N8 ] f# [
#include <linux/module.h>
9 K$ n' w6 R- q/ X. i, H- W#include <linux/kernel.h>
5 O3 K* ?% T: R$ n#include <linux/types.h>) [( S: f+ n2 n8 X1 L2 S9 P
#include <linux/gpio.h>
$ |5 r. e( s! z( ~#include <linux/leds.h>* m& J* o7 s# `
#include <linux/platform_device.h>
4 c1 s+ O+ V6 w+ O t, z- M$ t& j+ P5 @9 C
#include <asm/mach-types.h>: l4 h+ ^) l0 [7 T0 i
#include <asm/mach/arch.h>
- |5 R( ~0 X# i#include <mach/da8xx.h>' z3 }3 K) |- _, W& K* F6 ~: {
#include <mach/mux.h>
& W# O- o/ N0 v/ h: J r" n& v8 j* d4 b1 C/ y
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0). {) S: j. J; W. _
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5), U: R4 j! [- c( b* t* h
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 v, J% j! n" I
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- \; V& E) I* X7 a6 L6 ?- z
' m1 X4 B5 J8 @/* assign the tl som board LED-GPIOs*/$ U; C8 e/ |- N& E3 w
static const short da850_evm_tl_user_led_pins[] = {, ^1 @; e' q1 P4 s
/* These pins are definition at <mach/mux.h> file */
5 r" \6 ^6 t% j m& {* K DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' f8 U3 H, m/ X$ E! W9 b, M+ \
-1& F$ }7 N" m; o* \* O7 a- S" ~/ {8 @+ V
};
7 o# M" Y! u, q6 U. l1 {) R' P5 F! z% ^6 S, y$ D$ C# E3 }1 Z8 H) C1 k+ q
static struct gpio_led da850_evm_tl_leds[] = {
5 V _2 a: E; j& C {" d" X9 ]' P/ o! Z; p; `
.active_low = 0,
- ~+ t2 a. W5 |& B% r2 u/ S .gpio = DA850_USER_LED0,6 \+ G- t6 p% x; y! I
.name = "user_led0",2 a& P. v5 g* h& T! I( B0 \
.default_trigger = "default-on",/ L, M$ o @' p ^, u' B
},9 [: ^9 J% Q; _ c+ q& Q
{1 o0 c& F% r8 A% i+ t
.active_low = 0,
+ |) `7 n3 ^5 a% ]0 ]; I; G .gpio = DA850_USER_LED1,
+ B) L9 S0 o6 G& Q# G+ ]/ Z .name = "user_led1",
& b( N# u( V R$ E& C .default_trigger = "default-on",
4 V$ y, r+ F. R# G" v/ b! l4 ~- u },
5 z2 p$ A1 _) o$ Z1 p {
! j9 i% \- w1 D7 P5 Q .active_low = 0,, ^+ F$ D; ?" R2 S* o( o, P
.gpio = DA850_USER_LED2,: ]. A5 _, }' H* s, ^
.name = "user_led2",' s5 [- l3 `# h7 K% }
.default_trigger = "default-on",
" r8 R) x U8 e9 G },
$ d0 v( x5 P' y6 h& L$ r9 x2 G$ { {
) F5 Z; d: ]+ n8 I: Y .active_low = 0,4 q0 L+ Q8 o- x+ o
.gpio = DA850_USER_LED3," }5 O' u7 l2 P; p+ A) e
.name = "user_led3",4 E" u3 [$ R3 d7 w( z
.default_trigger = "default-on",8 P6 `- z+ ]* j' W3 O
},
- g2 q$ w q1 I0 ~( g};
5 l& r/ E5 e8 }' c1 M9 N8 ?5 C$ x
+ d8 n; |' e, Q7 }: L* b" Y# j- N& Pstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {% w6 l: U. V# f8 v
.leds = da850_evm_tl_leds,+ W" L+ | G9 n* P! D8 e
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
( N0 A+ k' F8 l2 O) @( ]3 v; a+ r};
2 g: u- S% \6 L- }! o% S& a( Z* o1 C3 K
static void led_dev_release(struct device *dev)
! T$ C, D- `8 I* j$ `7 I{
! `9 J5 v( M3 w};
+ F2 L. J1 {9 m4 A" W* k2 l+ a% i' ^1 J& l+ w- n3 `5 A+ K) C1 c' c
static struct platform_device da850_evm_tl_leds_device = {
* I/ y$ q5 r+ T7 t, ~* p% i: N .name = "leds-gpio",3 M" R6 F* c8 o9 h5 T( c
.id = 1,
7 A5 y0 O& h' \5 ? ~ s! [ .dev = {
( Z+ h- l; Q6 |8 z" Y- h .platform_data = &da850_evm_tl_leds_pdata,& q4 n+ L# K/ ^: M0 V# v6 ^
.release = led_dev_release,
4 K/ @: X# w" C+ I }
/ T; }* G4 h2 u" u% O: p};6 @4 H9 \; W, |" _ {
# e3 B2 e- e" Q2 z+ S& g" Y
static int __init led_platform_init(void)
/ i' Y a/ q$ ~' O( n{
3 ]7 I( B/ [& X2 n int ret;( \/ [$ v( D. C n N3 [; Q: F4 {9 h
#if 0
" t; Q5 h! _+ T7 h! } [ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ a' R+ E4 _: s/ {6 @- \! Q; L
if (ret). p) B1 x5 I* G2 v9 k
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 D+ n* h$ U# q: R, r k6 c4 F
"%d\n", ret);; Q/ `8 H/ x$ h2 k- `
#endif
) ~0 N- k7 [$ R# E ret = platform_device_register(&da850_evm_tl_leds_device);2 U& L# u e" q1 r1 Z3 {/ Z# m
if (ret)
: U: ~# I- R3 U0 \+ k pr_warning("Could not register som GPIO expander LEDS");
8 \3 J5 o4 s: J' Z, {- A: K" m& i else
, `! F# C G: V& n) F printk(KERN_INFO "LED register sucessful!\n");, l3 G8 c! D0 B. k' g
; [. @& O" u- \0 ?( f/ e return ret;
" a5 w' j/ x3 A* z+ \}
- p4 P# T' x" I7 F
( K1 g' ?1 Q# z! V5 N7 t9 \2 Ustatic void __exit led_platform_exit(void)
% N& C Q: D7 o8 v: G0 U: b2 l{
$ n% R- a# W. C% ? platform_device_unregister(&da850_evm_tl_leds_device);
& V) { M- \. E* `9 N
- o4 H5 u( o# ]9 B* H( g: L8 M printk(KERN_INFO "LED unregister!\n");* B# R/ W0 m. d. ~* n
}
+ g( i% o4 s! e* B& e& y* [9 P. q1 Y4 f- a( r/ t2 f4 t
module_init(led_platform_init);4 r; ^# \: h- T1 P1 t3 R$ |' v' Q7 `
module_exit(led_platform_exit);
" C* ^# l% L# x1 O) {, r# H" T" X2 w
MODULE_DESCRIPTION("Led platform driver");4 m8 ?+ V7 k+ x0 \
MODULE_AUTHOR("Tronlong");) y0 Z( X7 c6 s% [
MODULE_LICENSE("GPL");
/ H( O; S3 R- V! S$ T& l; l, O+ F8 s% i
|
|