|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
; A* T5 _9 S e Q#include <linux/init.h>
( r3 e0 ~' w# R9 X5 ?#include <linux/module.h>9 j. ~/ A& C+ t7 `, `
#include <linux/kernel.h>
) l: f2 H2 K" v6 a#include <linux/types.h>
* j) `: K" H' d/ Y# a! G#include <linux/gpio.h>
# ?8 c, p8 c. w3 E#include <linux/leds.h>
" T7 k1 E# O) W9 s' E' y2 U#include <linux/platform_device.h>
) m/ J3 a+ l" C- C$ ]3 n2 `/ N& X% r8 ^! m1 C6 i
#include <asm/mach-types.h>+ x n7 Q5 ~3 n
#include <asm/mach/arch.h>: u e. b! [0 n G/ }
#include <mach/da8xx.h>
0 f3 D( U1 ?0 Q1 S8 ~) h#include <mach/mux.h>
1 w6 o( I; e3 @8 |. h1 w" v% p0 u' x2 J: w. n
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
1 n* Q% N4 k3 K7 B6 N9 M) I#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ F3 M) T( }) L9 ^ M# x
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 @, [4 f. j( G( ^7 C* ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- x& C# y* Z$ o6 ^/ O
7 o% T+ `! v1 p$ _* F" t% f' ^$ r
/* assign the tl som board LED-GPIOs*/- p& I! ]0 y0 y1 v: q" h9 t( V% m
static const short da850_evm_tl_user_led_pins[] = {+ L/ s5 N, g4 U0 ^- V
/* These pins are definition at <mach/mux.h> file */" _5 l8 A/ |4 b! B
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
4 G/ O' j; z7 R! S1 C -1
' @# t) y K- ~. z( }};
& z0 j! ~2 n' E1 f" a' w( n7 u N" z8 [: o
static struct gpio_led da850_evm_tl_leds[] = {( X9 H1 Z5 W1 X0 `* n6 q7 l! _7 v+ s
{! {- T9 [: F6 Y5 ~2 M
.active_low = 0,& H1 }! H( {- N- U( C4 J& Y
.gpio = DA850_USER_LED0,/ M6 Y* y7 P' Y! _6 _* T5 H0 B, {; ]
.name = "user_led0",
/ f+ `5 O( W/ C1 Y .default_trigger = "default-on",
; b. M: `( e6 H+ m- L# O; G },
* }. _+ p# _5 Z J2 o {
7 @2 t! Y$ w2 k' X4 G .active_low = 0,+ w+ C3 ]( Y4 T1 D, V8 r
.gpio = DA850_USER_LED1,
0 i* g6 E7 Q: C" C .name = "user_led1",1 i! o1 w3 g* A$ n; U' P: [
.default_trigger = "default-on",
) j d0 @9 q: A$ L },& k! n2 _0 @0 h$ Q) x
{: G: q* H/ j! N5 e
.active_low = 0,; p. O( c: r9 s( h: l( Z# ?2 J8 b1 p
.gpio = DA850_USER_LED2,
% y; Q! `9 @! f( [2 q5 ~ .name = "user_led2",# ~: F2 H2 ]; T! j* a
.default_trigger = "default-on",
4 W; T j y/ \; @: m },
" f9 v9 |. p% |! [ {/ _; e6 x5 X0 q! o. P; z. e( P, q- `
.active_low = 0,0 S) l* `7 p# j: s& K3 M4 e# g
.gpio = DA850_USER_LED3,6 H5 ^- I5 j4 Y# X
.name = "user_led3",
4 c/ j: W( ` v) N$ B5 }+ P% p .default_trigger = "default-on",3 P% Z5 v( u7 B4 U) V
},
' [" N8 R% X" ^5 I};7 Q( y1 f/ X! u# V& K: u% P2 |
9 g! b4 Q* ]# j; Nstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
0 b) h+ p7 |( p4 C, x5 h .leds = da850_evm_tl_leds,
4 q* ? V7 o& O) j* c# b1 H4 H .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ G" o& T# D5 K* ?) L+ }+ h};
$ H" T# U: p/ R3 P# q2 M9 [5 U% x* S- \0 P
static void led_dev_release(struct device *dev)- i& |2 E3 a1 U' |
{
- ~* d6 S$ _; W: ]};
1 Q2 t( J3 Y/ U, L. }5 U/ L4 T
static struct platform_device da850_evm_tl_leds_device = {1 ?# C: c* z5 }* k; _+ _
.name = "leds-gpio",
$ t( y$ D8 t$ ~# X .id = 1,4 M; G4 w% u( g+ W
.dev = {) h, m$ ^, u. S$ q
.platform_data = &da850_evm_tl_leds_pdata,: ~1 X2 X4 i; J3 n, M1 c' }
.release = led_dev_release,
& S" I' R+ o' ]+ t }! ~& |- p/ L6 X6 |6 v% N
};
+ w3 R, Z( r( a) A+ \1 Y
' S9 [5 M+ Y( g; H. @) R* \: sstatic int __init led_platform_init(void)
8 v! g+ O/ g: ?) M! H$ `{
+ W& d7 Q2 T& E# X int ret;# e/ Z# E$ C5 s. L
#if 0
z L1 x" i2 W! c% F* R ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ i# y7 n: c7 _$ V, i- a* S7 x% e if (ret)
% Z2 v2 s5 p/ d pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
' d. p1 Y+ I% `" I "%d\n", ret);
; l6 }$ J* G( e6 |5 j#endif
$ K% l% w, Q$ a9 Y) R, ]& d ret = platform_device_register(&da850_evm_tl_leds_device);
6 V p4 q* E( G0 I2 Q" T if (ret)) b+ a6 G0 Y) @
pr_warning("Could not register som GPIO expander LEDS");
1 q, r" k1 q. z) N. |7 L3 N else t- M6 m5 V# ^0 E# D9 M
printk(KERN_INFO "LED register sucessful!\n");' P0 [; k# \9 j) Z( e; ] q: X% P
) C9 ?5 K I1 o; i& K) d return ret;* f e6 o; R( J; D
}
+ t' c0 D9 J% U% `1 U" h8 \) K# O* g# A4 F: M. E
static void __exit led_platform_exit(void)
; ^$ {5 D; u# l2 `5 f{
3 a4 Z- d% }7 m3 i% a platform_device_unregister(&da850_evm_tl_leds_device);
7 w( t4 Q+ v0 _! e( v- n0 t" y
+ T; i. R+ a6 r8 T( T printk(KERN_INFO "LED unregister!\n");
. L0 V' m) z. j$ P4 Y& V}
: ^# c1 k2 _! T$ D- q$ z2 D& j3 r+ b( q9 \0 R
module_init(led_platform_init);
2 p8 J- U1 G( e( F" J- e; Tmodule_exit(led_platform_exit);
+ Y3 P( G; g4 l" G9 u+ ^. J3 E
) b( L4 Z3 T4 W+ I- e \" V/ @MODULE_DESCRIPTION("Led platform driver");$ G7 ~! _; l/ P' N" P8 J; O
MODULE_AUTHOR("Tronlong");
7 T( D- d8 h! t' qMODULE_LICENSE("GPL");
: V- X+ z% D9 J8 k1 N. m7 y$ Y
3 Y5 Q& }2 t p, s/ {& y |
|