|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
% r1 o/ b5 k1 A2 a0 k1 l#include <linux/init.h>
8 D. r, E( z( M- J#include <linux/module.h>
a- \2 B8 b' G; k7 s' ?1 J#include <linux/kernel.h>
8 `! e7 ^: E9 M4 ~5 j/ H" M1 L#include <linux/types.h>" ~% \0 A! `% I
#include <linux/gpio.h>$ M7 [( x9 l2 R7 F6 R+ p
#include <linux/leds.h>
1 p/ v0 ?8 h) t% z; p9 E#include <linux/platform_device.h>5 @* l/ N Y) g2 K) d+ @) [4 v4 ?
/ r F8 k% v( o: N3 D#include <asm/mach-types.h>" w! c) C( c7 S% q3 k1 I1 O3 |
#include <asm/mach/arch.h>$ S6 ~* H; k1 V9 W; s6 u: H- f/ q
#include <mach/da8xx.h>' k; U' N* E `3 D3 [* J9 h$ e
#include <mach/mux.h>9 m; K f% l3 z# Y
& I4 D! I! _- ~" ^$ S( p#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 ?; \$ }' s/ J- ?2 w
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
( G( F% L& Q6 k' a1 t3 Z: B: u#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)$ Q, E: A; O j* g) @4 e: t
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2) f* F" S; `! {. X4 l- K
1 S* r8 x* t& q" ]! J1 C- M/ N: ]
/* assign the tl som board LED-GPIOs*/
, ~% Z' C- s9 g# x# sstatic const short da850_evm_tl_user_led_pins[] = {
9 u' P! F' ^$ P; X I /* These pins are definition at <mach/mux.h> file */
7 N2 w- O" n* E3 j/ w. T$ M DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ e6 q) G' O" w3 c
-1
- i! E% P" @2 [! J- g};
" X5 y- i% x [
: W( W/ u6 C2 Q6 w% {static struct gpio_led da850_evm_tl_leds[] = {2 |" a: G4 m% D, C
{
# j/ J( I: Z3 _8 f% p1 i3 ?: S* V .active_low = 0,+ |+ K9 C& b( r- ]7 X1 e
.gpio = DA850_USER_LED0,
; K; V- @. W" I5 y .name = "user_led0",; o( O; w( d) x( Z* y. q1 m
.default_trigger = "default-on",& G4 |% z& C# z; H, a! } O" y" |# q
},8 L) _+ D: m$ s% a. I6 A- e
{
' k& B7 a* _9 ~6 r .active_low = 0,0 H8 k4 r/ f7 J/ G H0 m% C' p# F
.gpio = DA850_USER_LED1,) j* X: x K3 x& C b% N5 Z0 X/ ~
.name = "user_led1",
. z: S% L9 `$ Z' _, D8 A5 T/ M3 x .default_trigger = "default-on",3 K% `* m. Y# G! d
},
+ {- c0 z& G) W4 Z {
% I* l* p# E: e/ j2 v .active_low = 0,
1 O# Z0 ?! p4 R7 [9 C: W6 G3 ] .gpio = DA850_USER_LED2,
p) B$ w& |' |& M* M2 h .name = "user_led2",3 b3 V% I* q+ E
.default_trigger = "default-on"," p& A" m/ T% [# p! k
},
% Z& e* z" ~" U% V5 o" Z; P {
2 y4 ^* Y+ b; e2 M+ M H2 f. J( t: L .active_low = 0,% Z5 P4 w. V6 `- ^
.gpio = DA850_USER_LED3,
% V$ T. P& {: C, Q+ ]2 t8 m) ] .name = "user_led3",9 b. r/ _, W9 X4 ^, I. L9 S* l
.default_trigger = "default-on",
j& Y% k, e( k" {2 V% W7 I' ?0 v+ h },7 S& h1 ?1 ?2 p* U4 i
};/ U. i, `- J. }) O
( ]- e) p& w3 R8 t3 E; M2 t% c" ^
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% |2 N7 x$ O' m4 J; j$ d5 e% K7 L .leds = da850_evm_tl_leds,
' A; o) v2 Z! q. m3 C. s* o .num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 v2 b1 r, a* c; h- S
};8 w# S6 U# @6 L4 B6 ]
- h* b" s! e0 J- s. vstatic void led_dev_release(struct device *dev); ^$ \1 o% m* u* z S3 B; P
{
) c3 u$ V) n& ~$ R8 }! F};
3 c+ [; S" x2 h. Y6 E' \" f
; s0 Y- @; z1 \static struct platform_device da850_evm_tl_leds_device = {( s) s6 j4 L2 Q. @3 H# }
.name = "leds-gpio",8 g! a& E; w- o% ]# K) c
.id = 1,
) E3 \4 B4 R% r9 \. e4 `( S7 A .dev = {& x# D, v* j$ F# i* q: F b
.platform_data = &da850_evm_tl_leds_pdata,
( ^. h) Y" s8 B l .release = led_dev_release,
. M+ G7 G7 d1 _, g2 F7 | }* ? b+ D7 |: }2 }# F- j
};
6 f3 M* d' F z( @" c$ h* [9 w0 Q0 l& C
static int __init led_platform_init(void)! i* ^9 `6 q# x& ]+ ?- L$ S1 e
{# G9 U" W- J" ]/ o
int ret;
8 W2 R# v" c) g* M" {8 v#if 0
$ T+ e. p) G4 ?, K5 |0 t ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
; V9 t) S, k1 U$ a4 F& ? if (ret)
5 q2 n4 b0 I$ ]2 u pr_warning("da850_evm_tl_leds_init : User LED mux failed :"6 K& R. q4 L/ V- \) m7 |
"%d\n", ret);& k/ Q: n* @! q& [% G: _( @& f I, b/ j
#endif: E# l7 u( {, g2 w/ o6 P
ret = platform_device_register(&da850_evm_tl_leds_device);- t' j% z/ l0 z3 z; K. B
if (ret)7 {* P& e. @5 B) u2 N
pr_warning("Could not register som GPIO expander LEDS");
. l# p0 t7 q& w4 k else$ u7 Y' x+ B( h- Y1 e8 ?. ~- K
printk(KERN_INFO "LED register sucessful!\n");" o5 z0 k2 e \/ _
+ G! ?+ U+ Z Q
return ret;
+ g$ b' s) c5 y: A% Y0 V}
( A* R" M9 C& i
0 Y6 `8 g, M1 E* d! jstatic void __exit led_platform_exit(void), t" `0 L$ C) w" W9 F I5 E: P, p
{
/ w5 d" `3 q- O% E platform_device_unregister(&da850_evm_tl_leds_device);
9 M, Z" z$ a2 C4 p- U! g/ G8 b: E& R& x: N
printk(KERN_INFO "LED unregister!\n");. v) r: A. G' Q. t+ y G
}
% Z! @/ B* ~2 B: O8 p# k* s6 C8 j& i, x) w4 v6 {, ~
module_init(led_platform_init);" l9 Y- F$ d7 m
module_exit(led_platform_exit);& T$ H$ j- }: Y
6 E3 f+ ~+ u( a+ r% [ ?* y
MODULE_DESCRIPTION("Led platform driver");
9 ]% k: ^7 C2 ]& i+ t/ cMODULE_AUTHOR("Tronlong");
8 W0 L% `5 C. L; A7 XMODULE_LICENSE("GPL");9 Y+ K$ u) j+ ^4 t, m7 Z4 r
) e. v2 [# j7 V7 M5 g" L% ]
|
|