|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
9 @. w- o7 ~" d Y$ l) ]. v5 {#include <linux/init.h>
) O5 m5 t" @) ^5 t# l8 G/ G#include <linux/module.h>
; E6 E7 s/ t6 l8 \- Z. E9 G2 ^$ v$ P#include <linux/kernel.h>
; X' @) h8 x4 R/ b; [#include <linux/types.h>
/ d# m2 {* F7 h2 \4 Q) M1 o& ^+ e#include <linux/gpio.h>
( o' ^ ~# r1 }3 X$ m#include <linux/leds.h>
5 P; H1 Y0 p2 U2 B#include <linux/platform_device.h>
/ \ h5 \6 K, U4 O5 Q2 \! Y* N9 Y
#include <asm/mach-types.h>
- n" |! E- o0 ~2 r#include <asm/mach/arch.h>: C% s* n& Z2 t. k/ h* i: H
#include <mach/da8xx.h>+ O7 G, a& ~- S5 `8 p k0 L. h
#include <mach/mux.h>
6 F$ V# }7 ~6 H3 g" \, V7 }8 D" F
5 K+ |. V" E- N% ?- B D#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)3 O8 q( ?$ x/ u" |& O4 q- o2 ^
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 K9 A" Y/ I2 {6 C$ N( A#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)' `) q0 s+ ^, n& ~8 ]3 q% S+ ~
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 X$ D" R* M0 ]8 J6 X d4 a& Z! I. d% N
1 R9 \3 ?' t9 |. H+ _# M/* assign the tl som board LED-GPIOs*/
# _* E4 Y Y+ m! L* D. o+ Istatic const short da850_evm_tl_user_led_pins[] = {' a% a" Y% t+ O6 P4 j. C, q& n& `
/* These pins are definition at <mach/mux.h> file *// s/ U& N# Z4 Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" J% R, I7 i- @* Y$ t, D -18 x) a+ F" D& T" G6 r- [
};
4 [; S! J+ l$ d6 I
: x2 U O* T7 x* G) ]static struct gpio_led da850_evm_tl_leds[] = {
" x0 H. m! W; X' Z {
* N2 _0 y2 e! D( L* b" @, O- x" [' b .active_low = 0,
7 S& v* A- u0 r6 v: J .gpio = DA850_USER_LED0,
5 P$ I! p2 B# Q8 [+ b$ \ .name = "user_led0",4 K0 R6 ?# U; o. u' g
.default_trigger = "default-on",
9 J' p- O S5 j2 O },4 t- V+ ?1 i- `- H( x
{2 _4 J w; ^/ b8 F/ j3 ?
.active_low = 0,
9 K5 b2 A6 F( r S .gpio = DA850_USER_LED1,
' y, Z" U4 I W0 r( h .name = "user_led1",' x4 i2 l% Z3 a
.default_trigger = "default-on",
' D; x/ s3 C! { },7 w w5 N# x- @. p+ j! j
{
. x) R! r; X7 g$ s' e+ ~- |% c .active_low = 0,
! y5 V- ?6 l# @) u- h: W6 v .gpio = DA850_USER_LED2,- R E4 s( @: e9 A `: N
.name = "user_led2",
7 W2 I' \: O* K" G1 L$ q4 j .default_trigger = "default-on",
; Y- Y% J! |$ `+ e1 h },' G, q, `9 Y/ K
{
: @* N; A3 O- w6 \! s .active_low = 0,% j1 O+ L- v# O: x+ R! m7 y
.gpio = DA850_USER_LED3,: E- Z# A7 W7 F/ Y7 V
.name = "user_led3",
! |& X( `4 Z' P) t .default_trigger = "default-on",
% B/ \) X8 r6 {2 z },1 }6 G7 M) b6 i- K
};1 ~2 n9 k X2 {
# R u7 d& W8 d# _/ Y
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
' g8 ]) P. ]! L8 o8 o4 q5 u( Y& a4 y2 C .leds = da850_evm_tl_leds,
6 P1 M% W% k, Y* E3 w .num_leds = ARRAY_SIZE(da850_evm_tl_leds),: @5 R0 F) `% v* F
};
8 X" k2 U- V; S$ K. r
' [& K: h/ Q3 z; ustatic void led_dev_release(struct device *dev)+ g/ d8 \/ h2 u: {
{
- G4 ]9 Z. K; P/ _8 R};
( H! T. r! t# e5 d
3 l$ M: z& ^" m- M5 `$ j* b; y# Nstatic struct platform_device da850_evm_tl_leds_device = {: N& c9 [% A/ {' c2 ]- Z& P
.name = "leds-gpio",
3 n/ e, E! ]0 y .id = 1,
; G/ q) T5 H: g- {7 b* ]; K .dev = {
/ O# y* {5 W1 B3 M* v& A7 N .platform_data = &da850_evm_tl_leds_pdata,, a, P! A) n& K. z& n% f
.release = led_dev_release, t2 D, W3 L! j/ {# b8 o
}
[% ~. j) h* F; j' F$ f g};5 @: W4 P/ G8 P( j8 \* x2 l
1 I9 y: i( [- ~8 J: ^4 vstatic int __init led_platform_init(void)
* X0 m* k& n7 a/ G' m/ @{7 Q! M' y- K N
int ret;
' z7 p9 x0 H5 g#if 02 t. X* B; r& H0 r& `. T: C
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
, t% H+ x, e& W. X! u- f if (ret)
; R5 G. @" l o3 u% j! s4 D' d pr_warning("da850_evm_tl_leds_init : User LED mux failed :"5 A* S$ N: h1 z; h! F
"%d\n", ret);: L" l* V0 l# c$ q+ m
#endif# G/ d0 x' H" Q3 v- i5 c
ret = platform_device_register(&da850_evm_tl_leds_device);$ ` E* m0 G! C9 A
if (ret)( `8 S* a4 y7 A# p
pr_warning("Could not register som GPIO expander LEDS");
! S# }4 r/ J# t else
3 D4 y+ c8 E( J' w- s. x& X printk(KERN_INFO "LED register sucessful!\n");# {2 i- t' A9 m
0 q+ {4 B$ [2 {% w' j. c return ret;8 {2 E( A. I& i1 a: U
}
- ~" }; y0 d6 L. a8 \3 n
* w% m. J" k, l/ [$ Nstatic void __exit led_platform_exit(void)7 Q- Z- z+ o1 L- s% @' Q/ n
{
3 p+ |/ k( D% Y& N/ J* M platform_device_unregister(&da850_evm_tl_leds_device);
" B; E$ [6 p5 i% \6 G) I
1 W. J. A" ~$ y; r' C9 [ printk(KERN_INFO "LED unregister!\n");
4 a0 J; g6 ~: K" f}
3 X3 e% b$ r$ B4 Z0 v
! h! X" o: z* W: |$ A. o3 e6 c# Rmodule_init(led_platform_init);* v7 q) a3 j$ K P$ E( F
module_exit(led_platform_exit);
* j; K3 W) c% b8 T0 h- j! j
G+ T8 l* d5 [, n0 ZMODULE_DESCRIPTION("Led platform driver");
6 L" E9 ]# u( s( R) n8 tMODULE_AUTHOR("Tronlong");0 `# Q/ [3 u; G3 H. Z) y% e
MODULE_LICENSE("GPL");
- z/ O S1 g8 J
5 J7 i( @; ^! L3 \ W8 M8 p; _ |
|