|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
' U/ @' i4 B0 @- {( ?& @/ ]4 V6 h#include <linux/init.h>" A: ?: E) s; q f5 p. K% h
#include <linux/module.h>! ~3 e" q% P: v$ \" o0 T3 d; c
#include <linux/kernel.h>
6 q" P+ `; g; Q' V% O6 w+ z" l#include <linux/types.h>
- F, q6 n5 l0 m2 t3 b#include <linux/gpio.h>
* B5 a' V3 \% s) D: H#include <linux/leds.h>% a$ e# o2 w9 L& y$ @- d
#include <linux/platform_device.h>
& t& R* V% z% I- L' k, J6 u; `5 ^4 \/ S8 F, u# E7 a$ m
#include <asm/mach-types.h>- [ P$ _8 t* |& e# ^* _& ]7 a& z! F
#include <asm/mach/arch.h>
! v4 z& ]- }- w2 S; Q#include <mach/da8xx.h>
0 ]- u" e( C+ _; u/ T' E#include <mach/mux.h>6 X# k* [0 k, W' D4 P' S5 ?
0 ]4 e8 i* u- l2 l3 E3 H- l0 C#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)3 ~$ g( z& x/ f; V( v
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" B. N# R3 k9 _7 e2 \, C#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 m. Q- O% A5 a. @! {
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
" ]: A' w2 t1 f$ B3 v. |) r) C/ [; I% e1 o* ]* f
/* assign the tl som board LED-GPIOs*/
/ c+ I- }, O6 F+ ~static const short da850_evm_tl_user_led_pins[] = {! P) v) ^; r" Q. m7 M
/* These pins are definition at <mach/mux.h> file */
% J7 x! Z Y% w0 l: J7 ]8 y DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,' J1 N$ [4 a4 h# U3 w( B) l7 Z
-1
' j# o4 x) e$ B Y$ D};
6 R1 Q8 L7 T) c; z$ q8 p+ H
3 S* \6 { ~8 |# k3 h ^static struct gpio_led da850_evm_tl_leds[] = {
$ T* d0 C. `3 X0 U {+ ~' r' r$ l% a- x
.active_low = 0,# ~- N# l$ t# F `$ E8 P' m
.gpio = DA850_USER_LED0,8 B7 Q# {6 o' o1 V# [
.name = "user_led0",
/ W0 } @! w1 a .default_trigger = "default-on",
/ J" B' `& S I, H* a/ k4 z' T2 H0 ` },
- Y# M. j% G- s4 o. g( } {
% x- Y- C& L: |$ a" q( } .active_low = 0,
4 H8 w! Q3 C6 o/ m' l .gpio = DA850_USER_LED1,
- c* Y% ^5 m1 g7 E1 I+ M .name = "user_led1",8 f, f+ V" V# [. {# n! K
.default_trigger = "default-on",' u: W) A" ]6 m0 o; h2 T0 p* e4 @
},
( j4 ?9 |! m' n" _ {
- l7 \5 S8 }4 h8 {. }2 I& _ .active_low = 0,
1 w7 I" \" _7 L6 } .gpio = DA850_USER_LED2,2 |- G! ^/ j. s7 \4 l: M
.name = "user_led2",& t8 w5 j, J: s0 _6 s0 H3 m
.default_trigger = "default-on",' V7 l2 `/ c: b3 K5 d0 i
},$ q/ @/ G" B p# P. x0 \2 K S
{
; k$ w0 x: ~+ h( k8 X8 [2 ] .active_low = 0,1 A+ F4 v" o4 b X2 }4 s! w
.gpio = DA850_USER_LED3,# |# L) b( c R' h
.name = "user_led3",! _8 D) r# S/ E4 I) ], c
.default_trigger = "default-on",1 n: G( M5 N3 k5 x
},0 H2 F8 B% L6 y
}; h. z2 ]$ F' u& _$ L: h
8 E% e5 |5 [7 I0 {9 x" wstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
' b5 }! p" L! W- z .leds = da850_evm_tl_leds,; b9 B C/ v8 U; y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. Q3 ?5 ~! N7 ^$ V. ?8 F};2 r! Y' W: Q0 i4 W- x7 m! Z
. S5 p9 l! z0 t( x: {static void led_dev_release(struct device *dev)) h) U+ H. O v( O3 w4 Q o
{3 A2 }( M6 [: }, I) \: E
};
$ K; h, u7 z& D3 `- C. Y4 {9 B' T
2 M' E, N' q# b. x; H% b: vstatic struct platform_device da850_evm_tl_leds_device = {
# C1 L$ B) B9 O8 b. `0 V2 c9 V, D) | .name = "leds-gpio",7 B2 q R" p: T! C) h
.id = 1,
! y3 B. x4 ]1 `; p8 ?$ }# ` .dev = {) g1 [1 M' c6 P+ }2 @4 j! d: S9 t
.platform_data = &da850_evm_tl_leds_pdata,
9 Y7 i/ A" ^ P$ G .release = led_dev_release,
; j6 ^; ]' U, q: ^ }3 ?# Z% M( p1 G. W1 j6 M
};/ D; D+ L L* U+ G7 |" s' N
8 k3 O9 z0 u* e8 v- p5 f9 Jstatic int __init led_platform_init(void)6 \& W+ C) ?, I+ j4 f7 q4 o
{4 |6 n) S3 h! t2 i
int ret;
! c' E& X d/ n# E+ g: n' u#if 0
7 g6 {6 @# d5 W6 n9 O ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
% F: q* A9 |' }* l if (ret)
+ L, e8 p" w- a( j, m4 n1 m. ] pr_warning("da850_evm_tl_leds_init : User LED mux failed :"7 \5 [* b8 _8 b8 C: v
"%d\n", ret);0 k" Z W3 f, Z( \0 R8 b; m6 e5 \8 z
#endif: a+ x& H- n1 r' S* e, ~; `; A5 p+ {( C/ x
ret = platform_device_register(&da850_evm_tl_leds_device);
% W8 G1 Z$ K# J if (ret)
7 ^1 k0 m# t5 b/ y( Z0 s pr_warning("Could not register som GPIO expander LEDS");5 K6 W' t* @. x- f2 W
else% g; a1 C- ]8 s
printk(KERN_INFO "LED register sucessful!\n");
* Z: y- \0 ^& F+ E
- K9 t8 M H% m% }: e return ret;
. w6 U3 a" o; {/ v1 ?6 z} N$ N0 x( E1 S8 D g- z+ h
* n3 O3 c! n1 D0 M8 zstatic void __exit led_platform_exit(void)0 H, D1 P" ?* L% T+ `& t, `3 r
{
: N8 B# j) E# q' ?4 u platform_device_unregister(&da850_evm_tl_leds_device);# ?$ C( t, C/ [- e& ]
# B n/ t( }: B/ u+ [$ d7 [" } printk(KERN_INFO "LED unregister!\n");0 r8 _. J! r/ `! W
}
- R% b ^# O. ~: x* k8 I# A5 D
8 a! w& V/ y4 x& O# K: c+ ]module_init(led_platform_init);+ [( M4 K3 T5 z; K$ t- W' a
module_exit(led_platform_exit);2 x) w0 }& a- U8 H/ Y' @' Z
* J; @# b( f5 @) E0 y
MODULE_DESCRIPTION("Led platform driver");
% h' C; E: ~0 x. @; q8 \MODULE_AUTHOR("Tronlong");- q: s$ {' Q2 J8 k3 d5 \$ `0 N5 M0 u
MODULE_LICENSE("GPL");1 b0 Q3 u" g& M8 C' v; ?$ e
. i+ E: J# s! E
|
|