|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
+ P, U) o7 _4 F#include <linux/init.h>
: ^# z2 b0 Z. E) Z#include <linux/module.h>& g* M% H- V6 u, C1 E
#include <linux/kernel.h>9 } z: V* ^* e! s% V' s7 s
#include <linux/types.h>
( h% n7 a! d$ ^' \#include <linux/gpio.h>
\/ {' a c, O4 x. V# V; X#include <linux/leds.h>
: }& a0 A" O* s' m% W2 Q4 N; V: N#include <linux/platform_device.h>
1 s# k% s# a2 Q% w/ x) o/ L7 U
$ Q: b; X6 u7 n, b v#include <asm/mach-types.h>, g+ Q- {4 {9 H1 J3 M
#include <asm/mach/arch.h>
- S% i$ g; k8 e, V0 D#include <mach/da8xx.h>: X( }# e- m. p0 k4 \9 h
#include <mach/mux.h>
$ P9 a& j b# {5 n7 ~+ n& G
4 R; l% ^$ v$ o7 y4 B7 ?4 C#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 A9 r/ I m- k( J2 C% X& D/ [#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" _9 M! s) @, J% c6 `5 o#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)# h$ I: k2 M) l! `6 o
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
. Z, u' j5 \0 G; K9 k9 @3 }, N& {& \7 Q k
/* assign the tl som board LED-GPIOs*/* V1 Q0 a5 `# J0 C! q
static const short da850_evm_tl_user_led_pins[] = {
' t) z/ q C( Q /* These pins are definition at <mach/mux.h> file *// N: z- D; ^9 u1 R5 F% K
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 J6 a' T" R0 w! G, Y z
-1/ H: j6 k: k Z, V6 v
};4 [& n1 d2 R8 w3 |4 _) o. j
' t: w4 y8 S4 o
static struct gpio_led da850_evm_tl_leds[] = {
% d, W0 U3 P( f$ U4 O- f r {0 q: k6 R$ [7 a
.active_low = 0,
6 A# R" x% a- p9 j0 ~) A .gpio = DA850_USER_LED0,
1 N# j* }; B, K: l, X .name = "user_led0",4 {' J# b7 G l) G) x: D- r( O
.default_trigger = "default-on",
- k- F0 x9 t6 a5 {" j& F },
# x5 u7 A" b. v" Y {
$ _. I3 y2 m+ K) E' s; L" J2 { .active_low = 0,+ J+ K3 |& e4 I. q
.gpio = DA850_USER_LED1,
3 b' c; E- i. _) M. c( c .name = "user_led1",
8 r& K3 c7 \$ t Z& f. e8 a .default_trigger = "default-on",# o9 C$ I. u. s- x6 o3 \
},! i) h A: P; }/ N
{
s& i+ Y, S" s9 h( n .active_low = 0,
: P2 y* E, W& c+ K/ w .gpio = DA850_USER_LED2,
5 B) y! @% C+ @9 t$ b9 R$ m .name = "user_led2",( N; Q0 x: {8 R5 @! H7 z) _
.default_trigger = "default-on",
! k* O, F4 X. y3 ? },9 j! h9 S/ z6 O1 W4 j
{
4 S. u* x! z9 ]' u! f .active_low = 0,: v6 c0 a _$ J6 }" ^, Z
.gpio = DA850_USER_LED3,
& r$ R+ H8 {: F: }4 I .name = "user_led3",! z6 W& t/ L' C# l. Y+ v$ Z
.default_trigger = "default-on",9 L& g7 z; M& s& T h. o# Y
},
/ Q; }1 Z( Q& u( ?1 o1 g) F: h* [};
/ p* d* Q' X1 X% o2 [) @+ y* w8 a. H3 A: N1 q0 n$ R% H! O
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {8 ?% `4 w$ n$ X* s, A' R% \& h
.leds = da850_evm_tl_leds,
. B, W: @$ Q' w; h .num_leds = ARRAY_SIZE(da850_evm_tl_leds),+ D* E% a% {, r m
};2 A& ~2 ~. M& \7 m- D/ {
" N0 w. d7 U F& g: m
static void led_dev_release(struct device *dev)) L! [3 [$ {' r/ N* a! `
{
% R* M8 [( ?6 F1 {8 {0 j. s};- \! q5 F' n. o2 X: B
Q1 a/ Y& g0 T& n+ K& C; ]
static struct platform_device da850_evm_tl_leds_device = {
9 s' b# S( z! Z- e! h( N, ^" U1 h .name = "leds-gpio",
/ L0 t, t& D2 \ e `0 X& v .id = 1,
" b, g) w5 x2 A$ L; D9 y' K .dev = {6 k* q* }+ X) c" {
.platform_data = &da850_evm_tl_leds_pdata,5 U Y& k- J' x% F8 \, a
.release = led_dev_release,' m' r+ ^8 X6 C0 O' x# P, {
}
! j+ z/ j5 l/ l. z3 ~. f3 P};
2 F9 G3 ~& K4 O0 X4 M: H, m: G8 Y. G2 l2 M: J$ @" {8 J3 v$ Y* r
static int __init led_platform_init(void)3 u# @/ R1 A/ I# l
{
$ Z' L, h$ i3 W/ x int ret;
8 M J2 ^" r) T( `4 B9 G#if 0
+ Y9 ]% t3 r0 `) E9 j1 l2 ` ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);. l2 L0 h& E! X |8 P
if (ret)
7 M6 X1 `8 M) @! H; y% h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
2 S" b$ E9 [! \) e0 h- w* g "%d\n", ret);
5 K+ U$ ~0 G; u( G5 V+ d#endif- D* r' C) C3 x7 S$ ~& M: b1 v; B
ret = platform_device_register(&da850_evm_tl_leds_device);9 ^7 B6 O1 S0 c8 k8 ?- l. m1 ? L' f
if (ret) i# F4 V( h* Q% h
pr_warning("Could not register som GPIO expander LEDS");
4 i0 u2 a) C* H; B* T else
! J1 O! [8 R J! a5 ^) e4 O printk(KERN_INFO "LED register sucessful!\n");
4 H4 e9 y5 i. w4 N' |6 i' i0 O l- e! e( X
return ret;' H5 A$ x8 g3 H" [- U2 \
}6 o% d t0 J- B2 i" P
" q3 l& k. ]' q: Y; istatic void __exit led_platform_exit(void)
" S6 y* J7 E G6 S1 c2 q3 K{
( i/ s$ @2 J5 Z& V4 z platform_device_unregister(&da850_evm_tl_leds_device);# l/ @5 j4 W. C$ K
3 H! u( M2 a5 R2 k4 S
printk(KERN_INFO "LED unregister!\n");
( p' X. m/ c, h. r! a}+ a4 X. Z, v0 l, g9 b2 ^
" S. s! R. Y7 t: u# W, N$ O
module_init(led_platform_init);
+ f. {% B5 t$ | rmodule_exit(led_platform_exit);& V$ D3 z5 C3 b& X
0 j# R% G) L) e' i) Y5 E9 V7 t: gMODULE_DESCRIPTION("Led platform driver");
" y; \9 b4 u' a0 E+ `MODULE_AUTHOR("Tronlong");% _! C# f5 o4 L9 m* K' \, D
MODULE_LICENSE("GPL");' Z$ b7 l) A9 {
$ N6 Q3 O6 v/ c2 Y1 g
|
|