|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 u2 [2 e3 s* S9 x+ ]; t9 f#include <linux/init.h>
/ _1 I) j1 S; J#include <linux/module.h>
" i7 p7 O6 {- J# L#include <linux/kernel.h>% o0 q1 [, W! ]4 q
#include <linux/types.h>
9 k; D& n1 @$ U" l9 {; D#include <linux/gpio.h>
7 O) _$ b a) P0 B#include <linux/leds.h>1 B+ s8 c5 X+ c# q" ^4 u
#include <linux/platform_device.h>& T( D! C4 {5 i
: n9 }1 H, w7 @. F5 X3 V#include <asm/mach-types.h>
7 S& |1 R3 B+ E; e7 o2 K* S. ?; N#include <asm/mach/arch.h>
c& P. C. }/ E#include <mach/da8xx.h>3 j) I4 D4 k7 [- T- ]# t
#include <mach/mux.h>' M% w1 g5 S- z
& r# \) U/ r( V/ w- p" x3 {3 o
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
1 S& l3 L2 b4 b* O: v/ |7 }$ G, {% ^ T#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
- j0 h! m- E2 B. z' z$ F9 G* b2 w7 ?#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
7 S" o7 P& s) d- t2 t k8 U1 b#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)% @$ K5 z3 g I2 ]( _7 @- w3 P) ]
* O- U) R1 k* C# _4 x
/* assign the tl som board LED-GPIOs*/
9 Y) J, U: v# n' e6 ustatic const short da850_evm_tl_user_led_pins[] = {/ Q0 n4 {* \5 _" R4 Y' x2 v
/* These pins are definition at <mach/mux.h> file */
( [2 Q0 z9 q& o# v& [$ D) n0 H$ u DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, q" ]: }$ p; i( v0 ^
-1) r- O9 ?; U, }* F6 }
};! H/ C: V8 X0 x' V' S, a
# U5 I+ N0 O5 t6 j" \
static struct gpio_led da850_evm_tl_leds[] = {- B) {4 g" I; h# W3 j" Q6 K
{- ~& y: a6 S, j3 c
.active_low = 0," I3 G; X) k6 F+ p0 }/ q
.gpio = DA850_USER_LED0,+ p+ N8 l4 y& X6 a; ?7 g, r3 S$ j' |
.name = "user_led0",/ U: @$ x0 e5 _+ n' m- j/ G
.default_trigger = "default-on",$ g( j: q) J0 ^6 g# `) c. E
},
" p+ M/ J$ u) K5 X$ k+ e2 ? {. V( K4 T% U# R6 r7 g5 ^
.active_low = 0,
0 h# o+ b$ g5 ]1 Z4 w% G. z .gpio = DA850_USER_LED1,
4 i/ P1 ~2 |9 M6 d" ? .name = "user_led1",3 @! k& ^4 w4 y8 x4 d
.default_trigger = "default-on",
( k' A, r, N/ h8 ] },) |$ V( m) N+ e, A
{
( J4 ?& b+ i" w! d .active_low = 0,
4 j J6 N8 F6 E% e1 u .gpio = DA850_USER_LED2,5 c& z* {0 J6 b6 i! ?- V/ V
.name = "user_led2",1 w* p4 ^2 x# m* L/ b0 a" u' h' f
.default_trigger = "default-on",
( t: A" w# J- } X c3 J( \ },1 d; m/ ^8 {) h! N+ ?
{
/ e) H: O1 q9 U9 h' m! @ .active_low = 0, W" n( ?& Q/ i
.gpio = DA850_USER_LED3,
0 {- s7 Z u* q! x4 G( @ .name = "user_led3",
! c$ L, l0 t# U .default_trigger = "default-on",& G/ c; `! p, z. _9 e; G. `: a
},/ B4 |4 V: Z U/ u: L
};
! G, X6 d4 O/ @$ U2 e
: o* l4 m/ F) W* ystatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: x; b- |6 }$ y7 @" S0 V6 B .leds = da850_evm_tl_leds,: C+ Q9 v; s P% E# T
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- W: Z- S( F! U" t};2 b, C/ s7 q% l8 n4 j: M `3 }
; X# T8 k' w" a9 J" [4 |$ t' p% ^
static void led_dev_release(struct device *dev)) v) k5 i/ s) v# i
{
# ?8 S- O9 x% \};6 u, y' g) R& b- q/ X0 }
9 B4 u' j3 t9 z% |) estatic struct platform_device da850_evm_tl_leds_device = {
0 p: v8 p! N6 h( ]# u; I2 v .name = "leds-gpio",# t: Z$ n) x6 C$ m. }3 L, c. o2 z
.id = 1,/ j" K" s/ v2 A4 @
.dev = {; a/ S4 k7 z* U" r3 k
.platform_data = &da850_evm_tl_leds_pdata,
P" L% J% J2 X .release = led_dev_release,
6 j8 r# \* y/ c! X }6 [- C h# v% M V4 E6 y6 w- ?+ b: O, r
};5 F; v" g" U0 \% v
9 r8 I e5 u% r* V& N, L) Y
static int __init led_platform_init(void)
6 B# R. B* a; P8 ?2 h{
0 Y) ]: t4 g$ z3 `9 \" N int ret;& R& \/ c- z# t& O( q4 T. |' A* `
#if 0
7 ~) \* ~; t+ W7 d+ Q9 n( O ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: J- n! i9 T9 \
if (ret)
8 s$ M; h9 z9 V# J7 v5 o7 i pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
) G" }9 ^ _* y; K; Z" ?- c Q "%d\n", ret);& \$ s0 V, C. w; j2 B' F
#endif, D+ i( S" v# k* ?! t1 Q- Z9 T
ret = platform_device_register(&da850_evm_tl_leds_device);
1 ?! P* |' a# |4 O0 t if (ret) i3 l% F; M8 E( m/ _6 t
pr_warning("Could not register som GPIO expander LEDS");
" O' O7 i2 K* l# m" U/ z/ F else$ {) n' B9 ^) L6 Q" }; C) t
printk(KERN_INFO "LED register sucessful!\n");4 z' _# A q z
/ Q: [8 I H M+ E3 H0 {2 h return ret;- A1 B8 u$ [8 Q1 h
}
8 ^# m7 z4 p9 T8 L
6 B5 e6 a; }8 n$ V( }9 s/ }9 Istatic void __exit led_platform_exit(void)- D; L6 @) \1 M" m/ L9 ~
{ L+ ]; s5 \! g% V: O$ y B
platform_device_unregister(&da850_evm_tl_leds_device);
8 Q, C( s, G! Z3 @! V
+ h8 M1 X8 v& D9 S! r printk(KERN_INFO "LED unregister!\n");8 ?7 |( M8 b; o7 A9 }" ]" S
}
5 Y& Z3 I6 n0 k2 @' G2 N# O. [. y9 G6 q( S# _: p
module_init(led_platform_init);
8 g' ~+ d- f8 P- u. E; Zmodule_exit(led_platform_exit);
! u2 n1 K! o7 H& B/ r
7 C+ }; b }. A9 T1 ~+ FMODULE_DESCRIPTION("Led platform driver");
. P( h+ l @8 A UMODULE_AUTHOR("Tronlong");
& p" }# l- ~/ }MODULE_LICENSE("GPL");
+ g& f L/ }: {4 ^- U6 [0 @/ }7 C P) r7 A% A& J
|
|