|
|
求大神给下面的程序做注解,请稍详细些,谢谢。3 `5 [; I J* J+ p& v; E3 t
#include <linux/init.h>% d- v1 N4 A1 Z, A
#include <linux/module.h>* h( K* L' L& ^: H4 s( K& e
#include <linux/kernel.h>, q3 i( k$ i' W6 b; t9 b* X
#include <linux/types.h>
8 W( o: w$ t% q* s9 M6 Z#include <linux/gpio.h>6 d9 W+ R8 G7 v+ u% a6 [- v/ \
#include <linux/leds.h>
# p" N- k7 }7 }# }, S& k" b#include <linux/platform_device.h>2 i( q* k6 _0 B$ K2 N2 p
; {: Y" b% t' f- y
#include <asm/mach-types.h>% P2 _) x; ^8 x# D' [
#include <asm/mach/arch.h>. H6 ^0 Q) C, u4 s C2 f
#include <mach/da8xx.h>% o5 z) ^- `, T& T6 w: W7 T
#include <mach/mux.h>
. Z" l. V; O! @* V- {. L7 w/ J# E' y, Y0 K( {. P! J8 }" [3 @
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
" N" S/ f& G6 [/ N- \#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
8 ]; I7 j H5 _#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)0 Q2 I9 L9 G0 l" w: E2 h) e
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; |) l- O6 V0 M. V7 Q
5 X/ }, q9 Q2 s% b- H/* assign the tl som board LED-GPIOs*/1 `# i, p+ v1 k/ r |9 e
static const short da850_evm_tl_user_led_pins[] = {
& Q7 n& L' @& h* Y9 j /* These pins are definition at <mach/mux.h> file */, R* k* d+ e/ f* j0 Q0 Q2 W5 I
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,8 N8 u( M) L, u7 j8 W0 {0 l
-1. \$ a2 Y; y9 o
};
: s1 u! t! W& E3 y9 w2 Y. \$ D. _- K, O- P! W1 d! k( u
static struct gpio_led da850_evm_tl_leds[] = {
7 k8 w: I/ a. x" |2 u3 D# s, J2 L" r0 i {$ w; S- m' ~% v8 i, m
.active_low = 0,
3 p: \( \# ]+ Z1 A' C2 D- P .gpio = DA850_USER_LED0,
% f; e% D! Z* |2 z" Z! Y1 B .name = "user_led0",
& |* u. ^$ a' P8 y& G .default_trigger = "default-on",; h: V1 Z+ q& P: y/ y/ r8 ^$ n9 O
},
/ @8 j2 [; W2 E2 @# F! R {" `8 o1 x* @. a b9 i, c& V G$ n' ^' \
.active_low = 0,7 R- E% F3 W4 f. p i$ ]
.gpio = DA850_USER_LED1,
: l+ B+ \8 |2 ? .name = "user_led1",
( w H7 u6 P7 R, d Y \ .default_trigger = "default-on",
, D* p+ d9 a7 Z1 M" W },
8 O4 ~3 K+ Z! _3 c {
) ?5 J* `& H3 B9 ] .active_low = 0,7 s9 z$ n7 Q/ m( P) J% C
.gpio = DA850_USER_LED2,4 |, l4 l% m" d! n$ q7 B
.name = "user_led2",
" V- W3 _ F7 f8 s! ^" G3 m .default_trigger = "default-on",0 B |4 d" M5 p# m
},
+ ^) L1 h+ M1 {! \ F% t' {& @8 _3 ] {% V+ M( R2 f+ `
.active_low = 0,+ Z/ U S6 _, @& Y
.gpio = DA850_USER_LED3,
" g9 N' E% a2 |/ b6 b .name = "user_led3",
( e! M- d3 L! a. k6 m; S1 ~ .default_trigger = "default-on"," b9 D$ _0 P0 z9 V2 j8 V$ S4 p; ^
},1 p3 S/ c0 r# i
};
: h: y/ o! _3 M. [/ S9 L
' x& [4 t* p& Ystatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {' q7 \6 I& S$ z, ~: D
.leds = da850_evm_tl_leds,
0 r1 o0 V9 j7 `2 ?: o5 J4 D1 N4 U3 Z .num_leds = ARRAY_SIZE(da850_evm_tl_leds), w5 n R3 D3 E2 D8 c9 R9 Q/ P
};
$ y4 g. `7 S# D1 G8 c
% ~2 Y/ c# v7 B0 n! C; Mstatic void led_dev_release(struct device *dev)
7 i' K: ^! p2 ]) N; m/ K' F{# h) b: }- E- N/ y' o7 y
};
/ a! \- @2 b% n: v0 Z+ K' `& H7 w2 u1 j0 m- x
static struct platform_device da850_evm_tl_leds_device = {
7 `$ z4 _1 c" o, H .name = "leds-gpio",
0 s. S" f! d5 n: V9 m .id = 1,
+ v/ A: t! ^( Z! v. @ .dev = {
. R1 ]9 a! E- Y .platform_data = &da850_evm_tl_leds_pdata,
: {, |6 W. n L1 T! l0 V .release = led_dev_release,
3 M6 y$ x1 d( J1 y7 k; x" h0 @ }
! N! P. ?9 k' Q+ J0 S4 w};$ }, N& ]; t: ?( r
, ]. T" F# E2 w1 l/ wstatic int __init led_platform_init(void)- |" x. ~: J. c8 b; I5 c; x
{
) `6 i# A: ~' R/ q8 i int ret;
/ P% N6 v3 K/ m6 C; P* i% @/ ]! j#if 0% y/ e f2 G v- m2 V1 L) M
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: Z- A6 }1 [" _6 Y, e
if (ret)
8 {/ h' D& W. _# G pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 F% B5 t( }. f6 m! |; N$ M5 z8 a
"%d\n", ret);/ v# p Z. ]5 ]7 c
#endif/ X) Y$ a+ P( c2 l0 V
ret = platform_device_register(&da850_evm_tl_leds_device);, W" P* c9 _! e
if (ret)
% h0 o+ i% S! F1 p pr_warning("Could not register som GPIO expander LEDS");) L7 u g/ X) [1 M
else1 `" B( n( Z2 L
printk(KERN_INFO "LED register sucessful!\n");
8 j0 Y' _% \ ]! T3 F* f- _) k7 K0 C7 N( t) g0 h
return ret;& V( k* y3 l" N7 e f2 i! I: h; \
}
3 b% d. L- b% q6 D3 N9 m- Q" T% E0 `& }* L
static void __exit led_platform_exit(void)$ n' b; S- A! m0 _2 Z5 [
{# \4 {" `5 C) F! o4 B+ ]8 c6 M$ _
platform_device_unregister(&da850_evm_tl_leds_device);
" R" S2 H: Z e% W
8 u! d/ z7 g! z1 U9 X) j( L printk(KERN_INFO "LED unregister!\n");
6 o3 |: o h% d2 }9 V- I}: Y: a$ o' L5 j- G6 D
/ j( B4 @3 i& \4 Y$ {- M
module_init(led_platform_init);
: m/ R8 l+ |2 l$ e; s. M' `8 bmodule_exit(led_platform_exit);
& i9 Q" w" T3 A1 E
, Y5 U: Q+ y' m" PMODULE_DESCRIPTION("Led platform driver");$ ^5 M+ X' U9 P
MODULE_AUTHOR("Tronlong");2 p4 m1 Y% o6 Q$ N
MODULE_LICENSE("GPL");- R# @) }! X' y5 I, k' p, N' _; V
3 B+ P( i' h, q5 L |
|