|
求大神给下面的程序做注解,请稍详细些,谢谢。. z2 e" x' n0 u! N9 W
#include <linux/init.h>4 m# Q, v% s$ d$ I ?5 ]1 y# ]/ C7 c
#include <linux/module.h>
) {+ `, X; S5 K, k2 }) A8 x#include <linux/kernel.h>
. U& p8 _/ \7 _3 s# H8 F/ ]4 T#include <linux/types.h>5 |5 k R( f( @
#include <linux/gpio.h>! B! n5 Z' E; W+ U
#include <linux/leds.h>" i% c/ M( T& z+ |0 C1 Y/ h% H
#include <linux/platform_device.h>3 b+ N5 u7 l# p/ |1 C' U* j
6 c& K1 l# N0 o' R% [- q
#include <asm/mach-types.h>
8 l1 S: ^( G4 R% o#include <asm/mach/arch.h>
0 S8 V8 ?% I; l#include <mach/da8xx.h>
% ?* T: A! n& v2 m1 S( i- v#include <mach/mux.h>
- b: B3 A. z ~: I7 M! W2 u5 u4 n
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 Z R$ p3 d( V, T#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 x: e% T2 }0 z, c9 P& X5 t# }
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 e! d0 U) h. H( j2 ?5 f4 I4 K
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)0 f7 q8 C. m/ p# d* D
6 I; H$ g1 ?6 `) w% Z
/* assign the tl som board LED-GPIOs*/
7 r5 W% e% D5 c3 Fstatic const short da850_evm_tl_user_led_pins[] = {
/ ~% i& u5 z5 P5 u6 z) D /* These pins are definition at <mach/mux.h> file */
1 f$ a" o- K" D K( M% f DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
' T2 G% s+ g/ G) x# L0 t) c! m -1; i7 L& i) d9 k& s7 N' a1 u; x% W
};
' {1 c, ?+ F7 n; ~2 L
$ n b3 u! B9 r+ j, f& Estatic struct gpio_led da850_evm_tl_leds[] = {: ?- ?3 m1 q1 w& b1 J
{
1 G _$ Q0 y! U1 @ .active_low = 0,' P7 Q9 h, ^" d
.gpio = DA850_USER_LED0,# @4 U. Q1 u1 n, q/ K# ]9 s# f
.name = "user_led0",
$ B4 _' h5 E7 i9 J' ] .default_trigger = "default-on",% R! d+ m9 E* m$ ~5 V% {
},% S% i9 W! h9 a
{ { [9 |9 H x m4 q5 H- o
.active_low = 0,
9 p. _- ^% L6 Q9 F4 j( C9 D .gpio = DA850_USER_LED1,, a, m* j# P" k: W) Q; S5 G
.name = "user_led1",
9 T4 \1 @/ g* V. X4 p( X. C .default_trigger = "default-on",7 U4 z0 V2 v: ~0 x( i. `
},3 ^( p N0 _# H: x, k
{. l( [/ X0 z4 D' B
.active_low = 0,! m2 j) f# y! u
.gpio = DA850_USER_LED2,
0 B# r4 d1 j* H6 r5 f; L .name = "user_led2",
0 O" w6 i ?% C }5 ~% @3 O .default_trigger = "default-on",1 C7 l. M0 o: u3 K" f2 c1 h: A
},' J# y7 K7 y! c, b+ R
{
2 o8 j; V- G8 J .active_low = 0,4 p+ Z9 d( S% q
.gpio = DA850_USER_LED3,
8 r3 w/ |* M: Q$ S .name = "user_led3",
0 C+ R* R0 R) R8 \( f/ `: e. @ .default_trigger = "default-on",5 [# A @* _5 p+ n, \
},
9 G) I7 V& ^* k' S n4 q+ [! f% o9 E8 u};
% P0 x: m( J/ \; ^) R6 K0 G# R, F3 J$ n5 I1 k% M" [/ m$ D
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
b( g. E6 I$ [2 e; F" O" ~2 t .leds = da850_evm_tl_leds,/ @2 g! f; ?! z0 n, d7 h
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),) N$ ?+ J% y( A B
};) l9 O. p( C+ ]
3 X) ~8 x% K! m C& Zstatic void led_dev_release(struct device *dev)
8 Y& j) o7 G# h# M z% {{9 Q9 \& k3 Q6 ~3 h2 @
};
; b# @) C1 O- B, x8 W( f8 y' k* d0 }! }; f+ y
static struct platform_device da850_evm_tl_leds_device = {/ e2 m' D5 t) e6 W/ l* y5 ?
.name = "leds-gpio",3 R7 \6 V* L* @
.id = 1,8 [% Z" a: b# n& C5 |6 v
.dev = {
* n! m' j O8 K .platform_data = &da850_evm_tl_leds_pdata,4 R" ^, }: k7 [1 _# i
.release = led_dev_release,& ]" |% L+ ], F9 t3 M+ \/ Q
}
3 V) ]. b$ Y9 p' a};8 O8 S i/ b6 Z
- M6 J& s8 C4 _" F# ~! s* B
static int __init led_platform_init(void)
) e- ^1 l- D# q( h. L{
1 V1 _' n' L/ T2 t4 ] int ret;
7 t1 ~; _8 K4 x* I#if 04 G! a5 E0 r: k
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
3 X V4 ?( D# z4 @4 G- P7 z if (ret)* j* X/ L. J6 D' z/ u2 s
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"* o: v; p" p2 ~$ p
"%d\n", ret);
, n) m; e6 y2 E' X#endif
u2 j2 V( Z/ K' Z ret = platform_device_register(&da850_evm_tl_leds_device);6 j( F* J) D: v3 B2 m3 [
if (ret)
7 s, ^% s; M" Z$ A u pr_warning("Could not register som GPIO expander LEDS");
# m3 [, O) m( O" |0 @- a else; @/ G8 e# n. P
printk(KERN_INFO "LED register sucessful!\n");4 z9 d& Z- s3 G$ p* O
3 `1 p- I: L. W3 ]" l return ret;
( [) b1 _% X0 Q# l}0 J& t# B% h& \" r9 v
G9 p) k8 J# m
static void __exit led_platform_exit(void); x; }' b$ A3 B0 y! j
{
% d4 l$ P. [& v/ Y7 Z platform_device_unregister(&da850_evm_tl_leds_device);7 g* c" n! P0 @% b% n. D
; ^9 Q/ l4 `& v8 S' @9 @* L: N
printk(KERN_INFO "LED unregister!\n");
# u8 r8 d/ N5 M9 U: }% H}
5 h) ?5 j2 K6 b
U7 [8 u& L; ^1 vmodule_init(led_platform_init);
, t4 b3 } l! jmodule_exit(led_platform_exit);
8 ]* A- W' j, O' A7 Y
: |8 X& `5 Z7 g k" ^9 `. \- P" Y4 kMODULE_DESCRIPTION("Led platform driver");
2 ^% X) B' b/ M* t$ \2 @MODULE_AUTHOR("Tronlong");
1 ?9 V( |7 G0 E% u1 F' dMODULE_LICENSE("GPL");
5 \. i4 {5 K6 d" ?; v' U
; n( w" h* k: q9 @- c2 f |
|