|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
- f% C. s/ M+ j5 g* Y/ [#include <linux/init.h>9 Y' \5 E( Z9 n3 X
#include <linux/module.h>
, O7 V/ l, _, ~- q#include <linux/kernel.h>! ^- X" q! D t0 B# A" w/ Y
#include <linux/types.h>" Y- _$ k1 u) P4 g- J& ]: d$ ~0 t! X1 V
#include <linux/gpio.h>- B. l% I/ d; Q' i1 O
#include <linux/leds.h>. M6 [2 i) @5 D" `' }( I
#include <linux/platform_device.h>+ ]: Q! i! g4 b) c
( [, H, o, J4 @+ M9 l1 p3 R% y' b4 b
#include <asm/mach-types.h>& z2 T/ G* W+ P
#include <asm/mach/arch.h>
3 h2 B- F: h9 K8 }6 B, P#include <mach/da8xx.h>3 {% z7 p, ]$ }) [; L
#include <mach/mux.h>
4 B5 a" S/ c$ A" b5 c- N3 z6 v- E8 f& ?$ N4 I; X" L
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
7 B3 M0 k$ _% W+ v3 W% Q#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)# m7 g( y1 y+ R8 ]3 R. b+ w
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)" P9 k) @& |: {
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
9 H* V+ b0 j* V5 P& h
. {: i) X% F( m( D/* assign the tl som board LED-GPIOs*/
* z, q. u6 c; I2 Tstatic const short da850_evm_tl_user_led_pins[] = {0 R8 ~' ]0 Q- A4 w7 h% F
/* These pins are definition at <mach/mux.h> file */
( C4 ~ F! J) Q DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,2 U" v. b; r7 x0 w; w
-1
, X T% J4 G. q: j, U8 T};
! ?3 c5 m+ u4 X: r }9 l w V3 w
+ }8 D3 }% E$ g" e8 O6 O1 `$ ?static struct gpio_led da850_evm_tl_leds[] = {
6 |2 w+ i8 ?, j/ F6 I" e4 i {
* d+ [; _% b$ J/ Q W, O% ]% U+ L .active_low = 0,
g5 q$ \& _ o .gpio = DA850_USER_LED0,
8 ~! H% X) g8 z0 _+ b .name = "user_led0",4 \4 X0 |* v0 s
.default_trigger = "default-on",
* y A ?* K3 Q },, `, B( ^) \" O
{; w2 r7 n' ?; O
.active_low = 0,6 j- ^ D# F3 K# C
.gpio = DA850_USER_LED1,2 U3 h q% x* v# n, I
.name = "user_led1",
f0 z7 O1 |& \ .default_trigger = "default-on",
) A8 t; k. F+ t0 e4 t& T' h0 U& ?: } },
3 ?5 W5 k$ O, J/ X- i, `; ]8 H {4 N+ ~2 V4 |# H }7 ]4 i
.active_low = 0,/ g8 Y% f: j; E4 v( z
.gpio = DA850_USER_LED2,
+ N' ]- l- H L* w7 A% l& C1 n% x, o .name = "user_led2",
& b% W' e& q: X6 J; y2 k .default_trigger = "default-on",5 h& h/ H, a6 [3 }7 K
},. v" K2 m/ }: B0 W. l: E
{5 r# P- l0 d: f9 z4 y6 J; Q T
.active_low = 0,
{& Q% D7 h% n; c& T .gpio = DA850_USER_LED3,
+ q' R* c# N- \0 \6 H .name = "user_led3",
$ _ }6 i3 r/ d' w, }( l6 X .default_trigger = "default-on",& o+ k% G2 ?6 }. N/ I L% T" H8 b
},0 I; K* H8 o1 d# a: _2 @) \
};
% s* n; W3 `( |- O3 l7 W, f4 j; s7 q) }. |5 m
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ e' F& Y! o$ F* k+ U; a# G& M
.leds = da850_evm_tl_leds,
5 ]" ^- ^' u! o1 U0 U& y! q& r .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' A# G7 y: M' \/ k' @- c};# D$ i5 b- B7 u% V
/ Y8 L& P8 l" J6 o6 F
static void led_dev_release(struct device *dev)* @- Y, ~* {/ U. H
{
3 _+ z9 l: z8 ?/ w+ @/ d};
) B+ L% N4 @) l) A: @, G5 v3 ^$ ?) |7 N& H
static struct platform_device da850_evm_tl_leds_device = {
: p' C8 o0 p: v) J% s$ A" v; ` t .name = "leds-gpio",
( H$ {6 _/ n3 P& `8 H$ z- o6 N .id = 1,, T+ S1 Y* D/ ^4 W4 H/ t+ {! P
.dev = {
/ y. [8 x3 b! q7 g% C3 f9 I8 | .platform_data = &da850_evm_tl_leds_pdata,) U% O3 U6 L3 d+ ` z% ~
.release = led_dev_release,
6 G2 k4 j- f; ^) J8 J5 @ }
+ @: m' ^: [3 e/ M};
7 u# ]# u. ?+ b2 i) z5 P* u
% t# @8 o" e1 U9 m F0 q" B+ O& i' Tstatic int __init led_platform_init(void): b7 Q. `$ c3 k; @5 M( h$ Q3 x, O/ C: J
{7 H, q* _$ v) F4 A' t: u' c
int ret;4 \+ i2 o8 R) I
#if 0( I( g) Q) Q& Y, J! X1 ?! t8 i
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);5 C, \% n. E2 a& C1 U3 k: ?
if (ret)7 x Y2 ]/ R' j8 \
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"1 [, O' Z8 [: b* f
"%d\n", ret);
6 z! g9 v. y4 v5 a O#endif
% R2 r# ~* B9 @! W ret = platform_device_register(&da850_evm_tl_leds_device);
* m+ v$ q( ~% b/ M if (ret)( x% n. K! ~ J5 l. ]9 |
pr_warning("Could not register som GPIO expander LEDS");
9 o ?: O, c" |8 f& z5 ~, ^2 N$ ~ else
4 |7 \5 Y) ~7 Q printk(KERN_INFO "LED register sucessful!\n");
4 V5 n& s2 Q5 Y2 E1 M* z% a G! o4 }1 P0 P
: D, Q9 r% U' Q* L: E* o return ret;% r' T* ~/ n5 x5 Z3 n) J
}" K. E% ^) _: I; E h- B( C( S
: n6 ?0 s/ f$ a @( K4 H# v
static void __exit led_platform_exit(void)
1 Q- s+ `0 t" {" C9 k8 q' e9 v{ R5 f: Q- i1 [+ q
platform_device_unregister(&da850_evm_tl_leds_device);
- ]& e* g8 E0 u4 i- a
0 d4 E! l/ H. E8 U! l printk(KERN_INFO "LED unregister!\n");: _5 g8 J. U/ O( e* ]
}. Q [$ F6 `; ^" u7 Y
7 U* P) n% X3 X1 u! |+ b6 pmodule_init(led_platform_init);
0 q& m: |+ E3 ?- v/ k/ U( dmodule_exit(led_platform_exit);
, [% s0 B. G2 z$ D9 L3 `2 m4 v( u) s
MODULE_DESCRIPTION("Led platform driver");, L& N" M2 b9 s b
MODULE_AUTHOR("Tronlong");/ i) I. U% }; W7 o; J& `, \' ]* R; d
MODULE_LICENSE("GPL");/ e% M0 N% k" y1 o# r3 d4 j
0 l s. ^7 z* A8 u; ^# `. \ |
|