|
|
求大神给下面的程序做注解,请稍详细些,谢谢。: R& g: ~8 m+ ~- d
#include <linux/init.h>7 Y8 y9 r. ^- {3 \3 W
#include <linux/module.h>
a/ E2 k" N5 L#include <linux/kernel.h>3 P2 ^# d, y2 T5 l5 T/ F9 r! U
#include <linux/types.h>
/ n9 }7 T0 @3 C, {/ E, H1 v- m7 r#include <linux/gpio.h>
) M% q) Q9 C; h ?* _+ q% y# N0 ~* d4 i#include <linux/leds.h>: H/ C0 L2 L: I1 n7 U# q( }
#include <linux/platform_device.h>
% u& F5 _) F4 {7 G
3 g W w, j; l+ W( E; S- K#include <asm/mach-types.h>% ^" f+ B! e! F& s+ [2 i
#include <asm/mach/arch.h>
/ G3 X3 ^. k! u k( R+ L#include <mach/da8xx.h>
( \" R. [& a( B- d; ~; m#include <mach/mux.h> v3 w4 U& N' ?8 G- l; P
5 `+ r S' z$ D/ o9 v#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ f- q3 \% N. V- v% o2 c- _: |* }#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 f1 ?8 t1 U% U; D2 a#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 C) t+ k: c% z; O% X
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)+ q# F3 _+ f* d1 O" k# f
1 P* Z% m3 J# o+ |: a \/* assign the tl som board LED-GPIOs*/3 ?! {; k7 @) ?: x
static const short da850_evm_tl_user_led_pins[] = {
7 k' `/ J) r( C6 V. f, A2 y3 }, g4 d. K /* These pins are definition at <mach/mux.h> file */& w0 D6 Y3 O9 V) q# `+ Y9 e$ u
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
# Q: T( b( @8 ^/ B -1- h' @8 Q! Q0 L4 `
};1 f6 ^6 h* a* w5 Z3 I
- a; c' q& t/ b
static struct gpio_led da850_evm_tl_leds[] = {9 S2 i( i' j/ V# |4 g
{
9 I) N' a8 u$ K/ ?2 s5 v6 k1 [ .active_low = 0,
! u" | u @8 Q$ [9 U7 Z .gpio = DA850_USER_LED0,
R3 w ^3 s, a .name = "user_led0",5 S' S2 Q; l1 ]5 U/ L
.default_trigger = "default-on",
3 |4 ?5 I) V2 W* H },# i1 r, J2 u& w# \
{
% z. n1 l2 I1 ~3 q) g; p8 V" K' o% y .active_low = 0,7 h6 C6 c2 E$ Y( t! w+ h
.gpio = DA850_USER_LED1,
! |6 T% K8 j9 j4 {# g* ~5 A2 X" X1 e .name = "user_led1",
8 k7 E- x$ B: k9 `+ X1 l7 z .default_trigger = "default-on",$ r" b2 c( D# G- k) @* ~& s R
},- ^; s6 z/ _8 P( S
{
6 B% A% T* \9 m1 A7 @/ j/ o* ?5 s0 M .active_low = 0,
* |4 g9 s+ W/ n0 Q# \3 B3 ] .gpio = DA850_USER_LED2,9 D* f. M2 I9 C( U
.name = "user_led2",
% z f9 _3 Y1 C; G n1 Z+ d .default_trigger = "default-on",8 |7 r. U) v2 M+ `- h6 ?! ^
},
6 J; H# o# [' h9 M1 @* W2 X2 { {
; y# J3 r! J1 Z. z7 Q3 t0 b6 f y .active_low = 0,
* p) K/ I% V0 X: z% w' w .gpio = DA850_USER_LED3," g" s3 O, O& D7 _! F
.name = "user_led3",
+ H! H# Y0 \/ d2 Q6 u .default_trigger = "default-on",. @( ^9 P- L0 u! H! |+ N- e
},; f9 b3 X8 B1 F4 B/ q
};% g6 d; Q T+ X; y+ P7 w J+ O& `
! o& a' i4 }0 p1 e9 [+ B9 \" m
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {8 j( g3 h5 G# {) w: L
.leds = da850_evm_tl_leds,
1 R, ?" h% c, Y* s6 M .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
) S4 m$ q8 z7 M0 G; A: Y};) F4 C* j5 z! z1 O9 I! I. B3 e
& Q! c$ ], @8 d6 }" l/ Sstatic void led_dev_release(struct device *dev)
& Q: o% W( X& g{
4 P) h* r7 ~; v" k. Q, ?, b};, `, y+ O+ T3 [6 W* b Q
6 C+ s$ Q: b! Y" U- @static struct platform_device da850_evm_tl_leds_device = {
8 _7 K# j+ H8 v3 r# @ .name = "leds-gpio",
5 X+ M: v; `$ W. V .id = 1,% [4 q1 x P) D0 H5 c
.dev = {
& Y7 z9 F7 q1 e" [ .platform_data = &da850_evm_tl_leds_pdata,! f$ J5 h0 z6 u6 \* S
.release = led_dev_release,
: [9 J3 g' `, @# E }
- C0 [! J, D' i* ]};
: Y) G6 S! o5 z9 s
; ]' U B) V( hstatic int __init led_platform_init(void)
/ [: w/ M, o s8 x2 m. E. G{8 p, ^% O b& _ p' f
int ret;
- d0 g, ~4 ]% J. k1 Q3 e#if 0
# n# C* ]% @) t6 w& e9 @; E; K ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 p+ Q2 ^& b/ f: M# Q
if (ret)
; x" z- T2 @: {: P; T" }- s pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
3 Y& c# z9 B4 p5 k "%d\n", ret);9 y- X+ u8 x3 Y, R' J
#endif* i" p* Z2 |, ], H7 P- e
ret = platform_device_register(&da850_evm_tl_leds_device);
+ l& C6 w+ B# N1 s7 g: w1 { if (ret)
% v1 B4 f, z {. a pr_warning("Could not register som GPIO expander LEDS");
7 \7 Q1 l) n9 I7 q else. [ a, @+ x2 H3 X$ t0 t; u
printk(KERN_INFO "LED register sucessful!\n");
0 ~9 e( B! `, C' c3 c+ [: R7 q. k, Z) M: i/ c5 G0 K
return ret;% j5 @( k* A% Q1 j' x0 c
}0 f( V7 a5 D X- ]' H- w
+ a: b1 F# n, z/ G! lstatic void __exit led_platform_exit(void)
, @0 @5 A9 z( p/ b) l" p$ t% J{
9 f2 w- U4 U5 ~% y platform_device_unregister(&da850_evm_tl_leds_device);
0 ]# v# t/ x) h# |/ _2 F' d
9 f% O: d( Z6 J% x+ @ printk(KERN_INFO "LED unregister!\n");2 z+ w) y9 J9 g5 H2 k
}# ]; c4 g" [: e; X
* |$ z1 p" V( s; k a
module_init(led_platform_init);
/ o6 W4 H0 s+ S4 k& Dmodule_exit(led_platform_exit);
0 X8 a( [+ ~0 T$ q1 W! u. x8 k9 U) z3 [
MODULE_DESCRIPTION("Led platform driver"); C. L% _/ H& o; O$ ~7 T
MODULE_AUTHOR("Tronlong");
2 y8 K; a( w+ a0 L+ z9 Z8 X1 BMODULE_LICENSE("GPL");
& L6 W( l4 u7 K( ]; q& r' `' u, X! i* t
|
|