|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 k( u- J9 ^4 M8 A: x: Q; J3 w#include <linux/init.h>' ]! ^) e4 t" D J& U; ?8 b3 u( h
#include <linux/module.h>6 c( Q, d. b9 X) @* e+ @4 D
#include <linux/kernel.h>
, o# s0 g- }/ w# d( \% B5 A. J#include <linux/types.h>: \+ J' J; e& I$ D3 v
#include <linux/gpio.h>' C1 ?' q$ f5 T8 P
#include <linux/leds.h>
' l/ k6 q8 U! V) O#include <linux/platform_device.h>- i& D/ q* D W( \
% R1 b6 |* g) b! C4 j4 Z#include <asm/mach-types.h>! k! q8 @" d4 @# @1 U% m/ y
#include <asm/mach/arch.h>2 _9 q* i$ V* c+ E; f9 M
#include <mach/da8xx.h>
$ |) l0 L3 R, a3 S+ N#include <mach/mux.h>) A+ O6 u9 x& l& c# y+ e. a( o
1 w {& E2 f4 T5 v
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
% }/ k2 A k$ g. \#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
' N, z$ s% L# C#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 E9 v9 v- U( k- P5 b. a% J
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 Z) F- @) `% W7 d1 @$ ?) C6 ~9 q, P
/* assign the tl som board LED-GPIOs*/
, Z+ l; v; O( Estatic const short da850_evm_tl_user_led_pins[] = {% A+ t a E/ {
/* These pins are definition at <mach/mux.h> file */4 k! P6 \ A& M2 o+ V! ^* u$ m* e
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" H5 u3 h' g( m7 F+ G) x2 {7 u -1: s' ?; J( P% u3 C* k. b/ _
};
% [5 D) J6 G1 k/ b; ]4 M# j8 z: i/ |4 p5 [" [7 O& A' z
static struct gpio_led da850_evm_tl_leds[] = {
% U+ A' e! S7 V* d8 A4 t6 Q: E {$ _& R9 Y( t4 [4 i; l
.active_low = 0,
" y, K. w6 P/ X9 X6 I .gpio = DA850_USER_LED0,
$ a1 g. M" W4 m9 I) I( u .name = "user_led0",
- Q+ e6 y1 p) }6 a. u .default_trigger = "default-on",
- B# q9 \7 y. f3 n },
* Z1 K, B e% \: o& p9 S {3 d. n. Y6 |" d* ~9 ~& d2 b& }
.active_low = 0,
% u7 \) ]1 ?8 f9 Z* i" [8 D .gpio = DA850_USER_LED1,
) B; m) ]! B' F$ E) N6 I .name = "user_led1",3 G9 T5 k/ E2 m. f
.default_trigger = "default-on",
; ]3 D; @( W: k9 e* Y7 k },
0 D% T' t! V' D, K1 g( T {
) F" {) }7 n& W% h N* B' ] .active_low = 0,4 M5 ^6 x7 z0 D) @# {6 m+ i, c! K
.gpio = DA850_USER_LED2,
' P& t6 `% ?* H5 y! @ .name = "user_led2",
* N5 ?- Q2 w- _1 S' g .default_trigger = "default-on",! Z# n& X1 V) a, G5 ?! Q& O8 ]
},' q$ S* E' o$ o! X- u- ~4 G
{
/ k" _# c! ]* {, c$ n$ N .active_low = 0,/ b( m* X: l; I7 ^6 H; a% a% i( [7 E
.gpio = DA850_USER_LED3,8 Q8 l6 J4 U4 G' N B( F9 N4 L6 e
.name = "user_led3",1 J( c% j! ^/ j, n C
.default_trigger = "default-on",
6 F* U4 b. _ u4 O: b- i) K },5 b1 q( R. Z- D
};
; l, D1 c) R# U, b3 r* E& d, W& E$ |! X6 i0 @. r' v' N+ {
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {+ ^/ P* p3 f) {" i9 w) U
.leds = da850_evm_tl_leds," N9 p4 E7 k, i, D: Z5 M/ e
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
+ B& e. n0 X9 }# g! R# ~/ N( X6 @5 t7 C};* I6 i/ H( v7 R+ c& N: U' W0 l* v
( _+ j* S/ O2 n7 O I2 Tstatic void led_dev_release(struct device *dev)
, K0 ^1 a. z) U$ f{& _: i* N8 F5 K# U0 s9 m
};
2 |5 j6 K2 {' I) `$ ?! X+ s) _ a$ N( b7 ]: Q% Z1 ?
static struct platform_device da850_evm_tl_leds_device = {3 ^$ g; q# W( e) S; x; u0 Q5 @5 m
.name = "leds-gpio",# y) {7 v' r0 F% c, f
.id = 1,
5 K$ f+ y5 v! m .dev = {' }; v$ T& J& B! a: K
.platform_data = &da850_evm_tl_leds_pdata,2 I( o" i) Z: I; |) D$ d% I
.release = led_dev_release,# \ X' N, k. ]* S: }
}; @7 Q2 L j) J' K! Y3 E
};
1 U* {5 v2 C7 ~2 V, L
5 O/ X- _7 V, J9 P7 m- fstatic int __init led_platform_init(void): H* _( r# V x6 J& d+ ]' a5 {
{ O& _$ r' o7 M r, ~/ Z; B
int ret;3 Q: S) |% b; X8 |. X
#if 0
! D0 _4 v* F& H% [ ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ G% G5 a+ \, S# A! |9 j
if (ret)6 R" b/ d9 k, W" q
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; r4 A0 \( G8 ?. Y7 J2 ]7 ]
"%d\n", ret);
7 ?2 d9 b# C! O" @+ L#endif
: Y9 \: I1 i& \9 z) y" d ret = platform_device_register(&da850_evm_tl_leds_device);5 p% R/ R( D7 a5 `7 r
if (ret)
0 |# D- c$ H- k- I pr_warning("Could not register som GPIO expander LEDS"); U) J9 k7 `( x
else
$ I) m3 l- N- h printk(KERN_INFO "LED register sucessful!\n");
& S/ q* X+ r! ~8 {- S% K& t; P4 _. l! f. s R& s' t( W% F4 x- y6 s
return ret;6 l1 ?+ n0 M1 u. L8 j6 u
}& P9 D' h* S$ F8 x1 c4 Y" E7 `
1 Y6 H+ H# O0 x* M) H
static void __exit led_platform_exit(void)
1 m" C- i) k/ |' S$ f- S. L1 [{
% V; X. n! N- z @( \ platform_device_unregister(&da850_evm_tl_leds_device);9 I P0 e6 y3 C! D: k6 ]4 c
7 c, t4 p2 x# @* X- Q5 T6 y printk(KERN_INFO "LED unregister!\n");, K5 ]+ t M7 ^& D) q3 x1 G( O% w
}% o) J; v- v0 v' x2 L# W, D# i; x
* A* h) Z# q6 T: ymodule_init(led_platform_init);
! X+ L' I# B, a" f6 cmodule_exit(led_platform_exit);
3 L* Q) V: }$ p* M: j" k; ]( H
5 v K$ H6 q O: w+ L* K! i1 MMODULE_DESCRIPTION("Led platform driver");
) `5 X7 g `2 Q+ ?$ A! H6 O) x/ FMODULE_AUTHOR("Tronlong");% K/ x4 |, W6 X# t
MODULE_LICENSE("GPL");
/ i$ }, F: i( Q' T! _+ Z* z
5 p8 F/ y! J5 ~. N1 {. d* Z |
|