|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
* `0 e. q3 M. U" V, m#include <linux/init.h>1 e+ z3 _; b2 [1 M5 c2 B: |
#include <linux/module.h>* X; y M, L3 ]2 y# f" P# m. W
#include <linux/kernel.h>
, q$ U# ^5 Z; |& J4 z#include <linux/types.h>
6 y. ?8 s: y6 u/ f#include <linux/gpio.h>; T& n+ e6 U/ M: O
#include <linux/leds.h>8 ? o: }# n- O) p( Z
#include <linux/platform_device.h>" G- ?% i u# d# D0 M" T4 ]4 P
9 N) B/ r9 w" u$ b7 `
#include <asm/mach-types.h>
* |: M$ L5 n4 }4 s" @! B#include <asm/mach/arch.h>1 T) a! L- ]) m
#include <mach/da8xx.h>
: [. n% G$ T& }* L* p2 y' ~ |, t! {; ^3 u#include <mach/mux.h>- b/ ?8 a [% A) R. {* s
' A% }1 q/ t. S7 P
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0); U% w0 y- h/ R ?
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 b. @1 ^+ ^- E! T1 q
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)% I; O, v) a- b8 U* y
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)! c6 ~8 ^0 L6 e- `) v, \
. P& O+ L( k, _; ^! c- ~7 B5 X5 H
/* assign the tl som board LED-GPIOs*/+ d, t- C, y% F: q9 n
static const short da850_evm_tl_user_led_pins[] = {
9 ~3 L* j# E6 N8 }! r /* These pins are definition at <mach/mux.h> file */! m/ s+ h* | H8 q. c( R' J( x
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: ]8 i7 M9 v; i9 ^% m -1
" T+ v0 I( C$ a3 X) Z! t};
: l. [2 j: P) Z6 Z6 T/ K b; D: F# ~" c$ z. e/ Q$ i
static struct gpio_led da850_evm_tl_leds[] = {' l$ S: o: N9 k1 {# B5 F9 q
{+ B/ Y; l. `4 G3 ^
.active_low = 0,
* I* ^9 Y/ |# Z. a) j+ }8 V3 X .gpio = DA850_USER_LED0,
8 b. S1 }+ l f+ v; n8 X6 q- P9 n1 Y .name = "user_led0",
6 U1 z" _# @$ ?% W% Y& ? .default_trigger = "default-on",
* J4 p8 {3 \5 c3 m( B! t* D },6 s- z! n% Y$ o2 O5 p
{
! n' M4 H& ~! i, @% d' D .active_low = 0,
. Z* r5 C1 v8 N" W4 C" J# u7 z6 F .gpio = DA850_USER_LED1,
+ A: i/ r6 Y6 \- o1 a8 F/ [ .name = "user_led1", w, [0 N |6 a0 R+ m$ I
.default_trigger = "default-on",3 n2 z# | M% _4 _& n
},4 X y; E, z' F0 u, }! o
{
0 b. Y# {4 B6 H3 i .active_low = 0,: g6 O; B( o: C0 W* T, I6 |! T
.gpio = DA850_USER_LED2,: U+ d, X4 s _2 Y' j1 l; I
.name = "user_led2",
E% G1 k- ^4 Q( F0 B .default_trigger = "default-on",. o- d6 a5 }7 S3 W6 ?
},
5 a: x/ [; q7 e, c- H4 ^4 k. Q2 z) L3 [ {' H- y. C5 j; h- H! ^+ b! o8 S
.active_low = 0,3 U) X; Z; w ?% D. p" b8 H
.gpio = DA850_USER_LED3,; d0 u9 P6 D! q- N4 b6 y
.name = "user_led3",7 W# ^/ ^1 ?( b. ~! b) J Q
.default_trigger = "default-on",0 ~2 P F5 z# T2 z9 D
},' h# N5 P( O3 J6 J' c
};- {2 h* T" C. v3 G, B, g2 X |
7 B( M8 P3 @2 o6 _# i% N q0 v
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
v# ?' m4 Q1 G, y% X2 H .leds = da850_evm_tl_leds,
5 B* t" G+ T6 j7 W$ o) _7 X .num_leds = ARRAY_SIZE(da850_evm_tl_leds),( g- V; x" Z/ a H+ K2 m% v
};% R& h; K, w% {! d' x
; p. K0 }! r9 h
static void led_dev_release(struct device *dev)
( |5 |5 `% {& j6 @8 W% p7 U2 N{
7 q$ g c- n3 U7 [3 z0 ~' F% w};) y v7 G- k8 j% G, v7 \
" w3 c. x3 I% lstatic struct platform_device da850_evm_tl_leds_device = {. {! d# b6 j$ k% j3 @8 S
.name = "leds-gpio",
k) q3 A# s% p, y .id = 1,( b( A6 C) Q: a, f1 Z4 J
.dev = {
) j. g3 G& j4 v$ \9 T3 R3 N- R .platform_data = &da850_evm_tl_leds_pdata,
1 c! A) B8 W _3 u .release = led_dev_release,
' M, s0 O2 l! e" u% P3 O: z7 | x. T }
7 u5 Q3 v3 m' J2 D: O5 B7 c6 w$ O};5 _1 j2 K% u: E2 k
1 {7 j) ` c, t# P1 z& @- J- ostatic int __init led_platform_init(void)
& s2 t U+ X0 B/ }1 V{
1 q2 ]$ r: y$ |% [% e. E$ { int ret;- a U' C9 w9 g& T2 ~
#if 0
9 |6 F3 E4 O& |0 X& c ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& L( a6 N- e' o6 Q) T if (ret)
# r9 M+ A# L2 e! C pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 @1 F) s& u( Z3 @+ B& g0 I7 }& Y; b ^) Z
"%d\n", ret);$ x8 N" ?! p2 L: q# q0 Q
#endif
; J' H8 F% ]5 j0 M1 T% [! n# C. p" P ret = platform_device_register(&da850_evm_tl_leds_device);
) n" L6 m, V9 R- s. e8 @5 W if (ret)
9 X8 C. ~- M$ m0 s& q" U. Z pr_warning("Could not register som GPIO expander LEDS");
8 \7 b% e9 D' \/ `% d# [* B( }9 I0 q7 v else
4 u% D8 h1 m% t$ q* V5 ^ j; ?: N printk(KERN_INFO "LED register sucessful!\n");
0 R1 \4 P: x, Y2 U
9 q/ y. ]- u6 P6 [8 V" K# _9 i return ret;$ O' e. u$ a7 U& g/ X& L
}
: C' M+ ?' S) n( U2 |' e4 R& b$ |5 C' V5 x9 @3 g# a7 X; J" Q
static void __exit led_platform_exit(void)0 d6 w( J1 M( d0 w( ^9 u
{* P" N7 _, h7 ^; l1 U0 {4 x" j
platform_device_unregister(&da850_evm_tl_leds_device);
, i- { i( o0 n O4 b% [+ Z: q) w: Y: l6 k5 a
printk(KERN_INFO "LED unregister!\n");
# H/ k9 a2 y# A+ O" ^}& C, |5 O( ^% @+ j3 t1 {
) v8 c) T& @" Y: P& L% Xmodule_init(led_platform_init);
6 k: A0 m+ y6 Q; ~% |: ymodule_exit(led_platform_exit);! R* q* Y/ k: f) _
+ w$ _9 H9 b |5 u6 ?( K
MODULE_DESCRIPTION("Led platform driver");7 {0 H0 c. s7 j, A: J
MODULE_AUTHOR("Tronlong");
& h% C; B" J! G; U& z4 Q( SMODULE_LICENSE("GPL");
* f$ I% \! C# m7 t) C* Y# a1 }5 Q2 Z7 B2 e+ h; g
|
|