|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
' i8 d1 X8 C' F( K1 [#include <linux/init.h>0 J( N7 n- f: M! S Z
#include <linux/module.h> J: v5 ~" h8 d x: m z0 b* T
#include <linux/kernel.h>1 u% i5 X% J% z! [- |0 C# }' J! p
#include <linux/types.h>
+ B2 b8 T. p! ^) e#include <linux/gpio.h>
5 c5 K/ f H; z* |! b" b! Q" z0 V#include <linux/leds.h>! I5 Y' X: g s9 o! K
#include <linux/platform_device.h>
$ |6 G" G4 p& C/ t; Q5 Z. d6 Q+ p1 P( @3 V5 Q5 q5 E! F+ x7 _
#include <asm/mach-types.h>) x9 m6 o* {" N7 B z
#include <asm/mach/arch.h>
& h, x- f d9 Q* T6 P( _; h#include <mach/da8xx.h>; H/ x) o/ p) K& Q" ] ?
#include <mach/mux.h>2 b- N |7 n+ J( Y
6 [( I/ i( A3 ]9 a- l J#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& V3 c! z6 ]# O( v#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
9 z* ?0 |$ Z' T5 O {$ i5 ]6 f#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
5 B6 n9 B8 D% D. P#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
7 h3 n" j0 }- F3 ^$ n# t/ W
6 Z+ @3 b4 z( U$ h+ q: I/* assign the tl som board LED-GPIOs*/
+ h7 L# p& H+ k; N6 T* C1 Bstatic const short da850_evm_tl_user_led_pins[] = {# [1 f% H* E1 N) S
/* These pins are definition at <mach/mux.h> file */
5 h6 |6 M7 R6 |- @ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: E' o, H1 z: o& ^% |, M# | -1
% N/ i- d! H* s};
0 T9 A4 x2 f! {7 X) H; M* }. a! }( f* F" g, m0 D
static struct gpio_led da850_evm_tl_leds[] = {
5 ?1 u0 @) b9 u7 b/ ~4 I2 {1 n {
% F# s- `1 D6 v" B4 r& j( Q2 R .active_low = 0,# W& z! ^8 b5 k/ W0 G% C- @; H$ U
.gpio = DA850_USER_LED0,: O( B/ z9 W% _8 m/ [# e
.name = "user_led0",8 ~1 t' S+ S2 V( H- J# _0 C
.default_trigger = "default-on",# h L% `& x& J2 |& _$ L
},: X& R) D6 x, U' j, P8 F
{$ E2 O3 T2 ]5 n% h& A: l
.active_low = 0, L% A: b$ \$ W$ `- T7 T
.gpio = DA850_USER_LED1,4 L$ K# l. W" {* g: _! y( a
.name = "user_led1",& b: U: u/ H, W6 k* o
.default_trigger = "default-on",! m. r+ G+ }$ X6 W2 a( f
},2 L+ T% k( z5 q* x: U0 Y
{# d% L# Q! S" z9 T; Q E7 n
.active_low = 0,, h8 P) K0 ^- u, Z: v! @8 P7 u& M
.gpio = DA850_USER_LED2,
, Y g# _6 C; m& y( {/ M' N7 d .name = "user_led2",
0 [0 b7 ?8 ~! `" d! D% k* Q3 S. g .default_trigger = "default-on",
2 ?( R. H0 l- I J7 D },; ^: w2 \4 D" V# Q Z, H& N! ` j
{3 I% `( S4 p/ v( E5 F, @
.active_low = 0,
- U+ j( F+ x: {$ D8 l* z .gpio = DA850_USER_LED3,
$ `1 a1 ?2 ^: e% U: g. ^8 W/ c5 A .name = "user_led3",
0 o/ C9 t" n6 t .default_trigger = "default-on",5 D$ M( i" V5 n9 [% r) M* p
},+ [+ W% K# z6 P. Q4 \# S! M3 W
};" e o% v4 {1 k2 w& o9 @1 p+ V
, J5 f4 F+ |0 |. @. M) b6 i+ V
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {$ Z. l7 F* D6 U( ^; u
.leds = da850_evm_tl_leds,. b5 B7 ^9 R9 [/ ]
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
5 M9 L$ \" i* ?- B};
3 u; s% w( o* C* M8 _# W" l& t" Z6 L3 ]* c. t8 E0 t
static void led_dev_release(struct device *dev)
8 e" h7 `# w8 W, m {{+ r# T/ c" I5 y% z
};
7 z3 C# M9 @( S! I/ S
) |/ q) S# z2 C7 cstatic struct platform_device da850_evm_tl_leds_device = {
: x2 e3 d2 M9 z' t .name = "leds-gpio",6 b P* `* B% F5 `+ L0 ?" U
.id = 1,
8 F+ f1 S) f9 t k8 H9 M/ I. E .dev = {, ~+ m/ c& J2 O# d
.platform_data = &da850_evm_tl_leds_pdata,
$ O9 a( m) {1 R5 N .release = led_dev_release,
$ @- X& U5 V7 q4 w8 [% B }6 S7 \$ g/ U8 q, ], Y/ y
};, F* \, A2 z$ s' [& S0 U" {
: m0 q: P) ~0 X/ Y4 {
static int __init led_platform_init(void)
& ^0 p6 f7 h' h! ^{8 i" X8 ?4 F2 F6 L( H
int ret;* U; C- `6 e3 K0 S) K) c
#if 0
& t4 J5 o1 B6 S7 O' W* Z ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);2 o, q) S& x! [+ s# C& d0 L+ L0 M O
if (ret)/ _* h" s7 r7 ^3 h3 W: z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :" Y, Y) A4 l+ \0 ~' {# S. [! W, f6 v
"%d\n", ret);1 p1 `+ ~5 E F! B. S% X9 r5 N
#endif% ]3 X6 D" ~8 I3 |; o7 @" ~, Y
ret = platform_device_register(&da850_evm_tl_leds_device);3 V& g }5 A+ A( i5 D2 y* X: e
if (ret)
/ I9 i. q: A: M! g) R/ C' U pr_warning("Could not register som GPIO expander LEDS");& }9 g/ K+ h# C
else- b+ s, g" a, X
printk(KERN_INFO "LED register sucessful!\n");
3 e4 w9 V( }- q1 n& r0 q0 c4 |# [3 b# _; A- W9 W
return ret;
! w4 y+ v: q# P# Q$ R- |% J}9 @9 W. e; V; W
5 Y+ Z, F/ ^' W4 @7 ]* a+ \& ~static void __exit led_platform_exit(void)% N* s9 ~6 q5 a7 J
{( S; W. q3 J" ?& y: W% |$ e
platform_device_unregister(&da850_evm_tl_leds_device);; f2 p# W1 d* |
X4 K- Q1 \2 d- H( p
printk(KERN_INFO "LED unregister!\n");
) R( v4 Q; H, ]4 ^}7 u$ n7 U, ^! ~8 I' Y
. o$ b: b- t% J: [: u: b2 jmodule_init(led_platform_init);. g U+ ?4 T& C' N
module_exit(led_platform_exit);
0 c+ C$ Z& n! A$ a( j3 z o& u, c$ K8 {1 L6 {) D7 L
MODULE_DESCRIPTION("Led platform driver");. q; \* J& w' f- d& n4 u, Q* s; k
MODULE_AUTHOR("Tronlong");
* ~( Y. L% G& ?! S8 e2 oMODULE_LICENSE("GPL");
4 p) ^4 L$ f& d v$ N( b$ @, U4 @' d- S( m# J# p6 u' q7 V# n
|
|