|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
/ K! \% E o y4 e% [" t- p#include <linux/init.h>" U) z% F: |6 u8 N
#include <linux/module.h> _5 A: x3 h9 E
#include <linux/kernel.h>
9 g, s2 D& [ _#include <linux/types.h>5 w- ]: Q6 G5 J5 m. r6 M
#include <linux/gpio.h>7 }# r" t) T6 c! X& _$ P; J7 Y6 g
#include <linux/leds.h>: `2 j& ~, N! A; M) L P9 o
#include <linux/platform_device.h>6 r$ n: R* d& J/ b" w/ Y
$ ?0 \; G4 A, J
#include <asm/mach-types.h>9 L5 Z) O4 K9 u& _* f4 E5 O
#include <asm/mach/arch.h>- o7 E. h* O5 O3 I# z/ z1 a
#include <mach/da8xx.h>8 x! ?) [3 f& `8 c. g4 w2 E! n
#include <mach/mux.h>
/ i% x- V6 J" A
0 k" U" {* a$ S1 W1 m#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& ]! E, g1 p# Q* R. @( v# r f#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)! i* Z, U' e9 k6 Q% b4 _2 M/ o/ {
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)+ s0 ?+ M1 K* ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)# Y' K3 E9 k5 [& K9 }
2 S3 p, u# v: L4 e3 R/* assign the tl som board LED-GPIOs*/
% S& g( s+ o: d* y. @& I8 u6 _static const short da850_evm_tl_user_led_pins[] = {4 P2 Q0 T$ k7 c3 e4 @. ]1 n
/* These pins are definition at <mach/mux.h> file */
7 j* S1 U* t3 r& {( Q2 I DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ r! Y. ]* Q0 H- G1 u
-1
; i: n$ l8 g! `+ g: K& |};
2 ?' {2 \: f& o. q7 Q( G
# H2 p: D- s" K2 f9 ?static struct gpio_led da850_evm_tl_leds[] = {
; @. E; q9 H8 f3 C: O$ @ {$ l( f* n0 H' I( ~* c/ S5 x
.active_low = 0,
. M7 u$ B$ U& A" S9 G .gpio = DA850_USER_LED0,3 E9 J+ J9 v; X9 E$ A3 D
.name = "user_led0",* \- f) I- O- C" |, X) m4 h- b
.default_trigger = "default-on",- x3 Z6 L4 g* J+ Y
},
& G& C2 W Y# n& W {
4 V. V- G- y# d; ~" g! B .active_low = 0, K/ J+ M& l8 l! E
.gpio = DA850_USER_LED1,
* h6 d( Y A# @# }7 ` .name = "user_led1",' Q! i. V0 A8 u( H' B
.default_trigger = "default-on",
, z( x& X' Q, b* n+ f },* l$ U5 ^0 n [0 a& P6 T2 _
{5 T$ F0 ^- x! P F
.active_low = 0,
7 l. V: ]( e% R0 J( \6 y% b) e .gpio = DA850_USER_LED2,+ C Y q$ [; I! o
.name = "user_led2",- J# f5 a9 w# A8 A% l( F h% p; T
.default_trigger = "default-on",
- z2 `% r' x* O, z/ D& ]0 j/ D },
* e% l5 h7 u/ l& [ {
4 j0 t. A' G* S" V- \5 H. f3 Y: y .active_low = 0,' _( b& q; l& q# C- x& l' h
.gpio = DA850_USER_LED3,
7 ^) r- H% ]/ Z( h .name = "user_led3",
8 L/ F3 s% ]3 o+ {+ z3 S6 B .default_trigger = "default-on",
B( S% a: C! u4 q; _ },
; }+ v' ^6 A4 y! M};5 T# Z7 A( K/ \$ Y4 O
8 U& W. p! N# z- e4 s. M" fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {$ ~; m5 r- B1 m4 x
.leds = da850_evm_tl_leds,
& R3 `) Y) b- O3 H .num_leds = ARRAY_SIZE(da850_evm_tl_leds)," W5 e" k, P9 ^9 F( k% \9 J
};$ N& f$ k) X6 H5 q; e( L$ j
" [, g& B: Q7 P' u: ?/ O% `
static void led_dev_release(struct device *dev)9 V8 v/ D3 f4 P# U5 k) E# g, C. I4 J
{
7 t- x* e0 q* U5 H# S};% S' z3 [4 w8 Z% [, O5 y/ U
& b! T" Z6 |8 b) vstatic struct platform_device da850_evm_tl_leds_device = {
0 ?' A0 }" n' t ~$ s8 \ .name = "leds-gpio",
7 @; N+ Q c# B. s2 D2 \, I .id = 1,# k7 h+ A8 U+ }) o" I- N2 g
.dev = {
7 N$ B6 L0 @ H .platform_data = &da850_evm_tl_leds_pdata,$ ]1 }; P( X) o5 N) \ x
.release = led_dev_release,
: q5 { H E7 {# m" h. i4 J }
) l0 j R [( |; s, W: u$ Y6 a};" U; `4 s. B. y1 R, a
/ r L) B: l i4 ?5 b& o1 W
static int __init led_platform_init(void)0 Z5 m7 |! J+ n7 K" q6 y( E
{
4 ~$ l& V& f2 q int ret;, _. |' @1 |5 d; H8 z0 t) P9 k) W; g
#if 0
/ {* O" c: S8 l8 T2 t- x+ J ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 r1 q \- C4 w- F' @
if (ret)5 j# l m. w& w7 B0 m* U$ z+ }1 \
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" r" @8 G- r/ m% V! J
"%d\n", ret);9 g t, {2 Q1 r5 x% K8 E
#endif6 N. H. h; e& ^
ret = platform_device_register(&da850_evm_tl_leds_device);4 j( n7 p1 l+ P* G* Y& w) b, O% K
if (ret)
$ ?7 J; \! A5 y pr_warning("Could not register som GPIO expander LEDS");$ \4 ]6 A2 V6 E- Y8 X- g; ?
else0 ^( o: ]5 q- v, y7 E- H
printk(KERN_INFO "LED register sucessful!\n");( |) k/ d! D& j! | d6 ?
$ R$ ~' e# f3 w# @. A8 z
return ret;
/ W2 |8 D" ]- r& u}/ C9 u1 |2 b7 A: k b! `5 o, b
: s, X4 A$ l" h
static void __exit led_platform_exit(void)
. L9 G3 s ~/ n/ H% L" p+ ~# V{
4 P [" i' k* H2 m platform_device_unregister(&da850_evm_tl_leds_device); X- k! F7 n5 ]+ b* n
/ O' E { E' a6 m+ G
printk(KERN_INFO "LED unregister!\n");5 J4 G% D1 `6 j
}
% b8 i. q5 S, x" s7 p2 C+ l! E$ k+ c- L2 N( k1 r2 p; ]5 b
module_init(led_platform_init);
5 g# Y. e `. B! Lmodule_exit(led_platform_exit);
& I' e/ A. E3 u' C$ W8 n! U
5 U! ^' ^2 c! n# |3 t+ @MODULE_DESCRIPTION("Led platform driver");
/ s9 N* @. a) |* s0 ZMODULE_AUTHOR("Tronlong"); g* B$ t5 f9 R3 i. m4 X+ Z- Q3 M
MODULE_LICENSE("GPL");
% ? B% B& q! m# U& {1 w
3 Q r# S0 n3 g% H6 M, | |
|