|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
+ w) S( t) u, X. E8 [#include <linux/init.h>
) O* N+ O' K% `: \2 P2 s+ v#include <linux/module.h>
+ Y% C/ b+ C7 O4 w: l#include <linux/kernel.h>8 w. i: I2 ?. M/ I
#include <linux/types.h>+ |9 k; s) D+ F; P5 H, f
#include <linux/gpio.h>
! {6 T' q; |" i, b6 W#include <linux/leds.h>
- l a& O* u9 b0 U, g: ^- S#include <linux/platform_device.h>: m8 j# G' G9 T# |3 l. f4 V% H6 b: o
0 m. h: Z$ K# L8 H* i. v0 H
#include <asm/mach-types.h>8 i, @1 X; x1 c7 _1 A3 O E) r
#include <asm/mach/arch.h>2 z# O/ ^, C& j: B* K( v/ e7 E
#include <mach/da8xx.h>) a) J6 s$ \$ D7 D! h7 S, W
#include <mach/mux.h>0 z; B- M3 G% d2 t$ w8 m
. \$ _% j+ o! J- p# Q
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& T9 |6 j$ K# W. \0 N3 Y2 M X
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
b4 ?9 ?) _% J8 M#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
& p& b7 P* H6 Y) L# Z6 {1 M#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- M+ W' g; q6 ~/ K
% j1 p5 g6 ^6 h ~, G) |9 p/* assign the tl som board LED-GPIOs*/, K3 j* d8 F, u/ a J1 x8 K3 C
static const short da850_evm_tl_user_led_pins[] = {
; ]$ e. j9 {& ^& a" y* t+ g /* These pins are definition at <mach/mux.h> file */5 Y* b( u6 K+ q9 Y5 E5 X4 R% _6 l& Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,6 m: i& X+ R6 p% c
-1# M3 Z* o2 \* Y1 [1 ?$ e
};
; x0 j8 n1 D6 {) c% e( n) R
$ @* b$ C$ ~. C9 k$ Vstatic struct gpio_led da850_evm_tl_leds[] = {, D: W+ V" F' \2 T' P, ~
{
8 h" f# e: I, s# i* q! E) p& [ .active_low = 0, U. _/ Z; ^/ t2 ^# n
.gpio = DA850_USER_LED0,
6 {$ p8 H- Q6 z .name = "user_led0",
) [# |" N9 M+ E( Q. w .default_trigger = "default-on",
l) P) r- t* ] E7 f },
' x, A, T( L. ^+ x" ]3 {0 d6 t {
7 Z& z/ K' [* [" H: n& _9 x .active_low = 0,* x- j6 Y) {% T0 w4 G" N* q
.gpio = DA850_USER_LED1,
" w v' V D. Z- e, B6 y m .name = "user_led1",; P8 \8 {9 T$ W# X7 A9 v! u
.default_trigger = "default-on",( h# U& [0 g* |0 M8 ~
},, H. W0 f9 d/ F' C3 `
{
U% D) c. Y" s% P2 g0 u. D .active_low = 0, P, D5 \0 o& K: b- y
.gpio = DA850_USER_LED2,* D, k2 z; j8 c) d6 F" b% ~1 L
.name = "user_led2",
3 h* @& C: Z6 h .default_trigger = "default-on",; R$ g# f+ q( v. }
},
' ^- y/ p3 E5 R1 d; Y {' n0 l/ H# b5 w+ e" s
.active_low = 0,
. _# Z; p( F& q0 V .gpio = DA850_USER_LED3,
' d- Q* u+ O" ?# L .name = "user_led3",8 W/ v: P9 R1 |! N3 i5 d b, K
.default_trigger = "default-on",
4 a1 |( {/ t5 i! }9 ~' B! P },: E$ w. j/ q6 m- [7 O: m- }4 \+ G
};6 n6 V4 D3 I. G. ]; I6 X$ f- N
% y, c2 X- }3 T" wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
! z1 b6 D; ?3 |5 a( |9 a .leds = da850_evm_tl_leds,$ X- J: R: @' z& j' b) c5 J
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* K6 h; b i; X8 d};' n% ?* ]% I' i2 q3 w
% n0 n; d; z4 z& astatic void led_dev_release(struct device *dev)* d9 O! N+ r' G/ z
{+ n# h" c. |* ]. n
};( @1 w0 W5 f: S8 `
, J0 W3 _3 h2 E( N1 m. g
static struct platform_device da850_evm_tl_leds_device = {6 O: w1 d1 b# K& c$ D
.name = "leds-gpio",
1 m7 y. q4 z) ~8 N7 C .id = 1,
4 ]( U. h. t# I% Y- M, T; A .dev = {3 ^7 b# y- m3 Q2 h- q8 j
.platform_data = &da850_evm_tl_leds_pdata,7 M! |/ G( b1 d0 F8 e5 w
.release = led_dev_release,) ?& R4 S; p, c o. u- }. M$ m
}* w; O3 X0 F9 h/ @' N
};
1 f6 C- P6 i) W, M( H" A2 `; X) R, Q) f) A6 F( D: d; U
static int __init led_platform_init(void)8 o9 m& C& f0 z p3 B+ [' ~6 }; V
{
4 a, ~6 X: Q4 I int ret;5 ?7 e, ^0 X! }5 Q' y2 Q c: d$ w$ M
#if 0
, D1 V9 E+ D7 P2 U' A+ C v ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
, c' y' S/ ]4 x3 M: l7 d, ^0 K if (ret)
, m. h# `+ d2 k pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
9 J8 R) ~- d7 A: W/ v "%d\n", ret);' d: c2 a- A; `+ {2 T1 A/ \
#endif' q. I' X6 W# M2 ]+ S( G3 c
ret = platform_device_register(&da850_evm_tl_leds_device);% G4 K: m" I7 S0 V1 N$ O
if (ret)
; P/ |: W& b" n, Q6 I pr_warning("Could not register som GPIO expander LEDS");8 g s. E" P+ r7 o6 `
else
; i$ z2 N- M* F4 q printk(KERN_INFO "LED register sucessful!\n");# P# L- J( _8 R a7 C: ^7 ?
S- f- F+ r. R+ S' }$ ^' N, _: z3 t m return ret;
( x$ M! X+ Y) A8 h9 g! ^7 z2 l8 y}
0 b# D j1 d0 l1 O1 w; j/ O
5 W" x' w) N% g( Ostatic void __exit led_platform_exit(void)
4 \. z" C3 I& [$ t7 {; a) S{
' R* O$ a) h3 H8 `0 j. B. o7 \ platform_device_unregister(&da850_evm_tl_leds_device);
+ Z6 X& z2 O* R2 \8 U: b, ~' Z
5 s. Z: p4 \: q: p; J6 l5 D, P printk(KERN_INFO "LED unregister!\n");
2 ?) b# A# t7 t}
9 d# G: j9 u! f$ z5 T1 i) {7 K! r( o+ O- r" `
module_init(led_platform_init);
" i2 p# h$ h8 C8 j! _6 e2 h9 @8 Umodule_exit(led_platform_exit);
9 i( x" ?$ J/ |, n5 D. z( h3 [, H6 O( y/ M8 e9 o; M
MODULE_DESCRIPTION("Led platform driver");1 [( n) z! e; I0 w M& E
MODULE_AUTHOR("Tronlong");
4 Z5 R/ \3 X% r( sMODULE_LICENSE("GPL");
7 [' n& n5 l4 h
& g- @" C% f9 y" r7 D8 f4 N |
|