|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) k/ M& y- D; h#include <linux/init.h>4 A/ t8 R9 t; z% ?' d8 J# k- K( E( _
#include <linux/module.h>5 B5 G5 @2 ^6 v. K# X
#include <linux/kernel.h>
/ @2 x* [* H$ j; s#include <linux/types.h>- C1 m6 `4 K$ ]9 W
#include <linux/gpio.h>+ v- E t6 T+ X: i+ Z: m W9 I$ J2 q
#include <linux/leds.h>( w5 V* Y6 H& A6 B- e' E* R% Y
#include <linux/platform_device.h>
/ A: P2 G9 `1 D( w4 S+ y, Y
* R0 Z8 y: [+ B6 f: x% j. { l#include <asm/mach-types.h>3 f% `1 m5 R# v7 z* C
#include <asm/mach/arch.h>5 h! s' t. M& z; ^+ C* x
#include <mach/da8xx.h>
; e5 l) L, c! B* B#include <mach/mux.h>! Z* o5 u0 N. u( C
1 ?, {( [# M+ v
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)$ e1 @( @. O' O) o+ a
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 q6 x5 Y0 [+ y4 u5 }
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1) A- x# A2 Z5 K5 e8 M' Z, ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
( z; s( N' j+ v6 U4 A+ b) e
5 l; g. T2 t3 g8 ]8 f1 Z2 h9 }/ j/* assign the tl som board LED-GPIOs*/1 _3 v& D2 p+ L3 {. p! c
static const short da850_evm_tl_user_led_pins[] = {1 T3 d# |" H. J8 t, G6 k% T! ^
/* These pins are definition at <mach/mux.h> file */0 j$ l, l+ a, K1 ^4 a
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
$ v6 J5 a" q/ `3 o7 G -1+ C# Q6 N9 K, \) o2 P7 `
};
# l6 P/ x* B0 D) a
8 G% s& I# L4 Q7 s, Tstatic struct gpio_led da850_evm_tl_leds[] = {/ Z2 Y$ [# B: D: o: ]" }
{
U, }5 d7 l/ H* k& W2 @ .active_low = 0,
% T0 Z* ^+ O" M* {* v$ x+ u) @ .gpio = DA850_USER_LED0,5 g8 b4 {: M7 X" k1 \
.name = "user_led0",
/ L$ U! ~4 f( q/ Z. ~. R8 B7 C .default_trigger = "default-on",# W" B$ j* U1 t
},! ?0 }/ @* D, x- P- B2 P( _
{0 j5 s1 Z0 |- p0 v4 W+ b1 A
.active_low = 0,
9 M! {! o. s9 s .gpio = DA850_USER_LED1,
: K& H9 e x d% X: V% ?0 v .name = "user_led1",
$ B6 a3 M8 d1 }% E! L .default_trigger = "default-on",+ U4 d+ s) z9 z. `
},( @6 v* K* f1 l! h6 L( X
{
3 ^: L8 E: j& e; X& X .active_low = 0,
: Z2 P7 O8 l7 U& r g+ a% [) ^$ f .gpio = DA850_USER_LED2,# w& s2 I) O# ^
.name = "user_led2", o4 ^' } I$ y9 v0 A4 {
.default_trigger = "default-on",
' ]3 x3 i4 ]! j },9 q1 I4 l, O: t" c$ q
{
& o E0 G2 r: I5 m( Q8 p0 i5 M .active_low = 0,
4 c, u& h4 P0 [, x5 ^ .gpio = DA850_USER_LED3,
?- V" b! g& y/ J, ~8 R3 t .name = "user_led3",
1 ~) }1 y$ {5 S2 T# v+ ? .default_trigger = "default-on",1 X$ {7 \( \8 d; l8 d1 ]4 N
},6 @6 T) [* v8 t( m q- g- Q0 W3 K
};
4 }0 d4 S% R! U( I& N: G1 g+ o
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 v k) H3 {" O0 @ .leds = da850_evm_tl_leds,
: o3 i2 `$ y; @ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
2 O v/ |1 L3 v- e};
2 E) F9 [9 Y( d
: y* z( K. I/ y/ gstatic void led_dev_release(struct device *dev)4 J* Z7 p1 I2 g" k, Q+ ]8 M
{0 o7 Q" _. W4 B$ C
};3 a/ J# [6 }% X* V' i
( |; j7 p9 C2 M. q9 h* sstatic struct platform_device da850_evm_tl_leds_device = {
* j$ l$ H( r7 Z# Y% t9 b$ r' p .name = "leds-gpio",
; _$ y$ `" a. A3 E7 z3 Q .id = 1,
. B+ F" y9 N8 |4 h1 s( ~ .dev = {: I3 g% Y+ I6 M. H8 G" a/ e& {
.platform_data = &da850_evm_tl_leds_pdata,% E! e4 Z8 y0 x7 I1 E! z; l
.release = led_dev_release,) A5 O8 O. k9 L% q: K
}9 F$ p# [% o$ w6 H
};; V r# ?4 c1 J9 |4 B$ I( I0 j4 x" W1 [
* K& b/ \, ^! x ?7 N* Mstatic int __init led_platform_init(void)
/ k `$ i1 Q# I{
1 g, M" a9 e7 I4 I2 T int ret;
' g, Q. [) x4 J( `; F! b4 L. G#if 0, S2 N7 o0 k6 z+ _( X& G) Q6 ^
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& z: g+ _0 x: J if (ret)
: V* K. V+ n7 M8 h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
7 K& `2 Z; N' `* I } "%d\n", ret);3 E% a7 _" e5 N' ?1 W4 X7 M
#endif4 }3 J! u9 k- D% F2 u$ Y. I
ret = platform_device_register(&da850_evm_tl_leds_device);+ i# T+ V, a+ z5 Z3 z L9 C0 r
if (ret)2 v9 B0 r3 e; T
pr_warning("Could not register som GPIO expander LEDS");
& h- Z/ P) U6 s else, z: R& Y! J7 @4 ~
printk(KERN_INFO "LED register sucessful!\n");
( G8 m0 d) E! }/ F
1 @4 J' y7 W, O7 z return ret;+ w$ w0 [1 y. v/ F( u4 w9 \9 S
}" ^6 E t2 @# R) d
! T+ v0 ~ }. b' {4 hstatic void __exit led_platform_exit(void)
1 r! I8 U8 u( {% e# n J{( M' b" K' h) h; O9 P, q
platform_device_unregister(&da850_evm_tl_leds_device);
1 x- L4 ~4 c8 k( C K- _) K8 U4 E
printk(KERN_INFO "LED unregister!\n");
7 X0 n" E5 I, x7 P6 S" n4 w4 t& _: `}* g& a0 K$ h7 W; _1 Q8 c
7 c v& Y1 V+ ?4 M$ k8 F# N. M
module_init(led_platform_init);+ W1 l+ c$ a# ]8 Q9 u& d5 a. `" F2 V
module_exit(led_platform_exit);: r0 {' u$ |( P0 P# z/ X' t
O& H" G1 a3 B+ S. j
MODULE_DESCRIPTION("Led platform driver"); e5 ^% `# d9 p
MODULE_AUTHOR("Tronlong");
6 U# }, D* K2 J3 CMODULE_LICENSE("GPL");: u& C" y6 m) p( b( M
1 x# U7 Y% e! K9 o/ A y, V1 G O: [
|
|