|
|
求大神给下面的程序做注解,请稍详细些,谢谢。& M. f) @) A& X5 h2 W& w: O, K
#include <linux/init.h>! r$ ]- y8 {' }
#include <linux/module.h>, R8 R6 i1 O. Z3 |3 N7 c+ N
#include <linux/kernel.h>
* C3 F e, J W+ y- @! r#include <linux/types.h>+ m- Z/ h5 ]2 x
#include <linux/gpio.h>4 g( S+ u( H: y. w! M# \
#include <linux/leds.h>
6 {7 V# M1 {9 W, f- D; Y7 c#include <linux/platform_device.h>$ |7 t* ~# p% M
! q& T' j$ x/ ?- a/ r$ _6 W W#include <asm/mach-types.h>
+ \6 o O! [, S( f# ]#include <asm/mach/arch.h>
5 O+ k: s) Q0 ?#include <mach/da8xx.h>
, W' |" @" b2 ~% n#include <mach/mux.h>
+ m: r0 U0 u4 \* f3 B& v1 X8 l3 K
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% U' o# B+ C1 G4 j! h! D( y
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& o- N8 U8 [' v$ M9 c6 ?#define DA850_USER_LED2 GPIO_TO_PIN(0, 1), \9 ~8 U7 P9 d- E& |. s, @, U
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
7 A, N! m& ~2 [; {$ X( ^
$ t V1 @" D6 T, ^, Z; a2 n- k9 n/* assign the tl som board LED-GPIOs*/
( X) {6 _1 M5 p2 M) e! F( e7 e# Rstatic const short da850_evm_tl_user_led_pins[] = {+ v2 F- [ w/ [3 T) J0 q* C3 K1 ?
/* These pins are definition at <mach/mux.h> file */: Q4 _4 w* h) P. ]" O
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
7 T" Q* A( w( H; M2 @" l( @# M -1
9 X" @# W7 Z% h& d, j9 G};
! \. z5 [, i7 v5 d4 D1 p" A1 _; o9 ~* Q. T4 E# ?4 i1 [8 _% g& D- o
static struct gpio_led da850_evm_tl_leds[] = {
, Z" @6 ^; d( y2 P' { {
3 u- n2 |: d8 i) E( Z2 H .active_low = 0,- H2 E Q/ w0 K) q- [
.gpio = DA850_USER_LED0,
- ^2 O; U4 U7 z .name = "user_led0",
6 l# M* o3 y, Q* A) |1 o .default_trigger = "default-on",
. l- t. Y. j& Z, Z },
7 y8 G# N( h. p2 o' ]0 l {
' d9 P: }; n/ F& h6 I .active_low = 0,
% |! Y8 ~9 \; I, J .gpio = DA850_USER_LED1,& Q4 n6 C$ M0 [6 \. ?- c1 P) W
.name = "user_led1",
- T6 u* c( g ^ .default_trigger = "default-on",( a% o6 w5 g% E R* v
},5 a8 S6 M! C% ~3 F9 q( X
{# i v& |9 a4 e0 i. Q
.active_low = 0,3 A1 C- w$ d; T2 O9 L% z' e9 c
.gpio = DA850_USER_LED2,
2 u& D9 h: d+ @1 I8 D; ]$ k .name = "user_led2",5 P, q; f. n: S2 [" ^; L
.default_trigger = "default-on",2 I& C6 D# n; g
},$ I( u& F* z8 r
{
d' R) D1 I' g .active_low = 0,) N. T$ z$ D" Q( Q# J5 O3 w
.gpio = DA850_USER_LED3,
7 i; d" S! g8 T( d" Z5 B# a/ ?3 D .name = "user_led3",
) J3 D9 T( }) [! \ .default_trigger = "default-on",2 N1 M$ l( P4 h7 Y u" b, J' e1 B
},
6 v' ~0 {/ A5 L* }, `8 t};/ W' A2 D8 ?6 n/ S- o3 n" v4 c3 L/ {7 C
' @, }. x4 Y% U( @$ U3 istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: ]$ }6 O. a3 q/ ~7 j" u9 ~ .leds = da850_evm_tl_leds,/ v* m. h* I0 q/ \; X/ |
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
# {3 ?# a: v2 W! n};
+ I0 \% G/ y0 Z: m5 i/ S0 }/ a! m/ O' {2 E7 c4 Q2 {* m
static void led_dev_release(struct device *dev)% K+ l& z( G$ q0 N9 ~' R+ k
{3 l" v2 O* k3 b$ x/ ^+ W: {
};
' a/ `! z4 Q, a% }* }
8 u6 e" y# W; lstatic struct platform_device da850_evm_tl_leds_device = {
- `# l7 |. C7 P* X/ }# ~ .name = "leds-gpio",6 C; Z0 l! U8 k' k. c0 s4 }- m
.id = 1,
; Q* g" Z0 M- B5 Y1 i .dev = {
. T8 Z& C4 G& Z .platform_data = &da850_evm_tl_leds_pdata,
0 S, d; A9 q+ h; a1 t .release = led_dev_release,
0 F2 c0 s ?% g# P3 i: X5 {' g. J }4 S8 {& z% U) s
};1 a' N5 R' p! d! f! [2 J$ e
0 C: ?9 E2 f! Z
static int __init led_platform_init(void)
' y9 K C4 c. Q5 L$ M{
7 ~/ N, y+ C+ z3 x8 N; r int ret;6 B8 y" M9 |7 h) n& l/ C! l
#if 0/ R3 ] U2 Z% [; c6 T2 u
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);- ^$ ?4 q; |& L% t& X
if (ret)5 F6 v/ e% M' [5 e& y# U2 G; E# \
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 L2 E+ x4 D3 x" D "%d\n", ret);8 `2 z2 r8 F) o6 F- Q
#endif5 b& J- p" f' p% P( F5 U& r
ret = platform_device_register(&da850_evm_tl_leds_device); d3 I: T- P8 J9 R
if (ret)
A# q: A. F8 B: `/ O1 O pr_warning("Could not register som GPIO expander LEDS");$ m! O1 Q4 t- V( }+ i f
else: u) U, u; s) {9 n' ]3 }
printk(KERN_INFO "LED register sucessful!\n");6 Q0 v4 M l/ ` _' V
* B5 b2 g4 f0 l9 P return ret;
?; n3 S* K6 d& o}
5 m; [# d+ d: x8 t' Z; O- ~
6 G5 v! B! B+ h' w" Istatic void __exit led_platform_exit(void)/ o$ R. q3 X9 b) x/ t/ |+ f1 S
{
7 _; Y9 Q8 p: J2 `. @ platform_device_unregister(&da850_evm_tl_leds_device);
/ C g8 {0 k, i+ c; A+ k% D, E2 s- X$ d X5 m, T5 o& d" ]
printk(KERN_INFO "LED unregister!\n");% S* A3 o. z) @( U& p" s; u& D6 E
}! m4 l. u E+ [
. B7 J- D! A7 A* v/ gmodule_init(led_platform_init);* a# V, s" q: a9 l2 |7 y
module_exit(led_platform_exit);+ q0 X( E: u2 v# D
0 s) T* [3 @6 W0 x1 U, kMODULE_DESCRIPTION("Led platform driver");+ s% x* G; K' F9 a& X* R r1 X, d2 w
MODULE_AUTHOR("Tronlong");5 C3 n, K3 h* D. e. W
MODULE_LICENSE("GPL");
8 }& t$ @8 D0 \ S A0 F2 ~$ D# n0 q( @; K/ M
|
|