|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
) s. n3 Q" {( Y6 K& |( o#include <linux/init.h>
% P- m |9 X6 F+ e7 P2 f#include <linux/module.h># i& p% C% @4 Y* c3 O" x% D
#include <linux/kernel.h>
' n, C0 z- Q/ G* }#include <linux/types.h>4 ~5 U" e% C& N4 M/ @& Z0 L# s
#include <linux/gpio.h>
; e' z' K7 N0 v; Q% J' h2 O- D( X#include <linux/leds.h>( m }' z, ]& f8 h0 Q1 H
#include <linux/platform_device.h>% l: ]* T& t5 ^) H
$ ^* }: {8 Q5 Q6 k3 v; y* n#include <asm/mach-types.h>8 V ?' {3 g: F8 ~' Q% e: d( T
#include <asm/mach/arch.h>7 ^" G) Z& J: O e3 z
#include <mach/da8xx.h>
$ k% t5 Y4 j$ c7 t3 J#include <mach/mux.h>
& n% g0 |: T) G$ m' {
- ^( O/ f* f$ w' {6 P s#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 d' @ i9 c0 B, t/ w6 z# b
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
! q3 w( `. R) ^#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! |; {0 }; G& q/ a" B9 s
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)5 Q! c0 a! F9 ]0 ?
* K( J& G! e3 \; a
/* assign the tl som board LED-GPIOs*/. a! B: \- F0 A
static const short da850_evm_tl_user_led_pins[] = {
* \3 [ c- Q( M* {# e+ J4 W /* These pins are definition at <mach/mux.h> file */+ V& h7 o9 {- n9 _, s, J, w# ]( I* W
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,/ m" b3 r% X8 B+ e
-1% `6 [$ I/ ]. c' G' K8 W
};
! P8 `2 ^+ a# I5 |; b3 n7 Y( N; r
6 @* M6 G" r' w( K" t b8 T$ xstatic struct gpio_led da850_evm_tl_leds[] = {# u8 [! y" R+ b* O( O
{
: Z( a8 G2 X" s- F { .active_low = 0,# D$ P. E. [* f9 V1 ] g
.gpio = DA850_USER_LED0,
! W6 C6 `- H0 q- T0 T* R* G .name = "user_led0",7 G9 z' I& h6 Q5 b
.default_trigger = "default-on",) B1 A( l# p/ S& ^, C. N
},
$ n% ?6 X+ G8 r) ^. D1 w {8 s+ M' M* Y: _3 g4 F& x3 G
.active_low = 0,
& b* ?* D9 |% Y/ e; ?4 M .gpio = DA850_USER_LED1,) t* \# m+ Q/ p, j0 I% T. M
.name = "user_led1",
9 w. K" Z& j; X. N! @4 ?* F .default_trigger = "default-on",
$ }6 S9 r9 C" \% N3 t },# m P& n a4 n+ H3 i( P' x8 y
{
4 T& }4 y1 y# t, g5 P7 D0 S$ u6 s .active_low = 0,
* D5 M3 d ?0 t1 z3 q v .gpio = DA850_USER_LED2,) L! A+ }9 j# p6 m$ i9 q9 ?8 M
.name = "user_led2",
% f" ]+ ^! z u' p. M( e .default_trigger = "default-on",4 _$ Q, s# K2 T, j
},# u1 W% q* Z9 Q8 K
{
" m0 B1 z2 G- R. P3 T& F9 [+ n .active_low = 0," E3 g" C1 j3 T, H& `& f) X
.gpio = DA850_USER_LED3,' o( T% F, T. H% p
.name = "user_led3",
g y; |( A7 B- V+ W .default_trigger = "default-on",
0 M) V- P+ w0 k3 k) W2 g% O },
r- L d9 `1 d8 Q" l};
2 q$ F4 ]2 z# i
" h) p" e# x$ S; Fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
- [' G1 ]8 z: G! F .leds = da850_evm_tl_leds,
& e$ Z. s: W2 o6 v* }; u" j$ | .num_leds = ARRAY_SIZE(da850_evm_tl_leds),6 ^) @& y; X) q8 D# Q6 h
};5 u( |- I8 L9 \, n/ q
" a* d! d& V& l' y5 }2 {static void led_dev_release(struct device *dev)7 s- `! l, v2 m3 v3 X& F
{
2 b5 B; V- W% [/ c) c) U" _};
9 l7 S" h& {8 h1 b0 M
/ g0 \8 F, @/ A: Q1 ~static struct platform_device da850_evm_tl_leds_device = {8 x, S$ Q# T0 U7 K- C0 O# A
.name = "leds-gpio",
8 F( W A* y% e! i- ]2 Q# n .id = 1,
8 I4 ^- i- Y& \9 g .dev = {) T4 }0 V. `) m+ f. S7 c9 K* f) h
.platform_data = &da850_evm_tl_leds_pdata,+ Q+ g5 P: | O( a. G& r8 X/ p
.release = led_dev_release,
* d4 D2 D% g1 ~% u% e }. \4 b9 k+ r2 n/ |! n# l
};! i( g% v4 y' ]/ f/ E, @9 O5 @
0 M) [8 O. X8 q% ]4 B. K
static int __init led_platform_init(void); \$ Q! q1 \) j: V, `
{+ Y# G6 p/ d1 ^1 T# ^1 K4 _: A
int ret;
/ X+ s+ C( _5 I#if 08 \/ W! G7 E/ d0 Q" G7 Q; j) u
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
& E( w( N- |7 K) Z% n% i if (ret)# T( h1 [- M/ |; x
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
) n l- R b( ~' V7 E! }; z3 Q, ~ "%d\n", ret);9 n+ y7 e0 Z- w9 r' | h6 G
#endif3 X7 {# s# B7 n
ret = platform_device_register(&da850_evm_tl_leds_device);
. {! J* u( o* l! H5 B if (ret)- ?4 i# \. ^& T7 J3 F6 ^) i& l, J
pr_warning("Could not register som GPIO expander LEDS");
+ ~3 h8 g" R* v# e( _ else
! `0 V4 m8 c9 H0 S) ~ printk(KERN_INFO "LED register sucessful!\n");" k+ X& r! T9 d! i" X& i) K6 q( d
' z' a" }/ {% O3 d6 l
return ret;
+ y. Z5 d/ c' ?+ |+ D" Y B- X0 L8 H}" ]5 a; v4 n6 v, u6 c8 U4 P( [! j- q
# Q( ~4 O# E8 |5 Tstatic void __exit led_platform_exit(void)
1 O; @. {3 ]4 E3 N' J9 e{
7 L! G1 z' s P) b9 h4 r platform_device_unregister(&da850_evm_tl_leds_device);" {' g# o g8 C/ n! H: c
, M9 k% y+ B5 X4 o7 ^4 F( q# G printk(KERN_INFO "LED unregister!\n");
4 g$ O3 M: {7 W}& h+ J3 o* w3 u4 I0 G8 m4 J
; ?/ J5 Y- H/ gmodule_init(led_platform_init);9 z; A& z$ V* O- M' l) R
module_exit(led_platform_exit);! O( C# S# H0 U! N1 K( A
( ]( [, A3 V/ W1 J# a* s1 {
MODULE_DESCRIPTION("Led platform driver");" q* n4 w0 x8 ?
MODULE_AUTHOR("Tronlong");
7 |+ w0 r# q q5 j% A3 hMODULE_LICENSE("GPL");- ^+ g$ \8 ~7 N) I( v3 M
! i2 F, q& c" J2 f7 r |
|