|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 d `/ h9 K$ l: Y6 {: t( G#include <linux/init.h>* R* _7 x8 n2 _
#include <linux/module.h>
9 C: I! G8 @8 Z3 T5 d$ p/ n! `#include <linux/kernel.h>; a5 N1 t- a# h7 `; _
#include <linux/types.h>
# @9 A5 b- K1 k/ G#include <linux/gpio.h>7 b. t2 y3 s! J% s" |% w
#include <linux/leds.h>
' @& B4 C# {9 Z! b1 z#include <linux/platform_device.h>
! Z! W6 L; L1 I1 X0 A
; j) B6 Y/ ?; }#include <asm/mach-types.h>: C, Z1 u/ F# \0 r6 s
#include <asm/mach/arch.h>
8 D6 i6 |" K' R# ?6 U/ l#include <mach/da8xx.h>
3 Y* u+ J& G- w#include <mach/mux.h>7 S) K( j/ p3 I- I+ |( E- ~$ W
" X1 t# R7 O7 w) Y4 S3 L( c8 \% I8 v
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 A0 S A- W( P' w9 ^, [0 C8 X
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
1 B/ a$ [) r1 a8 J# Z% _#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! {, b/ Y! h9 E! w7 C#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)0 o& J- u* ~$ l# o8 R$ N
: p& V3 Q7 H+ x2 ?) \7 {! _/* assign the tl som board LED-GPIOs*/
& y: \0 P4 a6 A3 K" f9 z$ c8 ]/ Z; @static const short da850_evm_tl_user_led_pins[] = {
' d4 d' r7 p* ^" |" Y/ B4 {5 v /* These pins are definition at <mach/mux.h> file */
7 N$ \$ [+ {/ ~, R DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,# p# C1 S/ h* g% j" _
-1
1 a; p- z6 ]- A; Z3 E+ m7 U- r( O1 B};
3 h2 u8 j$ D1 c4 o& r8 I% D8 P$ A- L" B% f7 ~* Y% o$ C0 W" y
static struct gpio_led da850_evm_tl_leds[] = {
- w5 ^, l/ s7 _4 k! Q { A9 w/ ~1 H1 }* f
.active_low = 0,
9 q7 N5 L4 W: Z$ ~ .gpio = DA850_USER_LED0,
! K( |- p$ ^ d8 O! o" C+ }2 R: L .name = "user_led0",
- |& I0 O. W) D3 t! i2 x .default_trigger = "default-on",4 i, I) B( \( z. r# G
},
+ Z1 ` G# o2 p' A- L0 p' M {
1 u* H" V7 R% I/ X L .active_low = 0,( d- @7 E: a. m) w7 c2 K
.gpio = DA850_USER_LED1,
+ j9 m8 ~6 C* l- ` .name = "user_led1",
7 t/ w- }$ I% H# F8 V& l .default_trigger = "default-on",- T) t `; k( [% u
},
% ~ H$ G+ O4 L5 ^0 L {
' a7 C+ D% o/ M .active_low = 0,7 B+ y' Q0 C0 n/ |! t. g
.gpio = DA850_USER_LED2,
0 W8 r: t, {) A8 R j9 } .name = "user_led2",4 \$ E1 }4 S: f& s
.default_trigger = "default-on",/ L$ d" @4 J& O
},
' ^0 l8 z# |: i, R4 t i {. P9 o0 J+ ^4 t& M1 H6 ]: z( @
.active_low = 0,
! Y( K, o }4 |0 v) L0 f9 M" w' U .gpio = DA850_USER_LED3,
0 ^ B3 ?7 Y/ R/ B+ b .name = "user_led3",
6 T2 a' A* \5 T; _. b .default_trigger = "default-on",: m- m( R6 ^: R
},; [. ^4 |4 K* ?- b( t
};% K' i9 q) P0 j2 Y
- A4 | y/ O+ X! k
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 l5 h* p* c f6 Q+ x2 H! W! {
.leds = da850_evm_tl_leds,
) ~+ p9 g" C) w) B6 P d .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
9 v" z2 B, Z" n# O! k4 c};$ {. f' o* v& W# u+ X( Q4 G/ b
, u# z" ?4 ~/ A
static void led_dev_release(struct device *dev)3 O% m( ] |/ C0 j3 ~# {
{
- o4 z/ a4 G7 a. ?};; ~: |5 ?! a8 C* ?( p7 n- ^( A
5 e# m3 z6 f8 |, `
static struct platform_device da850_evm_tl_leds_device = {
6 [$ S% r9 T" O2 \7 } .name = "leds-gpio",( B) \% O* k6 V
.id = 1,
5 N! v) s% A$ \# C2 Z# u6 X8 {7 S .dev = {% f, v q- K9 g6 @
.platform_data = &da850_evm_tl_leds_pdata,
) i* p- |" A/ X% A, H% { .release = led_dev_release,
# L; o$ i+ |0 J, S! O7 ` }
7 e; z0 @8 E: v8 I0 v};1 W! x+ `& E- \( g
/ a/ t) K, b- S0 w/ X
static int __init led_platform_init(void)
; [) {/ Y8 C7 y% d% G{' t; K+ _7 T( ^, a9 [
int ret;. O/ f5 M0 q) V9 w5 F
#if 0
' a1 P- y- ?& r! k ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);1 `+ @( d/ D2 \' f5 e" [
if (ret)
Y3 n% W* G: m( [9 P% k pr_warning("da850_evm_tl_leds_init : User LED mux failed :"! A8 y7 [ h/ j
"%d\n", ret);
l# b; b: @8 x0 C7 `#endif$ X# z6 u2 T& |. {( y
ret = platform_device_register(&da850_evm_tl_leds_device);; ^9 _& ]5 l3 g1 e- q9 U( _
if (ret)! U7 Y! [: {' V" G# Y
pr_warning("Could not register som GPIO expander LEDS");/ t3 B L/ C m$ q B: I2 D
else3 T: N5 }" W- c4 N$ |% J: u
printk(KERN_INFO "LED register sucessful!\n");
$ Z- h w+ c0 D3 Y3 m) s- s
, J0 p6 Q/ T+ w. P8 u% T return ret;
' P+ d) D5 T s" s* w) l}7 ^# Z9 x' d, ]
, h! L( r- s4 Rstatic void __exit led_platform_exit(void)0 x3 [1 s0 O$ Q
{, D! S+ I7 p$ Y, i& q
platform_device_unregister(&da850_evm_tl_leds_device);
. Q) B$ E9 Q$ v0 ?6 D9 ^3 w
2 r+ W) q. J) b3 L printk(KERN_INFO "LED unregister!\n");
/ Q' I, e) k0 b0 h" T0 p: O& b4 W}
2 t3 T9 Y/ r% D5 H; Y0 N
Y! K7 q# _) \% \% k7 s% Umodule_init(led_platform_init);
: [$ p+ D. F( o1 W$ \" t4 h3 y4 }* o* gmodule_exit(led_platform_exit);
+ |: P+ ^6 x: z# _( ]. K$ D+ A9 T: `" L% I- S+ u
MODULE_DESCRIPTION("Led platform driver");
) j1 {! f6 t& I% JMODULE_AUTHOR("Tronlong");* D# B) S5 D$ S, F% L5 K6 O. p
MODULE_LICENSE("GPL");
/ G( G7 `" |& X9 s
) y% D/ I9 o/ z |
|