|
|
求大神给下面的程序做注解,请稍详细些,谢谢。$ K; c6 n3 Y7 A) ]8 p8 K8 P/ f
#include <linux/init.h>$ n* C. U r4 F" t
#include <linux/module.h>
- x1 f4 Y' o& @6 V6 f1 T7 Q- d#include <linux/kernel.h>
G% d$ ^) D4 i2 [- |; r- l#include <linux/types.h>
. i+ e6 ^0 B$ v#include <linux/gpio.h>9 j" {6 d, ]# {9 w( R" c
#include <linux/leds.h># W6 c# R8 p: [. {$ h8 {, |: T4 z/ y: N
#include <linux/platform_device.h>" g* T7 Q! r B
0 P7 h9 ^9 |2 n( E4 v
#include <asm/mach-types.h>/ b* z: ]1 ~. G; j% A( S
#include <asm/mach/arch.h>
( S' A4 F t: l3 l( `3 ]* C#include <mach/da8xx.h>
# k1 X3 Z& u* u' D& W#include <mach/mux.h>+ V7 _ t1 [7 w9 j1 S' C) }
; v9 U7 G9 [8 ~1 X6 {7 e1 t. F
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)7 ]! E: r* J M% M
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
6 z* i. b# m( H% @9 d) G. o' R#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 O" L# R9 x+ N. G, c$ f Q
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) O- Y& Q2 C" Q- d
; G: }* z+ t% ~ |0 i: \1 y5 S/* assign the tl som board LED-GPIOs*/
3 R6 f) [0 W/ X5 S+ t/ H9 jstatic const short da850_evm_tl_user_led_pins[] = {
! V' x* P$ n+ H8 C1 x /* These pins are definition at <mach/mux.h> file */7 v) a+ N) \. C& E' L2 q
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ g+ a% j1 y0 [) g; r9 W7 o" E/ T% k3 L
-1( G4 ^) r1 r6 Q* d# R9 K) Y
};" R. ?2 n4 B! F' ?8 a& p+ G$ p1 S
" w3 |+ X5 P4 w s" ?" Cstatic struct gpio_led da850_evm_tl_leds[] = {
- O6 y- _, \6 U {' @* M9 O$ z6 Y
.active_low = 0,
0 s5 m' Y3 f* s D! _0 h .gpio = DA850_USER_LED0,2 O) k4 A5 V. w6 H
.name = "user_led0",- f) B; A! l+ U4 J8 x( g/ z) s
.default_trigger = "default-on", Q* k% H8 Z4 t W, e% ~9 v
},' t" t1 V$ q# u1 ~( R5 a
{
" F5 T% I! I3 R {1 R$ d/ E4 ^1 A- A .active_low = 0,: ?' K! H! y- M. L
.gpio = DA850_USER_LED1,, R3 k, a( w% H+ Q( v# D
.name = "user_led1",
1 b& X& @# u$ x0 T9 } .default_trigger = "default-on",, G* ^7 u) \- s! v* R8 p( L' u, f
},( @3 a- _/ T0 @4 E( o' t9 [! g
{% n9 c" [' t- n6 S; F/ K K, _6 K
.active_low = 0,5 v/ Z, |4 S+ a
.gpio = DA850_USER_LED2,$ B% u; M5 x0 A7 y% `7 A# `
.name = "user_led2",
% K( P5 G8 {( h' K% P; e% [ .default_trigger = "default-on",
. b& [- b$ ~4 r9 H* q, y },
* k! }9 m6 u0 P9 v" B {0 F+ l1 q4 l2 W1 E! L. H
.active_low = 0,
4 p. R9 o3 B% o .gpio = DA850_USER_LED3,0 X4 E6 |0 N# U9 w
.name = "user_led3",5 {) `5 r3 B8 `4 q' g' G+ T
.default_trigger = "default-on",
; X+ s0 X" }2 L( P5 Y; \) O },
- n" j8 {) ]4 q7 o' a: @};
# k2 A' _$ w! d# H, }' _9 `! F; b1 l" J
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {3 _- e `5 C1 L8 _
.leds = da850_evm_tl_leds,+ Z/ Y! i4 b: B9 t8 `
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),# G* V2 F4 j$ c3 s1 J9 {! U; v* Q
};
4 ]3 P6 N+ c8 F7 G8 Y5 E. u8 ]/ h2 J! F
static void led_dev_release(struct device *dev)5 @! K7 C, ~4 i6 x
{
8 v$ j, {' ]( {) E};
, v/ B7 ~. o/ h' U# I+ w: m! U, S9 t6 F
static struct platform_device da850_evm_tl_leds_device = {5 e: W% B& e8 G: D
.name = "leds-gpio",
3 r" g. L$ h. q5 g h .id = 1,
8 D8 Q5 y6 y7 j1 q% M, w .dev = {' T" T9 E( i" o4 v6 t" @
.platform_data = &da850_evm_tl_leds_pdata,
& n' L! T7 x' z( `* \0 H .release = led_dev_release,; n5 N0 t4 P2 }( f
}) ~3 o) Y Y: y: H* g: h. }7 c
};; _ Z5 t! M+ m+ ~: S1 I" l: I
5 E# z. E5 V2 dstatic int __init led_platform_init(void), I' \" l/ S3 T: z. q" S
{
$ I* l: w ]4 x% u int ret;, `, h1 H) e _( g2 e# j
#if 03 ?/ e% ^- u0 U+ p4 R3 ?. ~. W0 R( V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
1 a; p6 m! {, w3 n1 U4 h; U( k if (ret)
( W+ i' S7 l) n* m1 a" w3 } pr_warning("da850_evm_tl_leds_init : User LED mux failed :"5 ]3 \2 C {( k: Q3 F6 Q
"%d\n", ret);$ O: Z, I x- L, t* f& u2 n
#endif; D0 @3 f, f) r" \- K7 k& a$ o; a
ret = platform_device_register(&da850_evm_tl_leds_device);+ K. B1 C1 I$ c( |
if (ret)
7 w$ J6 @# E( r4 F, S2 f' q. Y pr_warning("Could not register som GPIO expander LEDS");. r' T# R8 W6 v) I2 J& [
else
* I, |- J Y6 D+ J+ _( C8 E printk(KERN_INFO "LED register sucessful!\n");* H9 J' ^6 h7 M& M
7 v; d. K% X7 D- }
return ret;
. u* j, u1 S0 ]# W0 a}! s% V2 _7 i8 D% Q4 P9 Q# U5 B3 P# T4 k
2 t7 \% `: |5 s; [3 Z# `
static void __exit led_platform_exit(void)
2 M* q% R) n4 u3 M4 g{; q0 e2 c1 K* W7 U
platform_device_unregister(&da850_evm_tl_leds_device);" o6 T1 k3 a$ Z/ h9 d8 C* L4 B
$ o: e( R% r( e( i8 o9 y2 K+ j
printk(KERN_INFO "LED unregister!\n");
! f: ]! u: `( F6 I}
- Y6 Y. S+ q% o: r) F9 V" z" f) s+ M7 F, k% N
module_init(led_platform_init);1 n0 x2 L% _0 l" }" ?
module_exit(led_platform_exit);
0 [7 H/ }8 V1 u& U7 d6 w0 k: H+ @# t5 i: h) l
MODULE_DESCRIPTION("Led platform driver");0 d; Q y$ T% j; J
MODULE_AUTHOR("Tronlong");; @. ?" W) l. B. f
MODULE_LICENSE("GPL");) B/ ^2 ]" v) V3 \ J9 ~
( J- g4 G7 T* M( K
|
|