|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
o% {% C/ o' a5 i, x% K7 F#include <linux/init.h># U( J' {# O. G4 k w
#include <linux/module.h>0 G2 B" Y7 p# m0 e4 J* G( ?5 u
#include <linux/kernel.h>
! o9 p' P6 f- O/ L# z#include <linux/types.h>
$ d- ]' e3 N! z: q Z! h7 |#include <linux/gpio.h>+ v. j' b5 Z7 d8 K6 _
#include <linux/leds.h>% w* h& H3 C3 K/ K
#include <linux/platform_device.h>4 s* c$ U: C2 D$ ^) i1 n2 L" @0 F
0 {, a7 [7 N6 _3 E; K& m9 u; C% C#include <asm/mach-types.h>7 F, g% [2 A) k; P9 V" J
#include <asm/mach/arch.h>
! [7 C/ `) V! q- q4 R- B#include <mach/da8xx.h>. R4 k5 ~+ }# O
#include <mach/mux.h>
% n# c0 ~$ M/ n; f( v8 f
- S6 x; {1 u( g+ y) G( M#define DA850_USER_LED0 GPIO_TO_PIN(0, 0): D# z( U" O% l9 }$ Y- ]/ ]. |9 D j
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
/ r1 b$ j+ ^+ d" g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)) Y4 {- e. N9 }1 j
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) i$ _) ?" D/ H0 }: ^. C
8 R/ ^; `$ l, }& K1 ^* O/* assign the tl som board LED-GPIOs*/
* x5 S0 H6 V2 V1 y& qstatic const short da850_evm_tl_user_led_pins[] = {
4 H% x1 \+ h6 o* H4 K; |1 j) B, w /* These pins are definition at <mach/mux.h> file */
% Y0 j1 N3 t3 e" z DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 m; B( ?# W0 f* ]9 d -1
% A& |, i" ~0 K& Q) l};/ K4 H; L& v) Q& n! m
* D" g. c) J! m/ [9 G5 {
static struct gpio_led da850_evm_tl_leds[] = {
: n1 X/ h6 W8 w3 F) Z {
! N, a! A! y" U .active_low = 0,
z! b1 [+ r( E- V; y .gpio = DA850_USER_LED0,
0 j0 j# K7 s: r/ ]# n4 |$ j .name = "user_led0",: h/ Y1 c! N b
.default_trigger = "default-on",
1 M, I) W) p2 d },5 W. m" K6 [6 J# X/ m
{+ e( _ ^2 Q. B6 K& w& k
.active_low = 0,
+ V' ^* X$ I- W2 o9 R .gpio = DA850_USER_LED1,# T% O' ?1 N# B h' m* f7 y# X
.name = "user_led1",! Z9 i5 ~# F E6 a" O; `
.default_trigger = "default-on",# B7 v z4 o* ` x
}, A6 Z2 |$ R$ a8 s& W: N
{
) P+ M6 k, D G* p. j' x/ Z6 ^ .active_low = 0,
; W5 v/ ^' ~2 ]8 Q .gpio = DA850_USER_LED2,
; z4 M( c& G# f0 U .name = "user_led2",
4 D5 T2 N5 [! m1 q: B .default_trigger = "default-on",. y' c9 ^' \1 g1 u! y8 y) S
},
, U" V! `6 h& X; j9 l0 M4 ?; Z! T {) S' ?* [0 v* E( Y# Z- ~$ t8 n
.active_low = 0," }, s- Z5 b- U. ?9 g
.gpio = DA850_USER_LED3,
; V, c: }, m) E .name = "user_led3"," f- k X' y9 ~+ n! W- Y* f. ^, U$ D9 f
.default_trigger = "default-on",9 j! Y; |/ `7 h2 N2 B
},: u. M6 _' C# T9 R4 r. E1 s
};( W$ G6 K- A' O: D. X0 r
1 M: D% ^. H ?8 C% C
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {; Y; ^2 J& @' {) a5 w) b% [) d
.leds = da850_evm_tl_leds,0 d1 T/ |* ?, `& @% c; r8 k1 _
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
8 R/ j! m- t( t( O};- s/ ^& K* n7 ?
( @8 S% F- U# y. [& V5 E5 l
static void led_dev_release(struct device *dev)4 v- e5 A9 S/ \8 d
{
, C/ t% |+ Z* L1 X+ N};
" Q( J4 B# U; J% j3 q& q3 ~' t* v; Q* K# I4 T: L
static struct platform_device da850_evm_tl_leds_device = {3 N3 J7 M. z0 D u3 X+ F
.name = "leds-gpio",4 L( f; h& \2 {) C1 ~0 o/ X
.id = 1,. x0 e# ~& q# W5 R3 K& ?
.dev = {
* s% C% M2 `4 g; y .platform_data = &da850_evm_tl_leds_pdata,0 d4 F9 n m: S& f
.release = led_dev_release,; d$ i* t/ i- { a+ H7 C& k% _
}
+ t, o( g( k) ^& }" s" K2 Z2 w% t};
, @( u ^- O4 I' h0 h/ o& x4 M
static int __init led_platform_init(void)" n3 n `6 |& h
{
0 a6 w% _9 O# O' b) v$ W9 u. F int ret;7 O) O. {8 m# A! ?
#if 07 p0 ]& _7 z0 i& b: ~$ I
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
( ^/ G6 N o0 x+ V* M0 u$ \0 { if (ret)
- _7 E+ ^& f: h* M pr_warning("da850_evm_tl_leds_init : User LED mux failed :"! P7 }+ z2 y, I1 t- g) {) a) F: e
"%d\n", ret);# G: C: G# j4 C$ `1 e
#endif4 h* d# x4 r: I/ s6 v# u8 {
ret = platform_device_register(&da850_evm_tl_leds_device);2 \8 R3 X, W+ G h9 O6 l8 @
if (ret); R m! k2 n( O
pr_warning("Could not register som GPIO expander LEDS");- q- h( v9 C6 C% g8 H# k* S
else4 z$ c7 A! N$ S! \
printk(KERN_INFO "LED register sucessful!\n");% P4 S* H# J k
" N" V7 v, R; I
return ret;2 y: T5 `( A9 u3 O/ F
}3 S' [& x: |6 F: r
1 | ^3 t* A) ]$ [/ r
static void __exit led_platform_exit(void)
6 L# R1 `$ o6 M: i- C5 ]; [+ {{
3 d6 Y5 p$ ?7 W- R6 n% h: V! _ platform_device_unregister(&da850_evm_tl_leds_device);
# a: C1 R$ o* Y. S z7 @
5 N e0 N9 b/ x6 p0 R' Y2 W printk(KERN_INFO "LED unregister!\n");7 U/ N T/ Z# U. t
}
! n7 u, }: e+ B* |% S/ ~; H- D; _' k# Z2 L+ d( r1 ~
module_init(led_platform_init);
* {) ]( }) m1 }3 c6 ]module_exit(led_platform_exit);/ o) E: V0 B# Z) X0 a( u2 ~9 H. P! B
, \6 I4 t f) w* q. XMODULE_DESCRIPTION("Led platform driver");
, k) z% o2 k! L! ~0 SMODULE_AUTHOR("Tronlong");( J/ u) }7 @( |* q
MODULE_LICENSE("GPL");2 W/ d. G( j* g3 }7 j; P
; o) Z& |; L$ G+ v) \! a0 d! t |
|