|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
8 n- x; }5 a8 v3 \+ d# @; d#include <linux/init.h>
: X( l( e$ b+ G g#include <linux/module.h>" p3 ], v: G4 l5 K- ~7 k: q' L$ L
#include <linux/kernel.h>
8 e. G) W, F$ q; Z! f% R1 e/ k#include <linux/types.h>
: u% Y8 L$ W2 Y#include <linux/gpio.h>; p3 [* L! r4 v- w2 V4 N! u$ h! w- G
#include <linux/leds.h>
! U- e N( x3 d#include <linux/platform_device.h>
5 a2 t0 h! G! b! l" n: Y. l) T# j6 E% f
#include <asm/mach-types.h>
$ |" I1 p' t1 {/ Y#include <asm/mach/arch.h>
8 y$ u8 J+ U# X4 x8 \$ P#include <mach/da8xx.h> i( B8 @1 k, m, R/ n
#include <mach/mux.h>
& X9 C3 l7 M1 j4 E" E+ H4 @
4 ?, S v; M1 _. |, ?# ^, r7 y#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 }$ m2 t. I2 ]
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
7 L/ X9 }# b% q; R5 z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)% X3 U5 V% z; M5 E
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
( C) b% {$ m7 m7 Z5 o- k" L' y' v
/* assign the tl som board LED-GPIOs*/
! X1 L8 m! A0 z- ^4 xstatic const short da850_evm_tl_user_led_pins[] = {
8 R! v q/ k7 z+ [/ Z /* These pins are definition at <mach/mux.h> file */. k4 X5 g* x1 s
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,% _; B: g/ @8 z% _, d
-1
+ e3 f& ]8 R& g7 B. G};; \+ e. c& b, t; `; U; ]3 E+ ?5 {
) B" }8 Z9 ~, `7 r* B6 R1 bstatic struct gpio_led da850_evm_tl_leds[] = {
- d' r, K. |9 p" _$ S {
. B* i: Z9 O/ x- m8 S .active_low = 0,0 Y! j* T# w; j; `/ t' b
.gpio = DA850_USER_LED0,
$ @! B: j1 c4 {8 z .name = "user_led0",! C0 o; X3 ?5 i9 [; g" V' K" H/ _
.default_trigger = "default-on",
) A: x3 C$ w2 \0 K4 h# P },! z1 `) u8 \ T6 {6 j. ~& S: w6 a
{: z& J( }$ |, P
.active_low = 0,
! O' F0 E$ m( D" O) C% \$ W .gpio = DA850_USER_LED1,
4 |* {! L* v2 T- m .name = "user_led1",
' K3 A5 L+ W" ?3 ^% b5 i L .default_trigger = "default-on",
( v! w. K* U% w },! O3 l+ P9 M& H5 u
{/ x3 F5 C, k- O8 @6 k4 U0 C& W
.active_low = 0,
" {( |- j$ Q; \3 L .gpio = DA850_USER_LED2,
3 w5 F! i, A1 p3 i- O, H* o! p .name = "user_led2",, G; p/ t% X* Z/ B
.default_trigger = "default-on",
1 ]! Q* k6 t7 K+ W },. _" [4 o' i9 {0 e% B6 `: ]8 N! T
{: U4 n; @% E, `7 ]0 L, h' F
.active_low = 0,( Y: k+ H5 |2 M; N" i# N
.gpio = DA850_USER_LED3,
* T, A R8 j2 R; o/ n/ h .name = "user_led3",
- W. b5 g) N0 e' X0 B .default_trigger = "default-on",
1 e7 v/ i1 ^, z6 ]$ x },, @% k4 }% x+ \4 t( ]7 ~ l
};
3 k) o" r/ z1 g" L/ A9 ]) p# B+ i7 @
1 @! n% S: N. w, Gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {8 v$ i4 W2 z( h$ L7 ]
.leds = da850_evm_tl_leds,/ A1 G+ N% F) T6 O6 l7 F
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),; k6 j* V! x: G, W' a$ X
};
, ^- G @& R3 X4 M+ ?5 b2 @# w& J4 O- A. Y2 d
static void led_dev_release(struct device *dev)
. G, c" }0 L/ V. p5 X$ f{
K: H8 `5 ^0 T. A. G};
( v# r N) m. o- t: n# z* g* U- D% \# X6 ^+ `9 g$ E/ I2 N
static struct platform_device da850_evm_tl_leds_device = {7 a" ~% D% e; l# u! r4 X
.name = "leds-gpio",$ i A3 y6 g, P, s& h/ j% |
.id = 1,8 S3 z4 p9 s% h( W- U
.dev = {, W* r: I9 w' Z% T, m9 |
.platform_data = &da850_evm_tl_leds_pdata,
2 v/ P; x" ^3 n, ^# ~: ^# \+ A .release = led_dev_release,
0 G. r! W/ b2 C }
# f# t2 k% u' L7 E8 g- U};7 K' a8 c, l( R9 `/ `; X
9 U2 V7 [; T! c9 F
static int __init led_platform_init(void)
) V' [ n9 Y- S& Y2 r& w0 D! K3 k2 `# m{! x3 | p8 O5 N
int ret;( ], B0 a. k1 f5 t' A, I
#if 0" M9 q6 v7 a2 S
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: F+ s" v4 l" F# S8 t8 Y) y
if (ret)
" F1 w6 H2 j# l5 W4 X0 N pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
) \! W0 x+ ?3 X( T" |8 t8 e c4 R "%d\n", ret);
1 w& }- e! r' q- G* t#endif
- |# z" [% R5 h! H6 r+ n# | ret = platform_device_register(&da850_evm_tl_leds_device);4 v$ h( X' f2 _" ?5 r
if (ret)! F9 p6 w7 E& y& P( [
pr_warning("Could not register som GPIO expander LEDS");
/ O" _, B1 L6 g- V; B0 Y; z" F else
0 H) T, X+ e8 _# Y. v3 g. q printk(KERN_INFO "LED register sucessful!\n");
; i6 c; c0 Y+ ~
; f7 A/ V; g+ S% u! D return ret;
) c, M! h+ u1 B3 A}
) I$ T1 J' b( Q2 X- L
! v' U$ i. ?5 E# {1 j) Ystatic void __exit led_platform_exit(void)# G/ d* }! h1 K; p
{
0 g0 n8 B) k3 r' u7 L g& n platform_device_unregister(&da850_evm_tl_leds_device);
; A# D1 o' C, R3 B( T! ]3 B3 M2 F, N
, u. q1 e+ [( \' Y, C0 o printk(KERN_INFO "LED unregister!\n");
5 Y, |6 ~3 u7 \4 H( R. {}
) b. z4 ~: T5 o* |$ {/ u4 N5 I: V) t; m- y
module_init(led_platform_init);
' S$ x1 g/ [7 p/ @: H0 n$ fmodule_exit(led_platform_exit);
: |7 [+ s5 M; y4 x
" T( P1 [4 i- B( A# S+ `$ T- y$ Z' I. T! yMODULE_DESCRIPTION("Led platform driver");1 @* a4 S3 Z% |7 z
MODULE_AUTHOR("Tronlong");7 D% U/ o. U) E
MODULE_LICENSE("GPL");, X/ g) G7 h2 b o
( N/ p3 |( ]0 @ W; b) `7 A |
|