|
|
求大神给下面的程序做注解,请稍详细些,谢谢。; n* M$ _* V: P6 z! p& L, o; h
#include <linux/init.h>: A O$ q3 E: O% J' H& e( F6 O
#include <linux/module.h>+ q; N9 m: V+ }+ \% K" w
#include <linux/kernel.h>/ H, _, W& Y a
#include <linux/types.h>
' i i+ T8 o, h( V, y% L9 `* o/ k#include <linux/gpio.h>
/ n4 g; d5 j" A$ }# ?#include <linux/leds.h>+ x3 S! G( x" H6 L- S
#include <linux/platform_device.h>5 c8 u5 \0 H4 d: H" V }7 k
+ d8 u* z$ [0 L" E3 {# ?: ?
#include <asm/mach-types.h>* T9 I. W7 p: W6 x. R
#include <asm/mach/arch.h>
2 u$ s% [& U: Q% l2 n. b8 \6 u#include <mach/da8xx.h>
8 Y( \1 i) @- c4 p& q# H4 n#include <mach/mux.h>
- B. c( r- `: }1 D4 [: P
/ K. W. a! ?! k0 Y6 f) e#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)/ a$ O3 V0 q% D$ l) K( m3 I \; v1 O
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' X( U4 k+ i" _$ B; K
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 P: D3 o' ]$ x3 W& K
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; r, i% `* v& X8 }! u, x! H. H% E0 B" p+ I& \/ R( d% h
/* assign the tl som board LED-GPIOs*/. _3 ?* i0 P U
static const short da850_evm_tl_user_led_pins[] = {
. }% i7 O- E- H# ~. t /* These pins are definition at <mach/mux.h> file */
" d8 H* o. ]& J9 n& P3 X% I& _7 x DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
0 ~8 @1 p( r9 p% ]+ {: E/ ^0 L& \ -1
' ]' L5 { U$ m};
6 @: f5 a* W" \% `0 W
( ]6 {, T8 F; y4 r* lstatic struct gpio_led da850_evm_tl_leds[] = {( \7 u4 D- Z6 O$ _! n0 x
{
& w0 |1 L' [# [! d .active_low = 0,5 k5 K+ w4 W! \1 }6 M8 s. w2 R
.gpio = DA850_USER_LED0,
? n$ g/ h b- |; ? .name = "user_led0",/ x* ?" A2 ` o! S* M ]% @
.default_trigger = "default-on",
6 n, i- ]# M0 S- f! { z& Z },
2 h0 t9 \3 l4 j `6 a {
4 I: w' F& f+ N) o1 F .active_low = 0,
& K9 D1 u. j; `# h .gpio = DA850_USER_LED1,5 V3 n+ b: @ ]% v0 k
.name = "user_led1",
5 [ N& p3 ?6 l1 V .default_trigger = "default-on",
" U6 f/ h& M: t9 U$ o g# Y# S },
5 B$ ]5 K& v3 L: X. r: ~" f {
9 f. m- G. r* t .active_low = 0,
' z( E, r0 A. X .gpio = DA850_USER_LED2,/ B/ T5 S9 V7 E, A, \; B. G0 D3 k
.name = "user_led2",
7 Z: _1 E0 ?% W3 G .default_trigger = "default-on",
* K) ~4 ^/ n a' S, R# Y },/ t' F( b) m1 r
{
) w' T& Q( S2 \5 u* ?& i .active_low = 0,
2 e+ {4 m$ Z& G8 ]; E .gpio = DA850_USER_LED3,7 j0 e4 V$ S. q( C
.name = "user_led3",5 j0 N$ o7 o& Q4 ~2 U' a4 f/ K% {
.default_trigger = "default-on",
T- i+ G* V4 `' L& _) X },
, k9 G; w7 X3 \};8 Q+ ]1 h! {# f6 p
5 ~9 T# B& X; g+ A0 Nstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 A! O. e \1 G- \4 V- F4 |$ k; e .leds = da850_evm_tl_leds,! t) f3 F! A2 P$ X7 b- X. M
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
0 `( q6 o! a- b0 _( \};4 Y6 _4 g! ?( g! a% f; e$ z
6 Q' z* ~% Q( ^4 a: P! wstatic void led_dev_release(struct device *dev)9 [4 \! c- ^9 o# `9 @1 M2 S
{# i; K S5 R; w: ^( t. K6 u
};8 g- ~$ F. z' b( L- U t& p
/ I [# ]& j8 T1 H$ n' `% zstatic struct platform_device da850_evm_tl_leds_device = {
; n. r( K0 R" r2 C, q .name = "leds-gpio",* s' e9 y$ M L
.id = 1,5 I9 P; [' R+ l1 @6 t u
.dev = {4 N/ p$ F0 G) J j" k$ F
.platform_data = &da850_evm_tl_leds_pdata,
( d. N7 H. u' f7 S6 X .release = led_dev_release,) j4 }) A( E8 {9 M8 f# D% u
}
( s+ @# {0 d- Y* C1 }. q: b( }};& ~& y/ |: O0 c6 d
. p: [' w' F1 a4 f0 I
static int __init led_platform_init(void)
! F! Y# v5 M) z( z6 P{
1 k9 S3 V7 {" h int ret;
! B! D f; r7 v, k/ U#if 08 H! J! h( D1 q/ T: ^, ^7 H* E. ?# j
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: y7 `1 L2 F7 ]
if (ret)
1 P( F P- i9 W7 [' u" k$ x7 `# s pr_warning("da850_evm_tl_leds_init : User LED mux failed :"" H$ j& j' W8 h9 {1 E* S* l+ O4 O
"%d\n", ret);
1 S+ w4 J" R$ x) N- u#endif
& N+ P2 y6 E7 ^" Q& M) r6 ? ret = platform_device_register(&da850_evm_tl_leds_device);
% `8 `, z3 y$ ~9 e if (ret)
( b& [6 j3 E6 H9 |$ ^. u pr_warning("Could not register som GPIO expander LEDS");
3 x- l% T. u8 S6 w0 }: j else
. ~+ V$ U8 _; t t printk(KERN_INFO "LED register sucessful!\n");& E7 p) X, N2 @# i9 L, F( _
9 |9 D* D% z; M3 H6 t
return ret;0 f! W+ z5 m: c$ J+ L1 k
}9 c6 N: d2 {, |3 J1 S1 X8 z4 B" i
9 k5 [; c, ?- P4 t: Y# Q' D
static void __exit led_platform_exit(void)$ X( t6 r2 P, q+ j- C- R& x/ g' b
{; r! W9 j0 |: M/ U* o, p! y' U; h( D7 b
platform_device_unregister(&da850_evm_tl_leds_device);
4 J `; @ a: G. _+ _8 R2 p w& F2 l( D6 z( u9 b- c0 [4 h
printk(KERN_INFO "LED unregister!\n");
( D5 u5 X& s' v6 f. O* }, O}. n$ e8 h% `7 D2 N
; {, q d9 ?) }" W1 \* D; {& f
module_init(led_platform_init);, _) o# Y% f7 p6 C& n; L: X. `
module_exit(led_platform_exit);6 _# X; L( k% w* Z- g, l
7 Q( J/ b5 o+ I$ W8 Z2 T5 }/ Y
MODULE_DESCRIPTION("Led platform driver");; t! g( t- ]! C5 n4 P* O
MODULE_AUTHOR("Tronlong");% b( `- O# O3 Q* c* }
MODULE_LICENSE("GPL");2 I- m6 o0 G6 ]6 G# }
) N0 k4 H+ f/ F: n# ~! C |
|