|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 ]% \% {. n& z) f- c
#include <linux/init.h>, l8 N2 I: r5 `* }, x
#include <linux/module.h>
) r& r2 V o" Q# V+ V#include <linux/kernel.h>
, |/ ?% x" V, J7 V- ~) g, J! B; {4 G#include <linux/types.h>
" c# o$ \9 V- ^7 \% N; j, l#include <linux/gpio.h>
8 t# c2 P5 N( w% g0 r#include <linux/leds.h>
3 j, b9 @* l3 N+ D& r#include <linux/platform_device.h>6 N# v* [) m# L" }( N
, |. M: r+ x L/ t( p#include <asm/mach-types.h>
4 F/ X1 F3 {( t: F- _0 p#include <asm/mach/arch.h>0 _9 P; }. j% f
#include <mach/da8xx.h>
1 m: A! R x, z' i3 W6 f#include <mach/mux.h>
% T" G$ M% a' J# S3 }+ h0 a
; H2 A6 ?0 M2 Z0 G" {9 h#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)7 D. V8 Q4 |; l1 [
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
6 y. }* K9 D& C4 P, f#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
2 W( R$ V& _ \. H#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- ?# u* y' ^0 n+ L1 s. Q/ H- C
# u. B. D2 F* y) w$ j. N# H/* assign the tl som board LED-GPIOs*/
( J+ [6 [" t! y8 Z4 [) astatic const short da850_evm_tl_user_led_pins[] = {
0 i- x/ {' r K; a \ /* These pins are definition at <mach/mux.h> file */
9 j5 w, q8 ^! K$ s } DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ ? S) w8 e0 u! w+ p
-1
3 x5 U# H* u N" o+ E/ n5 l};5 i( A% B! F, f% `# z8 w
# P: m) T) b& o+ T! u: N- Nstatic struct gpio_led da850_evm_tl_leds[] = {) g: e* A J5 f
{
) m" T+ g! t2 v/ J .active_low = 0,1 B+ t5 S5 o' v; W6 O3 [
.gpio = DA850_USER_LED0,2 P; j/ I" e' @8 w5 W2 k
.name = "user_led0",
4 `4 e+ D- b, c% F( _2 j5 s .default_trigger = "default-on",6 X/ `- W- P0 |
},
7 B& j$ ~# @, Z6 C. X- j0 o {
K4 a5 B, x7 {0 m) u0 h7 o .active_low = 0,- A7 }: ]6 `/ K$ S1 W. F, Y
.gpio = DA850_USER_LED1,
6 x* c) ^7 i! p8 X" }5 t" s .name = "user_led1",
2 A# f+ Z9 `' p .default_trigger = "default-on",
8 `& C3 [* Q N },* ~( U& S& a; F' X9 J
{
8 H! r$ f) r" R" y) Q9 V .active_low = 0,
9 X, W* i9 }8 R. X) l .gpio = DA850_USER_LED2,
) Z# S7 r3 Z9 D& z .name = "user_led2",
$ x' V9 S3 J3 o/ q .default_trigger = "default-on",
5 l: _& G0 @ |9 y },* b) R6 _# l% ?+ X) z& X
{
, Q$ n+ ? j2 @! ]2 W9 M7 P: f1 b .active_low = 0,. L- z4 g' z! N7 D" w) b
.gpio = DA850_USER_LED3,% Y _: V+ T9 l$ w4 Z) o
.name = "user_led3",
9 ]0 h- J2 x- o1 B% { .default_trigger = "default-on",) {# U q3 q2 n P/ p' z {4 E
},/ a/ j3 E7 d8 g3 R
};
$ v+ K2 _2 I/ x* O$ k/ L/ I
4 y. Z. f" Q. Istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
: R3 k7 ^* m% V+ l .leds = da850_evm_tl_leds,
/ R1 {, a2 ~/ R' B .num_leds = ARRAY_SIZE(da850_evm_tl_leds),/ M( C* |# p+ u r
};7 `3 ]9 }" d+ m- H; \1 [
) `; |0 }$ F Z1 Sstatic void led_dev_release(struct device *dev) R, V% Z Z% ]$ E
{# F8 ]: z1 l# p1 x) O
};( C; B/ u( A4 {& S; ?
; w5 c# I) i( [% s& \
static struct platform_device da850_evm_tl_leds_device = {
" c9 g. G, s# c; X. ~ .name = "leds-gpio",
( \9 D. ^4 [3 w A% E5 S" K .id = 1,0 }) I) N4 P) _0 ?# Q# e$ b
.dev = {
G4 R$ P( Z5 A9 R7 \5 l .platform_data = &da850_evm_tl_leds_pdata,
* Y4 R) Q' C+ L F8 D8 m+ L4 o. x& I: Q8 X .release = led_dev_release,$ Q2 k' t; f: G) Z" }# G0 v9 |+ v
}
+ i4 s- V4 p; Y. A}; V# h' s( P5 c7 W- ?7 t
; m2 ?& n% L. ^- X/ a0 O% e
static int __init led_platform_init(void)* \, q* m/ n/ w$ L D
{6 S* a& s y* c$ q: K
int ret;- o3 h9 k% A& X
#if 0( G( A) f, r) H+ G+ E
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' T" E( [; Z0 R( {+ i5 I/ G8 [ if (ret)
2 a7 ^" K0 k+ ~/ |; i pr_warning("da850_evm_tl_leds_init : User LED mux failed :"/ W) V( x: Q0 U$ R, b% e7 T% L
"%d\n", ret);- u" ^$ |' J6 J* T
#endif/ L/ D" t0 }; o8 O: c& H [# I# P
ret = platform_device_register(&da850_evm_tl_leds_device);
7 v: ]: s, ~2 ?! [ if (ret)
3 c$ Z5 z' l9 V! y: D pr_warning("Could not register som GPIO expander LEDS");
# a5 g- A: s- A4 @* i else+ Z- }! O% a0 Y& @5 _
printk(KERN_INFO "LED register sucessful!\n");
1 ?+ _' r4 j8 j9 X4 h! O
! j) o2 b g" ~: T8 ? return ret;! R" D3 h( r6 \& g$ ]' t1 r
}; w2 T; A% W: m8 W
8 w" O4 i4 Z, astatic void __exit led_platform_exit(void)3 `/ T9 ^4 {# N7 _7 S& R# B2 }# ]
{' ~6 V: r; Y* h
platform_device_unregister(&da850_evm_tl_leds_device);1 x- Q0 v! P: o- u. N$ {' }. Q
; x. H* |- x" N" Z) {. p" B
printk(KERN_INFO "LED unregister!\n");
; [3 |0 Y+ d+ u6 n8 m; j3 t}9 M* K3 Q/ ?5 i/ _9 B1 m# ?
. t( {6 Y" ^+ c$ p" v2 emodule_init(led_platform_init);
+ g: h. w! ]5 u% ?% G Wmodule_exit(led_platform_exit);, V8 A8 q6 r W, P
0 g' g* ^) V( t0 H2 W" K
MODULE_DESCRIPTION("Led platform driver");
7 i/ |8 a; k: |; t8 M# `* BMODULE_AUTHOR("Tronlong");( ^! j* [$ s( s3 ?% U
MODULE_LICENSE("GPL");
1 |& D. O6 a% Z7 B/ k) o: V' @0 V ^( I+ r$ F
|
|