|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
# s8 O1 M. o' Z. {#include <linux/init.h>
: Z9 s+ a* Y3 ~ Y- e. d! a7 G#include <linux/module.h>4 A4 O: q& y8 f; i7 w4 X: A' ]
#include <linux/kernel.h>
% X5 e% q+ J% g. x( a6 c#include <linux/types.h>
" N. u. ~# Q" d9 T8 o2 ]#include <linux/gpio.h>
7 k* o, ^! ?4 @/ ~! A( G# U#include <linux/leds.h>$ w, V: v7 a! B' }- @. u/ K/ z7 c
#include <linux/platform_device.h>
5 G1 [8 v% M* H. `9 G5 y8 B* l# I% K/ m0 ~1 V
#include <asm/mach-types.h>' z% b Y1 X, q/ O7 ^2 h
#include <asm/mach/arch.h>
U$ V3 ?6 N8 ?' o5 ~#include <mach/da8xx.h>
$ Q4 a/ I. h8 I5 g6 n! V#include <mach/mux.h>
* _: D1 v8 E& b$ q/ l9 p, k# L( k( A- L* E: N: f) b) o
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)! L0 |1 Y) k: c& ]
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
: v6 t3 T; }$ W( r2 V" J: b7 l0 A#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 d% r9 A v0 D c#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)3 W$ E+ S$ F0 I
1 s/ }' S* b6 r* q) w1 T: t8 B/ q/* assign the tl som board LED-GPIOs*/0 O7 S* g' R: a7 @7 D4 t; o! a
static const short da850_evm_tl_user_led_pins[] = {; n3 E' O1 W# Q
/* These pins are definition at <mach/mux.h> file */
! W* h" q8 L, }7 K, A+ ^8 \ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
* [5 l5 K5 ?* N% v* |3 q; M$ B4 t5 n -1/ p" k) y% \1 G( K5 w% R& p# H
};
/ x& V' a1 Y: T- H7 r0 |+ k( P* w7 Q0 ~- r* s) A% o
static struct gpio_led da850_evm_tl_leds[] = {
2 r- L/ W6 M8 G2 {( _ {
) J& |" J7 M0 B3 Y .active_low = 0, G1 k8 J, Z2 B
.gpio = DA850_USER_LED0,) A5 ~( }0 I9 t9 Z) v; [- m) D* u y
.name = "user_led0",
& f1 F7 w) r' U3 } .default_trigger = "default-on",, J5 s& w( g J: I+ T6 l4 Q1 T
},
1 t$ Y+ C+ F* O. n, b9 d. v+ M7 T {' L+ m+ C- t E( |' N: {& q0 U
.active_low = 0,9 a9 T t9 [+ \1 x, T, E9 ^
.gpio = DA850_USER_LED1,* k# ^1 Y F) r0 A
.name = "user_led1",2 ~2 o b3 ^! y5 \# t, }- s
.default_trigger = "default-on",
6 u8 e- P* D) V },
% t3 f% e' j+ x. u/ K3 q2 J1 I {
! O* @1 y* R' R7 u8 P L .active_low = 0,* O- t1 m0 \/ c3 e
.gpio = DA850_USER_LED2,5 E6 ^& W$ X4 H+ o- f* S' Y8 B
.name = "user_led2",8 A+ n7 q, M0 J5 |, I
.default_trigger = "default-on",/ O n8 a% D5 c. k6 _
},
4 A: r) ^# P: B {
3 ?3 Z! P7 I. {4 ^ .active_low = 0,3 p. {8 |4 A, @1 ]
.gpio = DA850_USER_LED3,% F* H' T, D; W9 \2 X% u
.name = "user_led3",
, H2 A8 i$ q/ ~+ q4 S .default_trigger = "default-on",- ^3 s8 Y8 i* p) L3 s
},
6 _; l% ^% C/ ]7 M" u};
; u0 V2 l P) A% |& h; z6 d7 u& j
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
, Y* v) z% K- m' ? .leds = da850_evm_tl_leds,
) @6 N* ^# N7 j# U5 k2 ?4 d .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
3 v4 i9 x Q! C% a4 a};: E6 H" W0 [+ {
' }8 B; K7 L* A3 X$ q3 h* f2 b& P
static void led_dev_release(struct device *dev)
0 J( P+ W5 |1 h0 o3 N; z$ o{
4 s3 c: v9 M4 A};
0 H/ Q p' l7 E+ t, k" m2 n* V& p/ ?0 h
static struct platform_device da850_evm_tl_leds_device = {$ w9 A2 S. g9 Y. |
.name = "leds-gpio",
& M4 g& @7 a7 V: N: a .id = 1,
) e5 `3 D! r$ t5 h8 t .dev = {$ }7 q4 C& E. L
.platform_data = &da850_evm_tl_leds_pdata,
# ]* p0 h2 C+ F/ M' i E .release = led_dev_release,% X, I. f8 z* Q
}! @& D& B" s! d1 ^& y( P2 k
};: M. F8 F8 ], ~- u
% g: {3 ]. O, N( t; f6 F M) r
static int __init led_platform_init(void)% P+ f6 { T3 ^. v- U3 F( f0 H
{) s: H8 b# C, g6 _7 M
int ret;
K6 n' J7 O& }. V#if 0
# q& M% V3 {* F! w. M# k% U ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);9 C( x( p# B* N! u
if (ret)
* l9 R+ I) r% Y7 _) _2 D pr_warning("da850_evm_tl_leds_init : User LED mux failed :"2 X1 s' i* p1 f ^; p
"%d\n", ret);' |% p6 I% K/ @+ u) @- [
#endif
9 D u6 M5 J6 c5 O# u0 Q4 X ret = platform_device_register(&da850_evm_tl_leds_device);
+ n) K P( ?- @$ n( l if (ret)& ~. b3 C) {/ g- ] d, N' F0 A
pr_warning("Could not register som GPIO expander LEDS");; N m9 E, K5 Q- d' B: l
else& g8 l/ J; k! h6 z, P) d
printk(KERN_INFO "LED register sucessful!\n");& m0 o3 J L4 B2 S) x g, b, V1 Z
- ]% n' n- M e/ z8 |$ N3 ]+ E return ret;; N2 `( ]# n( D/ J
}; M A$ n8 x$ [6 n0 s
8 G* p! [9 h+ i9 l8 M, u7 w
static void __exit led_platform_exit(void)! N0 `- S \; n0 n, X. b
{! V8 ? A A) ^& n5 `7 ~
platform_device_unregister(&da850_evm_tl_leds_device);
( }# h" B7 K9 U5 t, L3 e: r7 t" u' l8 z- C4 D; j/ q
printk(KERN_INFO "LED unregister!\n");4 U- s( O, e0 ?2 P# f3 g
}! i o/ U' J, Y% K
3 _4 |/ w/ u! U6 `" c, u; |9 r
module_init(led_platform_init);. o- n. W6 E3 [% m9 u- i
module_exit(led_platform_exit);; B. @ o7 z2 ]" I# G
1 i5 W, b5 d8 W/ M) x: Y; ]- l4 sMODULE_DESCRIPTION("Led platform driver");
$ c% Z1 e' u( B* Q5 GMODULE_AUTHOR("Tronlong");9 `8 [+ J4 C( c4 \
MODULE_LICENSE("GPL"); O( P7 ?% y" _
9 T5 Y7 Y' w( r u* W& `& v
|
|