|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: h; M. h4 c1 i8 u' _7 J7 `8 h#include <linux/init.h>3 w; r; \- d9 Z
#include <linux/module.h>
6 D7 j: b2 I* x% q#include <linux/kernel.h>
0 M$ W' E, Z: V7 G6 a7 X6 v W; k#include <linux/types.h>* w; J4 k- r3 n, s
#include <linux/gpio.h>
/ {7 Q. B4 K' f7 _9 z#include <linux/leds.h>
2 @7 z- S% `1 Q#include <linux/platform_device.h> _$ a" A: X: z4 c& g2 g
/ M" V) J& ^' R) C: k o; ?#include <asm/mach-types.h>
@/ |% M; C; b' s#include <asm/mach/arch.h>4 ]" ?. Y( r+ C
#include <mach/da8xx.h>0 ^5 t9 H9 q F5 \6 C
#include <mach/mux.h>
" O8 V; a8 w2 g$ Z0 G4 ]
- { q/ p1 F: F5 l( f! |/ l% Q#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
+ s; n; \7 u$ G, P. R' S4 A. s#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
3 s0 e1 T8 M' V' U' g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1): E% k2 Y' I, _" F, X0 ~# z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)/ |/ h2 ^3 H' L: \
# g! ^( x2 z# |! {- P9 M9 ] e( r/* assign the tl som board LED-GPIOs*/
8 B6 L+ H; f3 n- Dstatic const short da850_evm_tl_user_led_pins[] = {1 M: Z/ d5 s4 l$ Z* P) E, G# v
/* These pins are definition at <mach/mux.h> file */
: i0 t. H/ m, `4 } J: l DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,2 f o M5 D& e
-1
* w3 W+ ?& t; E5 E& j) ^};
2 H l2 q0 s% |% p# ]
: d/ A" O- X5 q" d/ m4 |. M, ystatic struct gpio_led da850_evm_tl_leds[] = {% h/ `/ G: U" q' t
{# t, x* M( k# _+ D8 ^9 K3 |6 S/ w
.active_low = 0,2 t" l: r: O' |! {
.gpio = DA850_USER_LED0,! I i% E9 j w: J. Z7 S' K5 N) `
.name = "user_led0",
( Z: a* g" k- Q: l7 C+ g6 w$ x .default_trigger = "default-on",
. a# X; o c1 {9 ^; Z$ } },' c0 B5 `6 m7 r( R$ e& N
{
; L" j9 G) w) u, X .active_low = 0,9 L- B2 l' N: t3 r& U% y& ^
.gpio = DA850_USER_LED1,
$ F: U5 u- C/ b) N4 M .name = "user_led1", p% F$ R, u# f' R# B+ ]
.default_trigger = "default-on",0 [- `$ j5 G8 w- R* ^
},
0 F( ^" [* V+ u2 a6 X% C {
( v R$ A, {7 ]3 s" A: _ .active_low = 0,
; u0 C* \, u1 \9 {6 o4 b, \ .gpio = DA850_USER_LED2,9 g$ g W0 _$ Z
.name = "user_led2",
9 X1 j. \& ~7 M$ @1 k4 F: l .default_trigger = "default-on",
# r# K$ Y. s; c; z9 m( s },
! T2 J- l/ R& o) Y' j4 J {
& V' Y4 |; x' H* M .active_low = 0,
2 h ^1 L, B7 I0 S% M* g7 U .gpio = DA850_USER_LED3,
1 T, }! n) P- ~, u. } .name = "user_led3",
7 _4 ]$ W* T8 t3 N: d$ b$ T% r% G .default_trigger = "default-on",$ ~4 B0 C( r0 i1 r( A: K
},
& ?! r7 ~9 k4 N};
0 K8 K- P1 E9 G1 z
) s7 B1 m( i% r- {7 P" jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {, i: i' k; o4 f' U$ V' n5 [4 t1 u7 m
.leds = da850_evm_tl_leds,
( T2 a* H& i! B0 Y0 v .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
7 q9 R$ X3 a2 Z, E};% v) T0 N! z0 x( _' L( c
1 o0 p$ M' m- ?9 \: x
static void led_dev_release(struct device *dev)
1 z& h+ d7 f W{0 m E X+ V1 y0 Z
};
8 X' ]% Q1 I# R( p' i3 H; P. x" A& r* J) J2 g
static struct platform_device da850_evm_tl_leds_device = {
/ k3 m5 C$ d7 Q" g/ T .name = "leds-gpio",/ x- H1 ?; d/ d9 X9 @9 V! G& A7 f
.id = 1,
0 ?; r# b \8 v! o' x5 Y! Y7 E .dev = {+ P: w* t& y5 o4 t; E9 }; r# v8 j$ o
.platform_data = &da850_evm_tl_leds_pdata,
5 L T# U1 Y& V* n) r .release = led_dev_release,
, |/ X1 r5 c: l6 a+ g9 t }5 h* ~5 t5 P8 Y8 R
};
1 G8 _8 G$ R2 }$ X9 Q @% y: m: u8 f, h3 R; m& {1 ^" q
static int __init led_platform_init(void)
7 r$ R7 N# O& Z# y( D5 L. M{
% i4 G5 ~6 I7 Q: t# m/ T- S1 i+ l int ret;9 H% x6 B- t- P! w
#if 0; Q$ `* k" C6 s7 {0 Q
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);; w' j' k! e9 q F, |# i' u4 F6 T2 \/ O
if (ret)5 q9 `0 k! @) x4 B/ u
pr_warning("da850_evm_tl_leds_init : User LED mux failed :") ~3 C# t: \+ ?
"%d\n", ret);! n, y0 D9 p# D
#endif
1 ^% n" ^/ |' A% H, z ret = platform_device_register(&da850_evm_tl_leds_device);
) r8 \1 _0 [8 j3 _, b9 @! k* j5 | if (ret)1 L! [" v' q, \% y# f
pr_warning("Could not register som GPIO expander LEDS");
4 c* \7 |4 k X5 ^8 | else: A& T3 u" M$ t" Q
printk(KERN_INFO "LED register sucessful!\n");
2 o& i0 R6 W3 P3 Z' r0 A$ Q3 U) b, T* a- o5 w9 @6 y
return ret;
: @9 B" r2 F: P% h* t N9 R}- X" _/ l9 ?' r3 z
. U, i6 J7 |4 g' o" t
static void __exit led_platform_exit(void)& g5 k! T% p4 W1 p; v r9 `* J
{
6 Y5 Q0 V2 Q' j9 Y platform_device_unregister(&da850_evm_tl_leds_device);/ k. g3 M* {) B- x1 r
$ p' S7 A( b& E3 l
printk(KERN_INFO "LED unregister!\n");: P5 z4 \, y! D
}
8 a; ^2 X) K: }, F
# @+ F0 p* _$ h0 Dmodule_init(led_platform_init);
0 |4 ^4 p' d" I B' q) jmodule_exit(led_platform_exit);
' x; m6 X$ c$ O3 b0 q, \( ^$ w& J1 M) T! i. Z- E1 o
MODULE_DESCRIPTION("Led platform driver");6 N/ r9 C8 `- @# d6 |6 {5 ~ ?
MODULE_AUTHOR("Tronlong");* \ j7 P9 ~, E3 D% J9 s8 ?4 f
MODULE_LICENSE("GPL");* K" I" `6 X: H4 k$ g9 P% n
/ E1 }& L, y! V0 L. o |
|