|
|
求大神给下面的程序做注解,请稍详细些,谢谢。/ ^& Z% t; j2 m$ h
#include <linux/init.h>
9 {6 ^7 \1 v" @$ a7 D) U2 ?#include <linux/module.h>! n; O+ y) a/ C
#include <linux/kernel.h>
& q3 [/ g8 T4 O! k1 v7 H& R5 F M#include <linux/types.h>+ _& ^2 h$ h4 j2 E" z. p
#include <linux/gpio.h>
7 _- `2 p& _* T8 D% f6 G/ U#include <linux/leds.h>3 d3 g- k9 q8 D* Y% k6 s6 F) ~
#include <linux/platform_device.h>
% m" b8 Z# o+ j6 w8 T! w
3 {6 f' K, r5 y+ e& b; a#include <asm/mach-types.h>0 b. X, N; [! b* ?
#include <asm/mach/arch.h>
5 L( O$ v. U9 Q& \" z, E; R M( s' _#include <mach/da8xx.h>
9 i, _2 Y4 G' q& F! ]8 _#include <mach/mux.h> Y2 D: [$ y( @2 w, ^' q7 F- ]
: S+ C8 f1 F/ l3 h7 [
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
' I2 e: H, o% r7 O% v S4 R#define DA850_USER_LED1 GPIO_TO_PIN(0, 5), d3 J: r8 p( S7 |/ |" T# x
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% l4 C' K/ Y3 R$ b @, ^: x) e#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) N7 r) v; k( P1 `% s
8 ? k, g( o) _8 v& @5 W7 i/* assign the tl som board LED-GPIOs*/
w$ s! r( m: Z; y$ g2 Wstatic const short da850_evm_tl_user_led_pins[] = {
( S1 Q1 `4 g" M1 H5 u /* These pins are definition at <mach/mux.h> file *// w8 ]$ ]* p- i% [
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
& D: \" I& E& j# j -1
! J) k* o; z& ?2 s6 `) K, X};7 r. P# Z! x' C, T4 F3 {
& X3 G9 |* j. l" Qstatic struct gpio_led da850_evm_tl_leds[] = {
3 o3 U+ m; m# C% E {
H* [$ m) X. N .active_low = 0,
i7 p8 t9 w K& e. p+ ^( Q9 F .gpio = DA850_USER_LED0,. E3 U2 P# a% ]2 m/ X( c; J& [
.name = "user_led0",6 ?3 g. f& j/ S
.default_trigger = "default-on",3 i3 o8 }6 v- ?9 k
},
% X p8 B3 E8 [( y {
3 K* \! {" v3 q, q- G+ _$ s1 w .active_low = 0,- Z' f! f" T! E& t' V
.gpio = DA850_USER_LED1,3 X: I: j1 o9 o* }; ^% t' y- N
.name = "user_led1",
/ I% \" v0 P7 F0 g .default_trigger = "default-on",
) h- }( R3 Z& b+ O1 v6 [ },
: C' s5 {5 e4 ~# f# ~: ~* W {
N+ R0 z0 ^5 u( N' X0 B .active_low = 0,
: o* r4 x# S3 | .gpio = DA850_USER_LED2,; Z* y9 t7 \! V4 x" K
.name = "user_led2",
Z: I4 l( M' Q# i8 j3 q .default_trigger = "default-on",- M& C" N. V5 b3 Q+ ^
},
! f% ^/ N# C7 @7 u, k {
) o' V: F' g( f0 z .active_low = 0,' A1 X8 k, C) M6 M4 f
.gpio = DA850_USER_LED3,- I8 z8 j: E5 h
.name = "user_led3",: G! R! m- ?0 y# I
.default_trigger = "default-on",$ h8 `" Y) K7 b' j, u
},3 t& j& W, N; N, m+ p& c8 q
};
6 M. V) C7 k: o# J
" A% q6 d4 H4 ]+ z! S I: qstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. c' g. \4 m2 O4 B- `
.leds = da850_evm_tl_leds, A( o$ e8 c! q) D Y% O
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* K: |( v. E! B' f V& w};/ r7 E( t) [; b: x( w
$ Q* Y0 {; x) Z8 _& h
static void led_dev_release(struct device *dev)+ Y" D: l0 O. p; n1 r _
{
1 j. S6 Y$ V% B3 \8 K% g. {3 R};
' D. g* z6 l) h9 }5 \' T% r- u! l* w& `+ ]
static struct platform_device da850_evm_tl_leds_device = {8 [: N/ ?+ X7 {" R. [$ f1 `
.name = "leds-gpio",% y* a2 \* d+ Y% H& e! @
.id = 1,
, W; z6 p3 I. j. W .dev = {: `! N: d- n' R8 x- Y# J
.platform_data = &da850_evm_tl_leds_pdata,
0 D, K3 S* d! p# W. C5 z5 x .release = led_dev_release,
. n& C1 |3 ?3 J" d }
+ Q' E ]9 ~. T6 C% y};5 z$ v3 [ D" u9 V! G
" Y$ m, s: y7 T0 Y# ?static int __init led_platform_init(void)" B& n j# k/ j* a
{( d8 q* X' O" m+ i, V: \; N$ ?
int ret;
8 t8 ]/ W- [+ t5 H5 ~#if 0! l+ i5 g& v, v1 }. f4 ?! r) o
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
9 A) n7 v& ^/ B3 x) C0 { if (ret): } r( Q. u8 R/ U9 Q, ^
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"5 z6 d+ F" ?6 q6 J6 _
"%d\n", ret);
! ^4 t! q/ x$ f/ `2 N: ?4 h#endif5 P1 O6 _$ @2 N* q6 v+ U
ret = platform_device_register(&da850_evm_tl_leds_device);
+ q, n" p4 I' v }8 a if (ret)
6 v1 X" b. V5 b, g; u6 |# G/ q pr_warning("Could not register som GPIO expander LEDS");9 _8 \9 i- y8 v: @: J% [" S
else
8 J" h- o) C0 | printk(KERN_INFO "LED register sucessful!\n");( {/ [0 ?! X4 G& s& l: m' N( h
b5 P+ }- G1 N0 ^
return ret;0 s, J# m. w& Z8 U+ ^; D5 t
}
3 m6 g5 @0 B$ J6 K! ^- z
% j1 N0 g, K0 r2 R6 [% M1 z3 ^static void __exit led_platform_exit(void)
* y! { ?" R+ U1 C3 l' E O{
5 O! C, p* ?% e( L8 ~4 T platform_device_unregister(&da850_evm_tl_leds_device);
# ^" S2 x1 k) N/ \: S; G. |3 {$ t% v/ U' l5 f3 G# b
printk(KERN_INFO "LED unregister!\n");
6 ~" c4 o3 N/ J/ w}
8 ?5 U9 k5 R) m6 I+ Q1 a! M
% D5 F6 Q0 n9 t- C; rmodule_init(led_platform_init);% s/ J% {# j2 m8 @- K8 K, N
module_exit(led_platform_exit);' l S* I5 `1 @: z. \/ f
/ ^: A3 v, o& C1 V
MODULE_DESCRIPTION("Led platform driver");* r8 j c. P% R5 C' d5 H
MODULE_AUTHOR("Tronlong");' {, a. j# a) M
MODULE_LICENSE("GPL");
2 s3 D" S4 a5 W) ?. J' w# F5 y
. e9 h) D* A- n0 o" W5 e4 i" A2 m |
|