|
|
求大神给下面的程序做注解,请稍详细些,谢谢。4 ~4 S* S; |+ f4 \, M
#include <linux/init.h>; P. }- a+ A' i/ z3 U
#include <linux/module.h>
2 K ? x# T0 r' X#include <linux/kernel.h>) h* O; e% m8 v% j
#include <linux/types.h>
$ P& f2 t: S* v0 l; K1 N#include <linux/gpio.h>
/ s Z7 a# r9 T# }# n$ s#include <linux/leds.h>
1 A$ q; W2 d/ u2 h! H#include <linux/platform_device.h>
( [# Q0 e; r8 m8 Y+ o/ w! M6 H' H1 y
, F) F) k Z. r' W3 P#include <asm/mach-types.h>
- k: u& h- m6 {8 w#include <asm/mach/arch.h>
0 _5 Q0 x; O/ i6 O5 P#include <mach/da8xx.h>5 \# P* d& k/ P+ ^
#include <mach/mux.h> i$ q" [* q7 H: e% Q, R
6 X* i$ R k; L1 a7 V
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" F2 _& Z6 E' |. k
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
2 Q+ }! `# s; Z7 M3 e2 o4 W. d3 ]#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 i% }# ~7 {2 R. A#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 M1 U; c; c/ p( m, M& g
( e' U- T8 E1 f: w7 e$ Q; X
/* assign the tl som board LED-GPIOs*/$ J4 p2 r$ f& Z. N' F( b
static const short da850_evm_tl_user_led_pins[] = {& S5 j6 O$ q% R: @
/* These pins are definition at <mach/mux.h> file */3 c; P/ c4 j0 o
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,6 x( F* A# t+ S/ \7 L9 e- s/ n1 P
-1
" r$ H' l& a* A: g};- B5 }* D$ I3 B7 y0 e6 s
1 q1 [& E7 [# z/ K4 i
static struct gpio_led da850_evm_tl_leds[] = {
) v- W/ o3 c/ w {2 O' k8 U' j$ n, K- n$ ?
.active_low = 0,
- [5 M! L- u6 Y% r4 G .gpio = DA850_USER_LED0," U4 k! B' Y v. g: R9 Z
.name = "user_led0",
i! y5 i# k2 M9 B( | .default_trigger = "default-on",$ |1 o R0 A* I, W: L. \
},$ X0 k8 d4 k4 `8 M" a6 {
{
* l/ c! U) b/ Z. r$ x( d2 y .active_low = 0,5 J' @, F q+ W ^, d0 E0 T P, Y% m
.gpio = DA850_USER_LED1,, y. q7 ~" h( [1 q# a
.name = "user_led1",% _# g+ ]1 Y: L1 U3 a% n1 g8 O
.default_trigger = "default-on",* @& [9 m( J4 t! J
},+ `& R9 t6 l8 y, G: j2 X
{
: d1 B y+ N/ t; v( ]% U .active_low = 0,
9 T0 G- {( f, X .gpio = DA850_USER_LED2,: i! \, T! }8 F5 v2 ~+ R! K# S$ V9 F
.name = "user_led2",
/ }" K1 m; D4 b, C" R7 I4 Y% O .default_trigger = "default-on",
* p- |( a% C7 ?: a+ _& G9 m4 s },1 W4 C# A( d) Z$ B# e4 k3 t
{" ?6 p6 _, X4 d: b& ^$ N; ~
.active_low = 0,9 J3 p$ x2 Y% Q# C* w
.gpio = DA850_USER_LED3," X5 E! N0 f* h, F
.name = "user_led3",2 |! H9 {% W; ~/ U
.default_trigger = "default-on",: {2 R& C% n0 g* Y2 [6 b
},
8 b" e! x3 j- O8 r, G/ x3 O1 L9 \};* \: e2 h* g0 U$ w4 p% s! `
' C3 i: T* b3 B- V1 W5 T
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
7 R4 C, W9 O# ~7 } F .leds = da850_evm_tl_leds,
9 L3 f0 d- ~9 B2 f( ^! K/ L* F5 U .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 L: d3 N: X4 N/ M};4 _6 u* z9 ~' `, E" h1 C6 x
2 \' n" t6 N( X* a9 ~
static void led_dev_release(struct device *dev)
, y0 l$ D0 I( s/ v% h{8 H) |0 Y7 ?6 L! ^4 R
};
8 S. M6 d) `0 {3 N1 [0 u1 u1 _( I4 c
static struct platform_device da850_evm_tl_leds_device = {
+ R# Y+ @6 A! A5 ?7 m; Y .name = "leds-gpio",
5 H1 W. `9 a$ G# s .id = 1,
3 L9 z; s( Z' s: J0 Z .dev = {
$ l* |* |( n7 t) ?" \: c0 x .platform_data = &da850_evm_tl_leds_pdata,5 V8 h: S2 T% a9 h
.release = led_dev_release,; L: H, E4 k' G. l0 m, p
}1 z. H4 Z: ]; S3 j
};
$ t; r/ K, _; d; Q B% F2 P' q9 a& T! u8 O
static int __init led_platform_init(void)/ o- N+ d! \3 B
{( j* v: u/ u$ C4 t) w% `5 K
int ret;
4 Y" [' M5 [& w* r+ |#if 05 L+ X2 V9 _1 \7 M4 ]% i6 I. C
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);4 \8 m+ ~! O! @% w9 C/ a# p
if (ret) k& `- Q8 w/ n( X$ P. T. ^2 J) O
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
3 g3 Z* r$ A5 B" f "%d\n", ret);9 z0 l- v; r. ^5 l" e
#endif
% f- O \8 O2 _2 g9 q ret = platform_device_register(&da850_evm_tl_leds_device);6 W$ [ A! V! F
if (ret)
. X, K& S1 n2 D3 z A pr_warning("Could not register som GPIO expander LEDS");
4 m: q- T6 w$ r; G l, M else
$ X$ n& K! o5 w2 u7 d2 u+ U printk(KERN_INFO "LED register sucessful!\n");
3 {- U l0 w5 ]8 i) L1 g+ R
8 U1 F+ L. K2 q return ret;
# r" e D# c* I}; C% W( B, q, w/ c2 G# x+ h
7 b1 C/ \- T; V( ?
static void __exit led_platform_exit(void)1 X, t$ T% g' Y9 }6 R
{
3 i7 V: _, F5 T0 k3 p) P9 P platform_device_unregister(&da850_evm_tl_leds_device);" x: Q% v _% X6 |, H; y
% C$ @3 L: F0 T6 y2 k0 o. ~ printk(KERN_INFO "LED unregister!\n");9 `6 _$ @" F) Z' j7 @- d; C9 a7 g, {
}
# k' d3 n7 n' t9 h' P: H4 e7 @
6 ]: |3 b* D0 }6 Umodule_init(led_platform_init);
- r( m3 Q- Q1 Pmodule_exit(led_platform_exit);
! ~2 ^( O; A7 |: v4 \8 C4 Z
8 { g; u: O5 S8 g# |MODULE_DESCRIPTION("Led platform driver");
( @2 J8 r* N$ H1 j7 a2 |, ]# t; qMODULE_AUTHOR("Tronlong");
1 y) q2 J5 w3 b! GMODULE_LICENSE("GPL");7 t6 q4 b1 m: U" N5 z( g. I1 g3 r
7 k0 \- ~8 v3 ~( |7 j
|
|