|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
" e7 l1 X5 Y" v [2 O: O#include <linux/init.h>8 c: p; i, B* q) ^
#include <linux/module.h>* H- `( g2 J( F
#include <linux/kernel.h>& M+ L! K+ w5 Z/ c
#include <linux/types.h># W9 T/ A7 P, }8 F/ X4 f; L2 p& f, @
#include <linux/gpio.h>% {8 c) E. A' d
#include <linux/leds.h>
6 k# y( V8 e3 f3 Z#include <linux/platform_device.h>
% Y+ S! I, {6 X+ a, H) u
0 `% L* p& Y& d v#include <asm/mach-types.h>
9 |4 W% a+ d+ a, o3 u& O# }8 @#include <asm/mach/arch.h>9 |$ t& d9 y; }% x
#include <mach/da8xx.h>
( q' Z! g8 s% j#include <mach/mux.h>
( U" k, a( \/ U3 O% @- X6 X( C" I$ f5 W7 \& i
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& L# s7 N( v' d. z#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 `5 v2 U& n( {6 I) {( j
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
- j5 l( O3 j4 h3 K d#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
! M! b$ @- X {- i' n; l) p- ^+ l8 M6 J' q% F. L
/* assign the tl som board LED-GPIOs*/ l+ Q; N5 v; m7 d# G# e
static const short da850_evm_tl_user_led_pins[] = {
2 d& f, _( y$ A% j- n /* These pins are definition at <mach/mux.h> file */
6 S! w5 X4 @1 Z5 b( |9 S. c DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,5 z" _% m2 b ^ w9 Y
-1# h/ R; `# f/ t) \# U$ P
};; I7 ^( Z- O/ ?% O+ d S' T
' H7 _" y8 D- x% `3 S' T/ u
static struct gpio_led da850_evm_tl_leds[] = {( A% ]8 w4 U# p. @
{
8 s$ J7 \7 x9 d .active_low = 0,
& o' w- S2 d, R/ E6 f .gpio = DA850_USER_LED0,
{. u* W+ G$ w8 a3 h5 c& I2 R .name = "user_led0",/ c2 o. \2 ]9 ^5 d: C, E$ _
.default_trigger = "default-on",. q3 w# ^, R, I3 X6 r7 e( u6 R
},
, v( y. t& _4 g0 g1 {: t1 h {: {/ u- N. m/ W8 n
.active_low = 0,
& F6 O) Y5 Y* t/ K+ m .gpio = DA850_USER_LED1,; [5 A( b9 ^2 W' r4 o
.name = "user_led1",
8 T5 [$ Y) Z" A7 P .default_trigger = "default-on",! r9 k2 P) P8 O9 q9 q/ N
},% Y% \4 v3 H8 R9 u7 `. o
{
1 B/ g. T R6 A .active_low = 0,
M. B* l3 y5 ?" r2 S p .gpio = DA850_USER_LED2,9 { j/ q8 P2 _2 I: J2 _5 I. j
.name = "user_led2",
# ?5 L/ J$ Q% T1 u .default_trigger = "default-on",
, |. J) [) c9 ^ },
! s) H' m* @" }7 p {6 W& s2 t: M1 z; ~8 A: }0 E
.active_low = 0,
' [# S$ D' X( H$ t) P- E6 p .gpio = DA850_USER_LED3,8 ]4 `3 M- D* K; a4 o
.name = "user_led3",
/ x% V6 Q7 T: e9 i3 b* Z& I .default_trigger = "default-on",
# `2 N4 }2 \- e3 m7 ^ },' }. V! [( |) o4 n! Y
};
7 a0 g5 @' k, F C9 j2 z
& j1 m" K$ P1 q# T6 B+ E, Y7 xstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
+ s. e" Z i* G- E .leds = da850_evm_tl_leds,
: W. W* R' q+ { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 ?- F7 N @6 P6 g/ Y0 Z
};
" q$ @9 q5 q* @' m' m$ P5 R) _+ g7 V" g4 A# X6 |6 s
static void led_dev_release(struct device *dev)* T# [; N8 g4 D# A
{0 A, T3 `7 V0 W# t& w/ ]- |
};
5 y, B" t+ R/ `' i
& [4 Q" n* `% N' }; x/ O4 _static struct platform_device da850_evm_tl_leds_device = {7 S& g- V; K( ~* x9 _0 j. }3 s5 C0 V \- ~
.name = "leds-gpio",
% r9 u* T6 E$ e1 Z .id = 1,
u! q5 I; C6 w& o .dev = {
4 L& q3 A0 `0 t ^- k$ d8 ^ .platform_data = &da850_evm_tl_leds_pdata,
- k- k5 H% }( S7 n4 c( x .release = led_dev_release,9 O/ Y B/ ?# K
}5 x) f! o1 g! M% F3 Y
};
$ `0 a+ {! q; h6 {
+ H; `4 r w m) g6 G) r0 Lstatic int __init led_platform_init(void)
" H8 G M4 ]7 \. k% U, }{
' d) t! x5 [' M2 L) n int ret;& [/ h% O5 P. |5 l1 j. r
#if 0& U: O% i' F* Z8 N7 o* R+ W
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
: e' p0 P, k2 c6 a3 b. j6 a, G if (ret)! k: y6 a; Y7 J# k
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"# P& N. A' `& T L) b
"%d\n", ret);
+ W, ` g7 _1 b5 p9 w#endif
, ]' \% }. L! k% p6 ^" T ret = platform_device_register(&da850_evm_tl_leds_device);
/ ?, `. }9 I5 R+ t if (ret)
0 Z0 N- [0 `1 |, j pr_warning("Could not register som GPIO expander LEDS");
) N# V$ l. @, l2 ]' A3 W else- e" a: O- [6 A" h& R! s* }! ]# Y
printk(KERN_INFO "LED register sucessful!\n");
3 W% H) B# U8 m" y7 [" \7 P$ r: |
) } ?9 [' v( I2 Z1 w2 @9 w return ret; l/ e( n( f4 \: L+ N( x
}3 `5 ]* I6 R/ ~/ r! {# N4 S
/ G! E& q3 t$ F! D0 e9 L8 L5 \+ O
static void __exit led_platform_exit(void)% ~: l+ f- N" n P5 D
{
4 ^8 n5 s. u' c; H0 ~' P' z6 T platform_device_unregister(&da850_evm_tl_leds_device);. i, m' o$ X' ^
. A, {+ d5 S& w
printk(KERN_INFO "LED unregister!\n");
& H8 U5 c( B: Q* e" M* F9 X}
$ v, X& ]% }/ ^) k* U. C5 `+ g# M+ U+ D0 F1 I
module_init(led_platform_init);
8 b# G2 S* L* t7 W. \module_exit(led_platform_exit);
) [3 p, T2 D: r% J: g ?; S/ \3 P3 Z% {+ z2 {* o! u& p
MODULE_DESCRIPTION("Led platform driver");; J6 A& j1 t/ }5 Y3 p: ?
MODULE_AUTHOR("Tronlong");+ Z& Y) m+ j5 l6 `3 `+ T
MODULE_LICENSE("GPL");& y u, ~* y% n0 b4 \
# x) @/ P: }, G9 U6 F- ~/ d |
|