|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
" Q* L# ? h; S- P3 K#include <linux/init.h>
' P& M/ x! k; i#include <linux/module.h>8 x1 ]: j4 N3 _ [
#include <linux/kernel.h>4 l. L( P, p- G
#include <linux/types.h>2 |- U- M. c. j/ q% d) H
#include <linux/gpio.h> e3 y$ V: J9 d
#include <linux/leds.h>' v4 t2 i4 p; ^; q3 M8 v/ V
#include <linux/platform_device.h>
2 s8 d b% B# y) O, t1 r! j
" R2 R N& t2 ]! O2 C& l#include <asm/mach-types.h>
+ \7 x5 X4 X$ E: g( b2 m) M, {#include <asm/mach/arch.h>7 d+ A& |: V; e f2 q z* ?8 ~
#include <mach/da8xx.h>6 {7 g3 b* P, \# d
#include <mach/mux.h>- t Z$ M+ ?8 c" m
5 r9 R2 t Q0 a! [0 Z2 w3 Q2 T% t#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)) p: a' M4 X3 k5 ]) |$ W
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& F/ y# G. y7 @+ A8 i/ |- V
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
3 U7 T: r1 I9 f" ~#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
: @" c( v' v) `6 _ i( _2 r
M& j" L8 k* A8 w7 z/* assign the tl som board LED-GPIOs*/
; o; m) J; O/ Astatic const short da850_evm_tl_user_led_pins[] = {
5 w3 I' I; h. d) y6 }8 b. Z /* These pins are definition at <mach/mux.h> file */3 ^8 Z1 \4 p/ Z
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ d6 {+ i: S/ |- C, r
-18 w. Z5 [1 `+ A- p4 L
};$ y- u+ l, c2 X$ G# L
2 r# l0 b# C0 g0 n& i3 Ustatic struct gpio_led da850_evm_tl_leds[] = {
' h' w" k. c- V2 I6 C& c {
2 D. P! w! V; t& a ~ .active_low = 0,
: o- ^8 x( B8 a2 ~. O* V, k .gpio = DA850_USER_LED0,
1 v/ i& @1 @+ I .name = "user_led0",
1 W& n4 L. Z0 \ .default_trigger = "default-on",. R- ^, b- W6 s1 l p- J# o6 [7 E
},
# f9 p2 I# g* E& t# d7 \ {
3 c+ W) e6 p- S" f .active_low = 0,. S: y4 R& Z5 L; d' w8 K
.gpio = DA850_USER_LED1,
/ J9 d8 l! u' L G3 z .name = "user_led1",! N2 u% F! Y. \/ \5 p
.default_trigger = "default-on",
1 P+ }/ m X8 N# H },( ]1 _7 L2 g# Z$ N+ e) ?
{
3 F* Z: A/ l8 f @ .active_low = 0,( h5 ~' n' J9 c
.gpio = DA850_USER_LED2,
0 r) E* Z7 H1 J6 v9 C4 M9 D- o .name = "user_led2",
+ j& v# ^* e% x .default_trigger = "default-on",
% G7 B2 w5 ^3 ~' b },
, e* G; v3 c: `+ v$ e {
z# X/ [! g, p }0 i0 w4 v .active_low = 0,) b+ ?$ R( \. g) T! z
.gpio = DA850_USER_LED3,
2 ^. G% w$ ]9 V* b+ i .name = "user_led3",
+ O# Q) J# z% u" c" _ .default_trigger = "default-on",0 c* J6 ^4 |8 v2 h4 S
},
5 B% {, F- ^7 Y" t4 g};
X5 `; r# q) e4 P0 L$ g4 C8 q+ ^6 W
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 Y$ Y' ^' m, r
.leds = da850_evm_tl_leds,2 m% \ t# `& a; I
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
" o }/ e; _* n# W8 Y o5 E};$ z. Z7 F: [/ ^" T; F) {; C5 g
3 Q% t% t) a: Y
static void led_dev_release(struct device *dev)
, E; Q: Q- ?% |- I{
) _* k: U' I0 L( b2 y};7 l8 F5 x4 \, m- v. B; f
" z: b L- V% _% c" E& _
static struct platform_device da850_evm_tl_leds_device = {
" A+ b$ K/ s; k8 T .name = "leds-gpio", T6 f1 L# H- [0 [9 \; e% ~5 W' _
.id = 1,- @) d7 N; K: b4 v; T) p# F
.dev = {. Q9 ?" x: f% F0 Y5 K4 p$ b
.platform_data = &da850_evm_tl_leds_pdata,% |2 Z `8 V6 }' \+ f
.release = led_dev_release,2 X9 s! L* J! T9 A5 q7 x; i. y
}
' d) D" m' \" b* k* ^};
0 u% o! }, i$ a* p( ]' Z9 Y) o" {
static int __init led_platform_init(void)
+ {# v5 I E6 ]# C" c K; g{
' A8 m4 K( o1 s int ret;
) E" w6 `. I9 d* C$ M+ g# Z# j5 M#if 06 x/ k8 }' u5 e9 k' ^
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& ^6 j/ t2 [7 @) I if (ret)
0 w: @* ?, Q9 n: l8 R9 [3 d4 Z% X+ s pr_warning("da850_evm_tl_leds_init : User LED mux failed :"6 i, u+ U4 N( g' x I
"%d\n", ret);
0 F2 t" F( a# M#endif
2 ^$ h8 }( w' L" u1 y ret = platform_device_register(&da850_evm_tl_leds_device);
# J* R1 R$ ~& ^- k if (ret)' Q! Q: N$ g0 ^5 M Z& I; R6 o" i6 ]# m: |8 o
pr_warning("Could not register som GPIO expander LEDS");
w# Y0 t+ V, c. a2 H1 k7 s( V# g else
& y, l! [9 @+ b; f. { printk(KERN_INFO "LED register sucessful!\n");
, u, b- x6 m5 z7 \" p: [
9 T2 |9 f+ L) g4 l q8 X# V1 ?0 m" y return ret;& r4 I% U1 A$ s3 }' W
}
u1 W' {( N/ R* m+ R1 P/ |! n u9 ^0 H, G9 H$ J% t' @* q
static void __exit led_platform_exit(void)- [: p; m% f# e: Z0 b' z8 A4 E6 G4 X
{
) X- U/ g# n0 ]- h6 h1 P& o W3 g* P platform_device_unregister(&da850_evm_tl_leds_device);
2 x# M( _" X" y4 R% H1 o
! R1 E! q* F% C5 i, z- { printk(KERN_INFO "LED unregister!\n");
" U4 u* i6 N7 W, P. D1 R: X}# ?: A; ~ J. E) I+ I; {
K) D% L: D' X# B9 Pmodule_init(led_platform_init);
) E- F/ E6 |9 p; }module_exit(led_platform_exit);
2 v# i' q0 ?! A; y( @
3 Y& \' l& b2 g; V/ z9 {MODULE_DESCRIPTION("Led platform driver");
( q& x0 c8 y" y1 w( gMODULE_AUTHOR("Tronlong");5 h9 j1 A: _6 A- |/ C
MODULE_LICENSE("GPL");
9 C, @0 l9 y2 V( p4 ~0 ^4 s
- X' @3 m) f) w4 }# Q& w( E |
|