|
|
求大神给下面的程序做注解,请稍详细些,谢谢。/ N' n6 f* l. k8 s0 C& s
#include <linux/init.h>. ?! O, y' } L0 |. x- k" o9 T
#include <linux/module.h>
. {7 l1 i, H% P" W#include <linux/kernel.h>
+ C& I9 X/ c+ K% e#include <linux/types.h>
{$ a5 j8 M8 M' k% \: i#include <linux/gpio.h>
: K: N0 L; w1 p) T#include <linux/leds.h>
* V* @5 T2 K+ @$ R4 @9 i#include <linux/platform_device.h>+ J. ]9 d$ e/ u
, w/ K% v" k! X4 b$ F2 c3 v/ \#include <asm/mach-types.h>
7 B, N, f. {/ ?: |4 }2 ?+ X#include <asm/mach/arch.h>
, H. i2 ]' B, v+ N( N#include <mach/da8xx.h>
" H3 U; o! @" I4 D3 [0 E. u* t6 o3 s#include <mach/mux.h>
# T; q& n4 H' M& \5 d# e {; C& s; E& v1 |9 H9 i0 }* [6 I
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 Z" o$ u$ e2 e9 f& R
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' N; K5 ^8 v: T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)/ s! B0 X0 ?4 u' l- D
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
4 J3 s9 x8 i" b9 s5 g" P( P) L4 u4 a: X: i7 U4 k* C
/* assign the tl som board LED-GPIOs*/. m; i; A' y; Y: b8 H& j3 v
static const short da850_evm_tl_user_led_pins[] = {
! I% d! s8 M+ z& H /* These pins are definition at <mach/mux.h> file */! y. {, y; I; O6 o P
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
5 i% f# e/ S; r S0 g9 X2 F! P -1
% h4 \, k5 Q- p8 m7 L6 \+ @& e};
4 H$ d( u ~( ^$ M' L& g, ^
" D2 g7 P' }. b4 L4 w! Rstatic struct gpio_led da850_evm_tl_leds[] = {
- w- c, F( X; e6 g. P {
' b& N" { r* R .active_low = 0," E% B% x: K$ U9 f, t1 M; s$ j* \
.gpio = DA850_USER_LED0,2 U& S7 X& m* I5 i8 k
.name = "user_led0",! s) T- Q* Y- i$ f5 a/ A. i ?' J- L
.default_trigger = "default-on",
+ D5 ?) n+ P; }" N },3 W: `& Y2 _, {3 K9 j/ ^
{
1 U" c- J% k, p- T9 v8 ~- \1 [ .active_low = 0,$ d( N4 V: A7 w, n/ O+ i
.gpio = DA850_USER_LED1,- P. K7 W/ {6 v. f% f" e+ J
.name = "user_led1",
' v6 b& o4 Z3 L' _ .default_trigger = "default-on",, O* U0 d+ y) M U* J3 T
},
( o5 Z( d! y" i2 \' j {
4 }; m! U; @8 D) S .active_low = 0,- p: X- Y' v- J2 v+ D% b& S1 @& W
.gpio = DA850_USER_LED2,# e% h8 I P* W( l8 T
.name = "user_led2",4 C' Z0 h) a( N
.default_trigger = "default-on",
- P. n+ {: L- a4 Z1 L' }/ ^ }," H! U2 ]# \$ k
{
) y3 N' ]% C3 r5 ^8 C u .active_low = 0,
. M7 q; ^+ u+ t$ f# X .gpio = DA850_USER_LED3,
) a. o1 z% M7 d8 P6 M .name = "user_led3",+ [7 H- t/ D3 ?2 A! E
.default_trigger = "default-on",: u% n1 s0 p1 v' |! o6 ` {+ j" c
},
m9 P& z0 ~( z};
4 k9 x8 d* T+ P# c$ W+ E/ x A
) j3 F% r3 {. L) I, i; gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, H" p1 E+ f4 k( K0 O# \- X# E .leds = da850_evm_tl_leds,
9 S: H$ X" V2 n2 y2 ?5 z- G7 i1 f4 h .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. |, j3 @4 d" k* W& e8 N* a};; ^3 Z. s9 }& N: H& e6 l* x7 w
0 B# w2 C7 T0 X6 L) n9 xstatic void led_dev_release(struct device *dev)' L4 _8 P. O9 h3 l
{
4 W$ H6 `) _. j0 z/ A. S" F};
9 P' E/ E6 q k( O3 H& E* J
/ x, b3 f! U4 e$ g+ G t4 [1 a2 G6 ystatic struct platform_device da850_evm_tl_leds_device = {6 d" ?# N4 q1 ]/ R
.name = "leds-gpio",- H p8 Z( ?& [; U' V6 i$ _
.id = 1,+ B* H6 C' A2 S" Y9 T
.dev = {) h: k2 L" c( c% Z# t
.platform_data = &da850_evm_tl_leds_pdata,. e* g% b$ s& q: z b- T$ S& l V t1 g
.release = led_dev_release,
: b; j5 ~5 y- Y9 y+ h0 {1 [3 k) x; v }0 q* X: D1 ]8 m# q. L& H
};
8 q1 u3 h! s c9 [: n* F) J4 V3 S5 I. V% R% p2 G
static int __init led_platform_init(void)7 C$ ? G( J' P, r8 X9 H, V! u
{
! a. ~0 h! S8 u2 o; D/ k+ o int ret;1 G# _0 x, S$ r
#if 0 S* N' t$ q1 n" y8 A1 r9 c
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 i5 ^" L8 \* u if (ret)
5 l' P) a. `( z& Z pr_warning("da850_evm_tl_leds_init : User LED mux failed :"9 o& a: [3 |, V- j( p' f
"%d\n", ret);: R [4 ~" \; h/ d* B
#endif
# v! Z+ H# @4 o$ v! {3 j1 { ret = platform_device_register(&da850_evm_tl_leds_device);) j# }7 G$ M, A! ~$ r7 i; t1 v. j2 O
if (ret)& d6 j% }4 Y$ r" G1 e
pr_warning("Could not register som GPIO expander LEDS");# x* y! G: s- m
else6 C; n z% a k4 B
printk(KERN_INFO "LED register sucessful!\n");
& `/ b$ c. r2 ^0 }7 a; ]$ |& D: U' F0 R! w" x% S7 K7 B
return ret;
5 \$ r, B- A$ b& R}* r& o4 o/ V/ f7 l
1 z$ @! w6 ?, a% V) Tstatic void __exit led_platform_exit(void)
, W) g6 E' C( |{/ j: B$ ~0 T( C% t
platform_device_unregister(&da850_evm_tl_leds_device);
& q0 z2 s3 C6 L# P5 d) A3 q# o. M5 P+ n/ p! \! x
printk(KERN_INFO "LED unregister!\n");
9 _+ |1 V* u% k1 @) |}# b7 S' M4 U- g5 _4 G- v A9 H: a
/ T' k. E3 G8 z; L
module_init(led_platform_init);: ^" `9 c- z) z$ P* |: I. O
module_exit(led_platform_exit);
& H2 \8 _) c0 N; |# }( T' B# T
0 |1 g; b' ~6 \+ ~* ~' X# mMODULE_DESCRIPTION("Led platform driver");
1 ?' L @* a8 |! JMODULE_AUTHOR("Tronlong");. x F+ q1 g% J
MODULE_LICENSE("GPL");
% b0 S( v6 {+ t- l9 b: i$ s8 u7 ~! Z& M
|
|