|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" ?3 h- u' }$ K0 {' }. c# D
#include <linux/init.h>
& \; f1 [( `- V: D#include <linux/module.h>; v+ B [, S' m
#include <linux/kernel.h>
6 T [4 f$ L4 Z8 J7 J#include <linux/types.h>. ^! i1 l$ Q; ~ f
#include <linux/gpio.h>3 ^* H2 B* a1 B( r- P
#include <linux/leds.h>
" Z6 m0 }; }5 ^) [/ n5 Y) V# ~) ^#include <linux/platform_device.h>
! X( q7 D: P( T' {8 C l& O1 L4 |# C7 r) l0 B2 A- z
#include <asm/mach-types.h>2 G2 X; `" g; N
#include <asm/mach/arch.h>) ~" F* j: i* D) p$ W
#include <mach/da8xx.h>9 ]$ U/ |# c0 H2 I5 F" a5 v
#include <mach/mux.h>5 ~+ n. c$ F7 ?' |
0 W0 y7 s7 ?6 B7 x( z
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
- D- n# H2 n$ T8 t' |) i2 H#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
& N3 s; [; O: w1 N& i3 S#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)* R3 U6 k5 z2 ?, z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
& J6 d% C: r6 ~, n0 k7 e: p$ j+ |: v* X6 u0 K b
/* assign the tl som board LED-GPIOs*/( R& F& y+ b' e; E. L5 t
static const short da850_evm_tl_user_led_pins[] = {
: ~5 v: k5 n$ j7 o6 J2 o8 s9 w /* These pins are definition at <mach/mux.h> file */0 ]* v0 Z# c! e6 G! y4 M
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,* X8 L7 U, r) f; G9 ?) e# @
-13 p; R) x: q0 K/ b& ^# ~: @. d
};% m, [# ` v" r: S8 |- B
( Q) K) V& e1 R; b* c! b
static struct gpio_led da850_evm_tl_leds[] = {9 a, {3 X2 D& w$ S3 b
{% e7 X6 ~: ?- [/ l& G! Y% `& S
.active_low = 0,& T0 A3 Z; [$ W5 b, T6 k
.gpio = DA850_USER_LED0,
6 a9 ~- A& }3 h/ O! M .name = "user_led0",2 y4 G# G, L! a* a
.default_trigger = "default-on",
D+ f$ B1 w G4 Q },
5 ^. V3 V ]% M$ q. n. x8 v {" q' f F Y0 \! d1 ^7 e; P
.active_low = 0," {! P1 i w, A1 v- y! u- M
.gpio = DA850_USER_LED1,
; l6 k0 M6 i" E# U* o .name = "user_led1",
2 ]0 @& Q0 W. _9 O& B8 A5 x( s .default_trigger = "default-on",
3 y$ x; m" K, |. v( F. F },% ]( R1 C: x/ ?. |3 [
{' L# G- m _& h' B( `
.active_low = 0," d' B5 s$ L# p5 X$ Z, _: X
.gpio = DA850_USER_LED2,
& L1 X4 @. Q% p! v( d# l .name = "user_led2",
7 t* h6 n& f9 T9 `( M* r2 n .default_trigger = "default-on",' f+ K) O1 f( }# A' J. |
},; i6 Z5 o& p: ^7 u
{
, x \: e2 @, b$ M .active_low = 0,
3 d1 N# a$ b7 \* n .gpio = DA850_USER_LED3,7 @' b% O+ i$ J# g6 Q
.name = "user_led3",
& T: i) k" ]$ [+ e' {2 { .default_trigger = "default-on",
$ m: D0 K! N8 E9 n! q },
8 l. A( E1 d* W4 p$ T! J' Z6 s};% L7 c: {2 e: f0 `2 @. `. S
3 p) q9 }. s* M4 U6 r1 k" c6 y
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. Q6 b! r; p( P3 Q
.leds = da850_evm_tl_leds,
7 a# ], {& r) ^# L2 Y# c$ j6 B .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- {# N$ f) C/ z t};
7 r" x$ f/ e# h3 [8 y& s+ U7 T+ k
5 r; p' ?" Z, y. `& {static void led_dev_release(struct device *dev)
S/ x$ w( \( p" Z, K5 K{
4 _/ F% ?. m6 Y- Q) q7 ^. v8 j};
4 P+ Z, o9 W8 L# |6 i: w" X) D8 R% [' _+ L1 B6 p
static struct platform_device da850_evm_tl_leds_device = {
2 R# u6 {! r7 {* r .name = "leds-gpio",
: i3 b! n- V" {$ p8 V, e .id = 1,
" e4 ~+ W* A# g6 |" M .dev = {
/ M' m; p6 p$ q0 b .platform_data = &da850_evm_tl_leds_pdata,: Q# ^+ G( _4 J" {: Y
.release = led_dev_release,1 w3 @" Q' P" ]1 j! o1 y! ?) C
} v5 p) R# d/ }+ I/ y9 E; \* r( d
};
$ @: j2 U2 G! F4 o8 ]4 L8 j2 ^ D! q3 s# R, p3 m$ }
static int __init led_platform_init(void)- N. U, g, t. b/ ], D3 k
{
. t9 Z' B# @" Y7 N4 ~ int ret;
* }% M. Q7 s9 M* B% C#if 0
8 }8 T, ~2 i* l s' k: x ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);$ M3 a9 E* `3 a7 Q
if (ret)
+ @) Q8 ~% k8 H* T+ l/ _* k6 [ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
: G; W8 C- n: U9 s2 S( o, y1 c0 N "%d\n", ret);
$ S3 e2 b; i2 U! n1 C#endif( }* ?: B# E( ]: A# p6 P
ret = platform_device_register(&da850_evm_tl_leds_device);5 k, y9 P& x: M# d$ o5 N2 h
if (ret)" g7 e" W) ]3 a) y- S
pr_warning("Could not register som GPIO expander LEDS");
5 o% |2 F) w3 m P$ M3 w" c8 P: c else7 x# j& p4 \8 C" c0 {
printk(KERN_INFO "LED register sucessful!\n");
0 r) i' A3 I* O& H' }; Q, \
/ O' G1 }! C* z( u/ l* D0 S, w6 r; ]/ N3 ~ return ret;
: w9 ]8 @* b0 _$ B" G}' e! A! J. F+ }2 C3 p# q
. n- H2 T7 i F% o* v( sstatic void __exit led_platform_exit(void)6 w3 P* W/ X U# \
{
$ @6 u( X$ m% u; D/ p8 Q6 E platform_device_unregister(&da850_evm_tl_leds_device);
% P& b, u' D1 Q, d, j3 f
! F5 y1 G. i0 M$ b/ \; v printk(KERN_INFO "LED unregister!\n");) @+ t! e/ e, j; ]) t r
}
/ ^8 n5 |- x" ~% W) w* L, Y; U; ^2 v) j7 C6 }
module_init(led_platform_init);: }( C, m; {( F0 R% _( k, i! }
module_exit(led_platform_exit);
9 U( Q7 S4 M: e- L; F2 ] I# w. Z7 y& [8 e$ i9 ?
MODULE_DESCRIPTION("Led platform driver");
' I3 r" e4 D5 ?& |MODULE_AUTHOR("Tronlong");5 ~4 C8 {; p& z" ]5 H8 o$ @
MODULE_LICENSE("GPL");+ c: E2 Z/ J0 z" f: Y
( D5 p3 x; B/ e7 r6 ]
|
|