|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
9 X" F3 a% \) {3 B( Q5 Q0 W8 _#include <linux/init.h>
! [% v$ A e. }0 ]#include <linux/module.h>
. d: j7 U8 V9 t9 d) T) w' A#include <linux/kernel.h>) n3 L, u( t- r7 b: Q; n: S( }
#include <linux/types.h>$ f# v& L) h+ R) V4 I
#include <linux/gpio.h>
9 y! O; v5 W7 H#include <linux/leds.h>2 v' k7 C' p; {0 d8 F: l' P' W
#include <linux/platform_device.h>
# Y7 m, g8 t! M- B; d& m, [- F* I1 g7 {4 A# A
#include <asm/mach-types.h>/ x' A, ^* r+ \# ]9 E$ K7 G
#include <asm/mach/arch.h>/ q7 J0 t6 t: b) v
#include <mach/da8xx.h>/ F: g6 S5 l" t9 [& W
#include <mach/mux.h>
3 Z/ x) t- e! V$ O8 m1 z. W9 E, I
: ?; s3 X, r& S3 s0 x5 D#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 u) ?/ J8 G0 C7 ?; U( l! c0 `#define DA850_USER_LED1 GPIO_TO_PIN(0, 5). m! T# u: o$ e2 z/ {$ ~
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)- [* ^" {! ^6 H6 l5 s$ A R; L
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
: |3 j$ E9 ~4 H0 O. @* m2 Z g
$ F8 b( X o7 P2 v" _0 Q6 X# C, u/* assign the tl som board LED-GPIOs*/0 Z" q) t! R0 v3 Z0 M4 H
static const short da850_evm_tl_user_led_pins[] = {6 ]6 }3 s+ X- r
/* These pins are definition at <mach/mux.h> file */5 t& w, R0 y T. ?9 a: M
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
" X/ J. g, {' \0 A) u -1
. w9 R/ l2 |' U% R: s, i};3 V+ d6 ~! D. `/ w: T6 H0 T
' \8 n6 D4 |5 H6 ]- p
static struct gpio_led da850_evm_tl_leds[] = {
: Z: Y N8 g) H- R {
& H4 M2 h: k* Q; N7 A# W .active_low = 0,0 e6 Z" T) ?* x
.gpio = DA850_USER_LED0,$ I0 U3 a' O% a+ m
.name = "user_led0",! I) J) h5 i s; k7 G
.default_trigger = "default-on",
6 z1 ^* P5 r+ F. J- }7 T' C; P6 Z },% L f# ?$ ?. G6 w
{ u0 U% K; P3 x# _
.active_low = 0,2 {" v1 W2 P* }+ X4 o
.gpio = DA850_USER_LED1,9 ^ `, b/ I/ A9 S/ l
.name = "user_led1",
$ ?( ~' ], |) |% D* {3 O! c. G& ?! l .default_trigger = "default-on",% b0 h& Z q7 ~( _' }, ?
},' K1 L5 r) q+ t# D
{
' n& K& ?/ R8 _( E5 ]# m .active_low = 0,
: e+ j2 U3 C5 Q" _4 N .gpio = DA850_USER_LED2,5 `# i' y. B5 v+ G, n
.name = "user_led2",' @4 D' y: g) W* @! V& X+ d D
.default_trigger = "default-on",
# o( s& n+ |! n8 \; e% f }, W: e4 `( }6 L3 ~) S4 c
{
8 C O- V5 U' I3 N0 g .active_low = 0,# a0 y( g! m+ M* `8 b
.gpio = DA850_USER_LED3,8 _; l1 J3 N- `
.name = "user_led3",
, ?$ A2 r( c) b/ a1 n% K .default_trigger = "default-on",5 o9 i8 ?! E$ J
},
* j/ E# A- X3 m$ z& I& a};
8 j5 c9 V0 P0 `5 v( I. b- ^0 K0 w3 d
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
# _4 ]4 m/ G& c( ~; W5 }5 w2 Z .leds = da850_evm_tl_leds,
, B$ q8 J0 v' h. P6 Y8 Z7 y; { .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
+ [$ |$ x9 H+ _* m k) D};4 h. P- H1 G z
0 u7 p, i w0 A3 g
static void led_dev_release(struct device *dev)
5 i, I7 T' T+ L2 ~. O) m7 Q{
9 }! k& }* I# w4 p1 s( S! A5 J};- B2 ]) r( |" }+ s
& G, e& L' H8 z
static struct platform_device da850_evm_tl_leds_device = {
" |9 v8 C( T. v1 p3 @8 d .name = "leds-gpio", z+ S8 ~" t+ R C' c8 N, d, n
.id = 1,
5 c+ c- `' X: u; y$ S1 Z- a .dev = {2 d2 y0 P& S( B$ s& g
.platform_data = &da850_evm_tl_leds_pdata,
+ E5 I3 `0 l6 @9 {2 N6 r, M .release = led_dev_release,
' ~7 r, L+ H9 m }* v M- V6 o0 A
};/ V9 l! I4 D/ O$ u
7 i: @. v2 O, i: u: Z B6 Estatic int __init led_platform_init(void) `# }2 X$ h1 ~: L. k9 C
{
# {. L- r$ d8 A# O1 Z int ret;
2 k& B$ @3 Y$ I#if 0' J3 Q+ A7 [, A1 w, u# r
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
5 i6 c8 C. k! P4 M! d if (ret)1 [- N, f$ F2 I$ n/ F+ u: G. X' V' M
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
3 u% t1 F1 Q3 h2 K5 E, o "%d\n", ret);: G0 q! |9 s' f3 E
#endif* f/ W i& |! k$ z
ret = platform_device_register(&da850_evm_tl_leds_device);
( K$ e7 q) R. }# ]5 G if (ret)
: T! a* l3 ?2 U/ V pr_warning("Could not register som GPIO expander LEDS");
s6 c6 ^( j0 V9 F" X( @0 z. | else. Y6 N' Y* ~" R7 A9 i; r
printk(KERN_INFO "LED register sucessful!\n");
+ M7 A7 _7 K0 L) o, Y' [- w& ?9 G# V! l: O1 H0 T
return ret;
( e. N. f. G6 M& k6 ~}/ E4 P2 X- s! t' m+ I3 g
: i' k4 c; S; o1 ?3 U; f
static void __exit led_platform_exit(void)
) p) j9 f) H, G- j1 o{5 K. U1 C& Z% u( J
platform_device_unregister(&da850_evm_tl_leds_device);
; e% R; m" ~: [- }$ L0 v
( t" B6 F/ g( j! }5 p printk(KERN_INFO "LED unregister!\n");
# S l0 G2 w9 p: q0 h v0 p}
$ c; V7 L4 u ]* X* O. u" Q8 L
! r; D3 r, a* b2 j2 e zmodule_init(led_platform_init);
6 U" i g2 [, l/ I/ Tmodule_exit(led_platform_exit);
9 H5 p4 M/ d! g- n( I4 |4 Y" I" ~9 k7 I
MODULE_DESCRIPTION("Led platform driver");* B% d2 Z- Y; h- C& l/ `
MODULE_AUTHOR("Tronlong");' e6 o4 l# l2 O2 H/ p: l' G% r
MODULE_LICENSE("GPL");
5 Y) R z9 _" t" |
. v! w; W* X- f( W/ {& ^. Z& y |
|