|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; M0 I6 w& i% |7 f
#include <linux/init.h>1 j( X! n, E9 j$ D% y: j
#include <linux/module.h>; A) U' d- M2 ?8 E4 ~% I' k6 O- V
#include <linux/kernel.h>" D$ X# m/ [, Q, r
#include <linux/types.h>
7 D6 t1 `" m X( [+ _8 o/ _#include <linux/gpio.h>1 c4 c9 w+ O7 r4 W4 m
#include <linux/leds.h>1 J1 S9 R5 h, ?/ p! r
#include <linux/platform_device.h>
9 h; B3 O u. Z3 t* l. d) I( k7 G- X9 ^. M! f& j, ~
#include <asm/mach-types.h>1 N! r9 x; X; A9 p A7 t j
#include <asm/mach/arch.h>8 ?# u/ X4 O% _% L7 L. F; x: I
#include <mach/da8xx.h>
" T& c. D F& J6 q$ M' k6 z0 m/ f: i#include <mach/mux.h>, ]" f6 K+ s5 `3 v# { c
6 F* D* s8 L" h# I2 `" L$ [+ ]$ R
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ y) v1 E0 Q) g& Y9 ?4 j: p
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)# g* \, z/ `6 Q. j: |: P8 V8 L
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)6 Z* ^& I* h3 T7 b. o3 |3 c" j
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 Y" }/ \$ ~( d8 ~1 r& l8 J0 H; E! P( n. r0 M5 Q5 h1 [
/* assign the tl som board LED-GPIOs*/" S. @: k h, }+ _4 I' d: a& H
static const short da850_evm_tl_user_led_pins[] = {- m; L! Y5 Q0 \2 v
/* These pins are definition at <mach/mux.h> file */
: ?* C; j) a) s4 K( n6 V/ t DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
& i% R P* _! [/ @# E/ E, y8 ~ -1
1 x0 Y. P, \6 T V2 ]! p5 k9 g};4 P7 G' n& Y1 U0 E) I
" \4 j3 [9 b* A( _static struct gpio_led da850_evm_tl_leds[] = {
+ }" P: d; R, J5 y& V" B {
: X3 d6 e% T+ t7 y .active_low = 0,1 _, _& j& y# m
.gpio = DA850_USER_LED0,
4 ]0 }! x4 Y- S: z, z .name = "user_led0",
0 u( Z* @, J0 a1 X: q, ?! S. `% L6 I .default_trigger = "default-on",& o4 O3 ], {5 n! {
},
8 N/ U* i" Z8 M8 ~; A9 N {
( u5 x! |7 U9 K .active_low = 0,3 d& b" y* L: Y
.gpio = DA850_USER_LED1, C& s% k9 U) c/ \. t
.name = "user_led1",- j# L; ]; _0 ^8 k, w" g: t
.default_trigger = "default-on",
. @/ d) K/ d6 a6 s% g) t },) w. e4 s9 N- g4 v) W( g8 z$ |
{
+ c& A- m! v0 W; z .active_low = 0,( [: G' x8 ~" o9 m' K. p8 i
.gpio = DA850_USER_LED2,
3 e7 c0 ~. f% b .name = "user_led2",
! j. m' h2 M! w1 N8 d .default_trigger = "default-on",! |% [% m# i% h! _/ h; h# t. O
},$ W! G! l# v! H
{- Y9 V1 h. z$ i2 C0 M' ^ s
.active_low = 0,
+ x4 O4 K9 @! b5 O& O- |$ W .gpio = DA850_USER_LED3,
% x5 M h: r2 w3 w8 C- ] .name = "user_led3",
5 f: H+ Y& s; B+ t) I .default_trigger = "default-on",
, p& Z$ g5 t; U },
: H6 |: }' E* d) \0 A};# o- f, E9 V7 G: p
. Z# Z2 m# |, J3 L ?' p8 Ystatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {2 J8 k1 W$ f( R9 {# i* e
.leds = da850_evm_tl_leds,9 a# X l E% a0 K. N
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),; A7 I( H8 I9 \0 |
};" Q, g. r/ X4 t. a$ u
/ o; Y: Y0 Y2 Z3 a4 f! W( V, ustatic void led_dev_release(struct device *dev)" T5 }3 l( Z2 z: L4 f2 c% ^
{
. ^! g6 ~. H4 G5 U* s4 z+ d* P- h5 c};; Y) p' t4 h- |: l! ?, a
6 u( y( H- e B4 @* P4 p+ a g# K; g
static struct platform_device da850_evm_tl_leds_device = {/ Y# T# b' C+ ^- D
.name = "leds-gpio",
: g7 d. t1 C3 z .id = 1,
1 D' Q+ d, x4 _- l( X, c: d8 ^- i .dev = {
+ `' }( k |! G3 U4 ` .platform_data = &da850_evm_tl_leds_pdata, M8 v& `( ?% @ J- s( G" h
.release = led_dev_release,
# ]2 n4 }$ k& L @# t* Z* d2 S" @" W }
; c7 z& o: D% ?3 _* ?0 w- r};
- {# p2 y5 J. F& Y, K7 F9 R5 [
. M5 u5 p, N- I! Dstatic int __init led_platform_init(void)
. k6 h- {# l5 q- x! }{ C7 M% X1 [- R t+ Z. Y y& q+ j
int ret;
; o2 A- R8 y e% T0 ^% |, t#if 0
% j! V6 I( a* m d ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);- n9 U" ]5 h, _8 z2 b8 b
if (ret)
+ Q$ u$ k1 K. p8 h% h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
; ^2 Z- n# f$ G; \7 t "%d\n", ret);) \' F0 M t% [% U% b1 O
#endif% q8 o/ r! B; J! [7 {3 d, s9 j/ Z1 u: N
ret = platform_device_register(&da850_evm_tl_leds_device);0 q7 H- a0 @6 v7 U6 v4 ?0 ?& \3 X
if (ret)
& u# y. v: n( T* k pr_warning("Could not register som GPIO expander LEDS");* o7 u. P* Y2 F
else
# i" u7 ^8 P7 Y, | printk(KERN_INFO "LED register sucessful!\n");% h7 m( s& [+ K( @# n1 b) B- n
# @' Z* j$ E4 K1 W; X$ i. f$ F- @ return ret;6 X3 o* q5 T4 E- y* G
}
" O5 G3 O/ Y: M" Y$ {5 e7 _2 o% L: E( i! ^1 c8 d. i
static void __exit led_platform_exit(void)2 j, {' X: k0 Q" V
{! K" j; y N& I) U$ {: E7 j
platform_device_unregister(&da850_evm_tl_leds_device);+ r$ \$ @8 ?6 s* S5 r
. y' x+ [& F/ j; G5 Q) v
printk(KERN_INFO "LED unregister!\n");: u7 F5 M5 @7 X5 G
}
( e2 O' V @- h1 u, P; \ M/ Z* c. j( \+ A/ W) E4 m; ^. f
module_init(led_platform_init);- x# {- E* ~) A6 U% \
module_exit(led_platform_exit);
L& K4 C* T6 F: U7 _+ x& o
( Y/ U$ e7 h' pMODULE_DESCRIPTION("Led platform driver");4 @* t1 l9 `$ e2 r
MODULE_AUTHOR("Tronlong");: ~( G, C1 l+ D6 o) W% X) J% X" S
MODULE_LICENSE("GPL");' D* ?, b$ r/ z1 J# A5 H
' G0 l5 [( \9 R2 F3 E' Y |
|