|
|
求大神给下面的程序做注解,请稍详细些,谢谢。1 R: T8 N5 t' E9 {$ W: M
#include <linux/init.h>
. O( u3 d5 O( ~% N#include <linux/module.h>1 {# o& _( x% C/ O3 \8 s
#include <linux/kernel.h>
7 k! u4 x$ a/ p6 a( ?#include <linux/types.h>$ e% _ d1 j+ O. ]0 P. O4 _2 B) _
#include <linux/gpio.h>
% p: q4 f. c7 P# ]; n8 P#include <linux/leds.h>
% C4 r" D, M7 ]. X x) z#include <linux/platform_device.h>; A( h" f7 O' ?! P. C' b9 P8 a/ k
1 x* o, l0 S8 i9 P/ }8 I#include <asm/mach-types.h>
, \1 u0 \: {: I- g& U7 N p- B. X#include <asm/mach/arch.h>& r: P% l# t$ |' V. Z
#include <mach/da8xx.h>( y" B& O7 a2 N( g8 P4 j
#include <mach/mux.h>
* C4 o# U- b; w( R* C- j2 w
* {/ \ W2 c8 N' A3 x0 R#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
3 k* c& ]2 q' C#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)4 z' ^& f9 f' c/ |" i" d
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- f8 r5 M$ j& v* R& p
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 r) d' }- p6 Q+ b5 X! C! w
7 u: n% q& `/ A, v7 {/* assign the tl som board LED-GPIOs*/4 X0 ^. m' \! C5 K: B* `* U$ p0 l
static const short da850_evm_tl_user_led_pins[] = {
4 q# `, o }! l2 B, `0 g /* These pins are definition at <mach/mux.h> file */
) A8 `4 O0 M$ y# L2 E DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
0 E5 \! O( U8 T' a! [ -1
7 m' n& x! v4 W, B};2 R7 g& m1 i0 @4 ^4 I/ q4 t- E
?7 b8 m' W+ J0 H9 @5 A3 ]
static struct gpio_led da850_evm_tl_leds[] = {; L6 ]! }4 c. l7 i l0 s8 G2 S
{
, Y2 s. O9 y( q' G .active_low = 0,$ M y& P6 D8 { i8 ?2 h
.gpio = DA850_USER_LED0,
1 |$ L. U0 A" j3 L* P .name = "user_led0",
4 X- |. q4 Y$ R+ B4 c .default_trigger = "default-on",
/ B0 W) _4 S0 t: t3 N; d0 ] },) R4 O- Z, g' _' o3 J1 \
{
$ J( ?0 x& L! ] .active_low = 0,
, \$ b$ }' _- s F( y7 @( i" _: x .gpio = DA850_USER_LED1,2 H* ~6 J/ L8 X6 t
.name = "user_led1",: \2 t6 J/ @& N. \3 {
.default_trigger = "default-on",
; N/ s# `& A: |- c" e7 ^ },! i1 Y2 |& l: m" e7 ]# Q' s- W
{) E! g4 b1 G" K" |8 B) [* g7 j- b1 e
.active_low = 0,
! Z$ T) g0 K( j/ z .gpio = DA850_USER_LED2,
' h0 [2 T& g% A9 \, H; O .name = "user_led2",
) B- D# V1 l0 B$ F .default_trigger = "default-on",4 c4 X* ~0 v. r3 _# f3 j
}, p! h7 j- ~0 ~: a3 T
{* d% f& }7 _: x3 b, }) y
.active_low = 0,
$ a, ^- M5 s- t; R .gpio = DA850_USER_LED3,
6 q" D; M8 _+ H s& V .name = "user_led3",
! @9 `. u; p! [ z8 a, Z4 c# G .default_trigger = "default-on",. k$ C4 \3 J, U! N9 `7 m6 @* G" l
},
5 t7 O4 e* n- u4 X};" d: j2 u: F/ y0 J9 G+ J$ I
+ H, b5 Z% n7 U7 K. ?
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ S! s/ L+ B5 I6 B
.leds = da850_evm_tl_leds,7 c" A& |0 Y; O; P4 P
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),7 H5 t/ A. y/ U- t. I
};
$ n3 h' A2 `$ v( Y8 @- Z8 k( u
) [0 [4 H5 l) k- P' x; g" T' ?static void led_dev_release(struct device *dev). R8 q( H' h* \# ?( k5 }2 G
{+ m _4 m' [9 U# l; j
};
3 S2 v0 f# d/ k d' h
5 x: |3 a `; C: Q6 Z) k4 Q( f6 n- nstatic struct platform_device da850_evm_tl_leds_device = {$ C" Y e( _+ i& ?1 [2 k
.name = "leds-gpio",9 \" L4 @$ S$ _1 t
.id = 1,
* R2 R4 \0 o4 @, I& ] .dev = {. m' c4 B5 k& M6 J: O5 N" Q. @& o
.platform_data = &da850_evm_tl_leds_pdata,
3 {9 x4 N& l; h. } .release = led_dev_release,3 l$ t9 ?8 l3 {) v1 R
}% q& ]( `7 l- k6 D% d/ m+ V
};
& f% e/ X' F' V3 y1 A% v& e7 W& `) P9 F0 I& m
static int __init led_platform_init(void). v6 k5 L- e9 f9 N
{5 Q8 ]9 v) o8 I7 G) T8 J* u
int ret;3 r# z3 }( Q6 c: B# n8 r9 X
#if 0' c3 r0 w, x: p" b% p: ?& h# D
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);5 j! m+ ]# ^0 e/ b. {
if (ret)
% x; r) l i; z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
, P8 x+ |1 j4 i% m, Y/ I "%d\n", ret);5 E4 j, O$ s( T4 N# Y; u
#endif
" w4 W4 R8 i2 J9 m5 O ret = platform_device_register(&da850_evm_tl_leds_device);0 q; z. z0 @/ H! Y9 A" k
if (ret)
1 ]; N/ Z4 ]! k# O- I" B pr_warning("Could not register som GPIO expander LEDS");
6 [: u. S: g+ g$ S0 M else: h$ R( F' x4 i( {' q9 a
printk(KERN_INFO "LED register sucessful!\n");& _) R( }8 D6 `& t
- d+ c: Z6 {6 F- l/ |& u A
return ret;
! n* W, c" I8 e1 [3 Z( V}& M- _0 B; |3 M
$ A% G2 h# c1 v2 K5 O) E6 a7 p) f
static void __exit led_platform_exit(void)
; y+ B6 t. p: X( W9 M% ]9 ?1 t{8 j) s7 U! K6 p9 P3 `+ U' ^
platform_device_unregister(&da850_evm_tl_leds_device);$ D0 U4 }2 X2 m# r7 V1 a( S
% ^. Z4 \! E" o- f+ z) j printk(KERN_INFO "LED unregister!\n");
( R9 E! C/ c( w# v* \# Y% G. Y' Z}3 G' M0 n# o' [0 ^8 z
1 {1 ]- p: C) V: kmodule_init(led_platform_init);
$ W2 u5 B/ U qmodule_exit(led_platform_exit); j$ p3 B' i( G. L. r9 Q7 @0 H
1 n8 X% Z/ ~9 [1 {7 X3 X4 bMODULE_DESCRIPTION("Led platform driver");: j! K1 b* @* V# ^
MODULE_AUTHOR("Tronlong");6 f6 E$ W F8 Y' E i+ M$ t) |! o
MODULE_LICENSE("GPL");* p/ ?- x% x; u: Z. ?6 } m: N3 `
- H0 E$ _5 t* }) i& ?) R3 L: @ |
|