|
|
求大神给下面的程序做注解,请稍详细些,谢谢。 ~6 f, J. O" H6 `7 Z
#include <linux/init.h>
0 \# i+ P6 Y$ ^5 A# `#include <linux/module.h>" ?% \( l$ b9 o7 u1 N! Y9 d
#include <linux/kernel.h>
1 ^4 L" n8 e* M) Q#include <linux/types.h>
4 e4 Z5 k9 v( @#include <linux/gpio.h>
5 p3 K0 z5 z" \/ k, R+ Y2 J3 p#include <linux/leds.h>
" C. E/ t2 z6 ^$ L#include <linux/platform_device.h>
- Q& x* x) A! T$ L; e& D8 M/ ]) S3 ~" j, I5 G; a% T
#include <asm/mach-types.h>; Y. E: k0 w$ y) X- N8 H
#include <asm/mach/arch.h>2 T1 T1 v9 H1 z9 n: @9 ~; ~
#include <mach/da8xx.h>$ y$ X; A1 E9 @- c/ g4 h C
#include <mach/mux.h>
+ H4 T$ }2 |3 h$ K n/ I" k4 o' S6 i8 _( }9 s) c5 z6 U* ^
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0): O+ k6 ~, T- v) k3 N" q8 z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
; H7 S2 |6 `; c+ r#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)4 ~& g$ s& ~8 ^" W/ h
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
" |1 p5 h- Q* q
6 C% o: S* W, L6 D/ }6 I/* assign the tl som board LED-GPIOs*/
, v7 z8 n6 e" ?* T& _ l- j6 Hstatic const short da850_evm_tl_user_led_pins[] = {- w+ Z" B$ W% B1 c6 q
/* These pins are definition at <mach/mux.h> file */
( f$ v# s0 U; a9 r8 P$ }2 L' [ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,1 p) _" U( Y5 b
-1
+ F! _( x4 @+ M9 h3 t# h};
1 r* ?* Q7 P/ c. H7 n
$ J1 ]0 I& ?1 D( D. E3 j: J* Estatic struct gpio_led da850_evm_tl_leds[] = {9 `: I8 P4 _, _- O1 D6 @2 Z
{8 s. L% L, |: \1 `1 x: j, @7 R
.active_low = 0,
0 @# M. S$ N1 F .gpio = DA850_USER_LED0,; W8 U; R; _7 e% P( ?2 g
.name = "user_led0",
( z+ V# e. y0 `; ]+ n1 c# x .default_trigger = "default-on",
# s, s" f- C( Z$ |" Q },* ]( W- y$ ?& ^. W! g; _9 Z8 d! K
{( y- S2 T. p/ t4 I# F
.active_low = 0,% y3 F [3 x& K) R+ [. k" e7 x
.gpio = DA850_USER_LED1,) N y# o9 V x) ]- o* j( m H2 i( X
.name = "user_led1",% T* a, Z; |2 {$ _
.default_trigger = "default-on",, ~& m! r) {( F: k+ y
},' X9 p& T9 ]' @$ E- E" X
{
6 F l! p7 ^6 q- J, m .active_low = 0,
y' j6 d& a S .gpio = DA850_USER_LED2,
Q$ M1 z# F& c .name = "user_led2",
6 x$ l. ~, c8 Q1 K# s5 C .default_trigger = "default-on",
7 e$ T, c8 \7 K7 I. ^6 P/ n- }. Y },
% V8 k6 t& o" H8 z2 L0 t/ o {
0 D/ u+ u0 V% F* G5 E$ S2 y .active_low = 0,( N. J3 ^8 t( J4 l# i# q6 I/ d8 I: e
.gpio = DA850_USER_LED3,4 N8 }! ^$ i! a& {3 A/ c
.name = "user_led3",% L% Q% ?* t' Z" C; i2 u4 I! J
.default_trigger = "default-on",1 X# |) Y! a% u4 p2 T
},. U0 o+ n' {) U; p8 d, ?
};' n7 Z( A5 ~- f& q6 p
; z7 X0 W4 C" H; Wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {" f8 r9 c1 P9 `7 s9 A2 h7 r
.leds = da850_evm_tl_leds,
3 r/ |4 y$ ?# u7 s/ h9 P .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ l8 O7 j# \! j: Q$ f# i};
, X# Z1 c2 n) j. q
( r" I- V6 E# q* I/ Istatic void led_dev_release(struct device *dev)
, m6 \& ~ i3 e/ ]. Y{
" T9 i' A+ T( L9 `};+ h$ Q0 S0 n5 x# A& U5 j
6 _* Q( E$ G/ B
static struct platform_device da850_evm_tl_leds_device = {7 @4 `" {, g: b" x# g1 |' a7 I2 |
.name = "leds-gpio",
, n/ [! {" w, B5 O3 k1 b .id = 1,
$ M, T' ~4 l4 m .dev = {: h" }* @& @- F- M: F l
.platform_data = &da850_evm_tl_leds_pdata,
8 T0 \( h) h+ o# O% O .release = led_dev_release,/ m! C3 e7 l5 o/ z
}5 Q3 Y( O8 k; T( g6 c
};$ G2 s* y& w3 U A8 b3 i# _, ~
$ }+ p' f0 b. d; `: r# d/ g+ O4 p
static int __init led_platform_init(void)
/ i5 E% m B; A/ @{* W8 V7 a- ]: o0 ?
int ret;
5 D* J( x7 c. f+ F; h3 F# t5 e#if 0
" {; R/ M/ R# m) K ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);# X5 [+ @$ A7 M5 X+ @: o. S
if (ret)
2 c3 F3 J: S8 q* g0 Z% p pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
2 {$ i" ]7 I3 l, k$ L: b! ]( Y "%d\n", ret);( u' U7 E1 l2 V* O% P8 ?7 |
#endif
% |7 j: y+ N9 o7 X ret = platform_device_register(&da850_evm_tl_leds_device); N! U* e( _. `5 B; `/ S+ O- O
if (ret): F2 \4 q2 D5 v; S" Y5 ]$ H) p' c
pr_warning("Could not register som GPIO expander LEDS");
# X, t- U4 U& p5 L4 i5 m& N else. b9 C- X& O- i f
printk(KERN_INFO "LED register sucessful!\n");
% u4 \" m8 E, | H, |& e5 @3 N; `5 }0 I- P: g" e0 J) b+ Z
return ret;
9 Y7 C5 Z! M7 R3 w4 p}, w% f5 Z% d7 F" Z- ~% T( V
% r* e* ^: v6 u, N% cstatic void __exit led_platform_exit(void)
' Q/ [/ `1 _! D* Z2 z{6 O; ]2 H4 ~* Y% E S& D3 `# W
platform_device_unregister(&da850_evm_tl_leds_device);
3 r( u1 p( \* c! o9 z
0 w2 l7 C+ w1 A7 ]$ x+ {0 f3 w printk(KERN_INFO "LED unregister!\n");
: ^ H. ~/ r2 ~3 Y- ~ e/ g6 G} c+ L( [9 A3 D- ~. [
* {5 X# F: W4 ]
module_init(led_platform_init);" K: f- ?5 a0 ~8 H9 l
module_exit(led_platform_exit);
* t) s6 f( y! k' r
5 p4 v6 R' V5 X1 O' qMODULE_DESCRIPTION("Led platform driver");7 y4 U6 E) n3 v! A9 v% f( Y: \1 }
MODULE_AUTHOR("Tronlong");
# @3 a& K5 q/ X/ L$ ~MODULE_LICENSE("GPL");( H3 Y% F3 \4 Y2 Y, d+ A
; s4 W9 L" N) e+ R X6 M
|
|