|
|
求大神给下面的程序做注解,请稍详细些,谢谢。+ v C) M3 \5 }* Q9 w/ k" b, C1 _
#include <linux/init.h>
. c- J, N( {# a! u; h1 x- Q$ u) _( s#include <linux/module.h>! T- \+ R, k, O5 p( W& h
#include <linux/kernel.h>
+ n/ f* P9 r% d$ c#include <linux/types.h>: u0 W6 r4 d! E9 Q {! l! F
#include <linux/gpio.h>/ F1 S. a/ o) f2 f
#include <linux/leds.h>+ c1 l$ K, Z3 p! P5 j
#include <linux/platform_device.h>
$ K0 M# |8 K1 T: I5 i: D$ h( b( [/ v. d+ E
#include <asm/mach-types.h>0 l; o5 N" L* P
#include <asm/mach/arch.h>1 n" Y7 r9 ?5 l- [, U
#include <mach/da8xx.h># ]' Z% [5 p8 j# B
#include <mach/mux.h>
- I, I2 O( `, Z. G' d2 n* o. E9 M% O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) Z& p K3 g7 A: l$ `0 k* F0 H/ e#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)# F! n9 U Z; T1 z
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). r9 O. c" G: d# g
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2): j8 b `" }- S& g, f! B0 ~
6 [; f& c* {' d- z$ W( [, ^% L/* assign the tl som board LED-GPIOs*/
; ~! g7 Q0 {: ?: |0 f; L+ P3 m% istatic const short da850_evm_tl_user_led_pins[] = {7 q/ P$ ?- i8 U$ ~# }
/* These pins are definition at <mach/mux.h> file */
, D! C6 s" j, q$ T DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 T7 w3 V7 B* G+ e1 z/ {% J& e' `2 u" | -1" h" o2 U) H+ U! Y
};+ l7 X- i& ]" W8 ?1 B) }. Y) n
. P8 I- }" R6 [
static struct gpio_led da850_evm_tl_leds[] = {2 w' Z( ?. l, n* h$ s4 E7 U
{0 M x5 \7 _% h1 X" Q
.active_low = 0,9 d: H5 z$ q3 u
.gpio = DA850_USER_LED0,1 h: V: t7 D6 ^* q& M' k
.name = "user_led0",
( T) W |7 e1 N7 h0 _, ~ .default_trigger = "default-on", j9 G5 ]. d: i' f8 s) W
},
* u. P V; O# I) g& h {( c0 C( z% H) A
.active_low = 0,8 M7 D% j5 q- n9 H9 L7 ]
.gpio = DA850_USER_LED1,1 ~7 x" T4 o- m: g
.name = "user_led1",
& ]% B7 I" U# ^) Q) w- O" L .default_trigger = "default-on",6 g; i) p# P' c, j- }
},' m+ R" E9 }4 y) G5 l
{
h; w6 y+ @, a( X' R' ]( V .active_low = 0," P$ `) y9 D" Q: {3 V+ | u
.gpio = DA850_USER_LED2,- `: K }6 ^9 ~$ L w/ N, ]
.name = "user_led2",
R# @% ]% D) Q* w! M1 Y .default_trigger = "default-on",7 |0 H5 I0 s. F- P- D
},
+ c# u8 ]4 H# c; U# a7 m0 i6 I9 d {
' z# k1 x3 c6 X# N- K .active_low = 0,
. Z8 G( H% m3 T9 J8 k* O .gpio = DA850_USER_LED3,
( ?- R" E* v/ |+ B- z# D .name = "user_led3",- q7 q$ f* V1 G7 o
.default_trigger = "default-on",
3 L: a+ R2 x% A3 { },1 n* R! ^8 D8 P7 y* J0 J
};' O A$ t' d% S: Z
3 A$ K K0 k7 j; R( ~3 ^" M- _
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {% ~# v' B5 c4 ^& D' S( O7 s. v5 f
.leds = da850_evm_tl_leds,7 m/ t& ~- g) x! l$ H/ S' o
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
6 e' J* x: e# S; Q, K- B% ]};) x/ Z/ T; D6 o. i) v4 [% `6 R! _5 ]
2 n* b8 C) o# [: A$ c4 h3 |% s7 j* Q
static void led_dev_release(struct device *dev)
9 g6 ^7 ]1 n' _" G! Y{
$ c" ?# X9 b0 U8 @};3 B7 j$ G, P% A4 X7 Z8 E
% w" t C5 [% X9 r/ R) E$ x- |
static struct platform_device da850_evm_tl_leds_device = {
! N; o0 H8 N; x1 W% G4 S .name = "leds-gpio",/ _& b3 r1 J4 O6 m- v
.id = 1,4 U2 ~) r. K+ z$ {, V
.dev = {
1 O% Y/ I7 |: t& M) U# ^ .platform_data = &da850_evm_tl_leds_pdata,, i& J; b* s: ] G; M2 h6 Z
.release = led_dev_release,
% i. z7 {& j! v$ e6 z }
! x4 b) u) w$ n$ W) ?};+ K, n0 k6 @# }1 E+ K
8 u8 ]! @2 L( U: k" ]
static int __init led_platform_init(void)8 C# A! L( L! E% G
{: j0 e- p S7 ~
int ret;- Z k( i* J" Q+ U
#if 0
8 @ j W: N' t4 L; c0 G7 d0 p# Q* F9 p ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ n! ^7 t* p- z! C. @0 d& s
if (ret)
8 v5 i" i, S$ U pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
# c+ ^8 x# t+ h2 k1 _$ u+ y "%d\n", ret);
% A; s2 B, Q0 A7 t* }#endif* v7 h' i* \# z( a' m7 G* C( y! g
ret = platform_device_register(&da850_evm_tl_leds_device);
( ]! K3 @4 Q& h( G if (ret)1 H4 p2 T" L w& t) r. T
pr_warning("Could not register som GPIO expander LEDS");
" H. |* T. u- L3 y+ A# U% U1 a else
/ n/ P8 u( J/ Y printk(KERN_INFO "LED register sucessful!\n");
: Q+ s' r3 ^8 j+ [' x* U5 p5 @3 s2 ^
( r3 X* u& y3 P7 u, s9 n return ret;+ ?9 x2 D' c l4 ]1 v
}
( x. x: h; C& |# S; ^# U! `) q
2 J" z3 I8 \9 l: d6 k( P7 qstatic void __exit led_platform_exit(void)2 W5 a" H% l2 X! l2 s0 T
{
2 V( J& a, r* o+ B% ] platform_device_unregister(&da850_evm_tl_leds_device);. m7 D2 S4 e! ?. g7 {7 i
5 L0 O2 f4 t }7 @% C
printk(KERN_INFO "LED unregister!\n");
$ o# {' t! |3 W( ^% J4 t}
7 }# E* E# m/ n( J
5 I) H$ k- n) Omodule_init(led_platform_init);
3 V. c2 M) t0 T' f/ M$ `9 t/ Pmodule_exit(led_platform_exit);
- i8 E% Q6 {. s5 d
M6 Z9 c4 I- i* {( bMODULE_DESCRIPTION("Led platform driver");, Z5 r& z- }0 D. f( g3 e
MODULE_AUTHOR("Tronlong");
6 F" m" [5 t) u+ H7 gMODULE_LICENSE("GPL");" n H! N% q1 t
D! t5 u8 ^8 r' G! w |
|