|
求大神给下面的程序做注解,请稍详细些,谢谢。
1 @# e, M0 L- F) B% o#include <linux/init.h>
: z, f; V! m4 [. W0 D3 n6 s- p1 P#include <linux/module.h>
$ f& L$ U+ E+ k* r2 E* O# C3 ~#include <linux/kernel.h>9 e; x. S3 @3 I6 R, l: I' x
#include <linux/types.h>
3 {# Z; N; }7 s6 A/ u5 u% W7 e1 b# P#include <linux/gpio.h>
$ E9 S/ Z; F9 y+ ]( K4 F8 e#include <linux/leds.h>
/ |# g9 c1 H; W. _ y( ?#include <linux/platform_device.h>% S' o4 x. O( l0 i+ C* J0 Z6 t
" i8 V: o# P4 l( M
#include <asm/mach-types.h>
3 b' J7 [. t+ `2 r9 Y5 `9 o, V#include <asm/mach/arch.h>* z) ^) U# Q3 n, Z& k
#include <mach/da8xx.h>
6 g. b$ h2 h" a. ?! V0 i#include <mach/mux.h>
" G6 f; j- C- w0 K4 _+ y' m0 \6 E2 ^& {2 U$ c3 f3 H, _! U
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)- ^- i& ]: ]; ?! z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, s4 S0 Q% N, d# B#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
+ ?2 e$ L) a ]2 W9 @4 Q- H#define DA850_USER_LED3 GPIO_TO_PIN(0, 2), n6 _& s0 O0 L4 I; O# E5 ^
/ W' V! ?3 _' u3 l6 k
/* assign the tl som board LED-GPIOs*/4 V5 [ l# u* d
static const short da850_evm_tl_user_led_pins[] = {+ O; t2 H; t' W
/* These pins are definition at <mach/mux.h> file */
a' L; i8 W/ q+ H m J; o+ e5 r b DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
4 d- L8 ~9 p7 b. e; w -1
. ]7 M$ `; g4 l! \' W& {};. e5 A! N; w0 }3 K
, W3 \. M: Z* m' h' v; S+ d, x' B, C
static struct gpio_led da850_evm_tl_leds[] = {
7 L3 z. O1 j, a5 q+ o8 I7 N {7 Y. B+ w i2 P
.active_low = 0,
4 W9 ?5 ~3 R4 v .gpio = DA850_USER_LED0,& s7 Y! T2 v* C/ \: D
.name = "user_led0",# f+ i. f% l0 P' W/ y6 L# e" l! v Y
.default_trigger = "default-on",
/ x+ J0 [3 R# @, c },
0 s; b6 G i+ f' w" C) i% X2 @ {
' v! w9 Z# N4 c6 W5 Q, j .active_low = 0,9 W) B8 V ^& c+ z3 k3 w0 W
.gpio = DA850_USER_LED1,
2 x( o% F2 l* h" E9 u Y0 h' B .name = "user_led1",8 P! ]& h3 U2 w2 o2 }. P
.default_trigger = "default-on",
3 K0 d$ R. `$ |6 K6 s% t; ~1 [ },
+ D% |" z2 g' H; [ {
: D/ T$ D. o N9 ~ .active_low = 0,
* E$ b( q1 ^) {% Y# ] .gpio = DA850_USER_LED2,
# I* k$ l" H6 S0 `7 A5 I* h6 S .name = "user_led2",, J" I0 x. F& s9 \/ G3 T9 Y# j1 e3 @
.default_trigger = "default-on",, [$ V! J i" i! o& V f
},6 T# ], F3 l1 g5 J0 Q+ B
{
1 L4 J0 R* `, C) R .active_low = 0,
8 m( E( e8 Q$ u. W1 |( g$ n .gpio = DA850_USER_LED3,
8 Q7 W0 S# X0 W7 W0 l .name = "user_led3",
+ z( g5 R3 I: I- j1 r+ ~# T. I .default_trigger = "default-on",
4 w8 m9 L3 L% _- W/ z$ e' [ },
* _, M1 ` X$ _$ i0 c};
" k- G6 H0 K9 o. _3 ~* A5 X# J" ]1 G6 u7 j
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
7 F/ o# i6 H8 W& W i( z .leds = da850_evm_tl_leds, e4 ]& m3 I, q" t! c) w4 _1 F
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
% c4 ~/ k% i0 Y- T" D};
, |3 H3 S# ~2 Q# i0 |5 z2 y \+ ~( s$ @( N0 ^/ X
static void led_dev_release(struct device *dev)
- t1 a) q5 g) H/ L- r! g( n2 I x{0 [( m3 `! |. O% [: W: s
};( ^8 p) T7 j& v5 f; T
: F8 d- _# B5 h+ E
static struct platform_device da850_evm_tl_leds_device = {; C6 Y5 `, k" }+ r P
.name = "leds-gpio",8 R0 h( T. s* y9 ]( w
.id = 1,
+ g5 ^, v+ V O- U .dev = {. {! |0 s5 K7 ~0 w- p
.platform_data = &da850_evm_tl_leds_pdata,9 E2 Z( s' v9 ]6 k2 H
.release = led_dev_release,3 V1 r: k: [ f4 K
}
& f* Z$ l0 a' q8 m% h: ^& [};0 J) ^8 i+ V) @* w; e1 @$ E: j T" H
, ~( b" Q5 C- g& T5 Kstatic int __init led_platform_init(void)
2 _; W5 ]0 E; ?" g{( V: I. S/ o5 E- c0 X0 l9 H
int ret;
8 D7 t6 u4 C) `& ^' c) u% u#if 01 t1 A# L+ p J. d
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
" t& Y6 ^" q8 `! _+ ]$ @ if (ret): m5 ?: z8 }8 c3 L
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"8 z$ I5 i& Z" |* v
"%d\n", ret);* H2 [' M/ v; t& X+ N
#endif% t3 N1 O3 a/ r9 u/ Z" A
ret = platform_device_register(&da850_evm_tl_leds_device);9 n1 d. P$ P* J. ~: S% X
if (ret)% d7 L* C! r" ^! Z# z+ x
pr_warning("Could not register som GPIO expander LEDS");
6 w& E" e9 m! f+ ` else
0 y' V* z8 y, G9 z7 Y printk(KERN_INFO "LED register sucessful!\n");/ f/ v- h( D/ K- T9 r8 ~3 O: W/ L' B
* g F* \" F: h$ c) `. f. r! F/ K
return ret;
+ S% z2 c- J6 q: ^& G}
6 z0 N9 ~: n; S5 Z1 f. X2 B! O% t+ G b7 _
static void __exit led_platform_exit(void)
) k/ R' m1 w/ ?% i6 W$ H4 T{- `' E8 L; Q" H& S' d. ^ y
platform_device_unregister(&da850_evm_tl_leds_device);
' u9 v& l1 G8 }+ C6 \1 b5 n
7 C- z' I1 N. s3 c printk(KERN_INFO "LED unregister!\n");8 e' F9 ~- ^$ Y5 L* |3 N1 s0 Y
}
) Q7 o& Z4 l: a" t! W2 U1 n4 F; Q% v* U# ^& n
module_init(led_platform_init);
' n/ J9 P8 _, {( wmodule_exit(led_platform_exit);7 T5 y& [, V4 k+ ?
. M" Z: B7 E" O8 K4 O
MODULE_DESCRIPTION("Led platform driver");' C* _ D. s4 e. a/ `
MODULE_AUTHOR("Tronlong");
3 q' i3 ^! N8 l. K' r( _8 [# O5 ~MODULE_LICENSE("GPL");
# S2 j, K$ X. w" f6 g! @6 r+ I" |; b8 j, O7 W
|
|