|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: v# \5 N* W$ {6 H2 o0 I#include <linux/init.h>
3 m( T7 n8 S' ?3 \, n0 Z#include <linux/module.h>
, u. l; g% {! T$ G+ f* s6 o#include <linux/kernel.h>: K! G5 r9 c: \: {1 E" l4 Y. u
#include <linux/types.h>
8 W# D: S. ]' U% [7 W#include <linux/gpio.h>
- t9 P0 Q* i. P* E#include <linux/leds.h>2 P2 J4 P4 X+ y Y1 o: i) K* W( Y9 |$ H
#include <linux/platform_device.h>
S3 s2 P+ C8 P) K1 ~6 h! S
$ _- d6 I0 p8 R6 |1 r7 k#include <asm/mach-types.h>% v/ Q8 \5 U) z1 y) S: m9 y+ ~
#include <asm/mach/arch.h>
: T3 n4 E0 V, P- }7 ?8 m9 q* S4 ?8 t' D8 ]#include <mach/da8xx.h>, I F* c; C ~2 }! c% q
#include <mach/mux.h>. A3 G- v4 h, V
5 z$ N/ t& e- V#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% H. B( r' q, }' S; G1 {
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 f3 o# j6 ^5 b3 |- K% t% y
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1); f+ V: f9 A8 H; t; Y. Y3 f
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)9 `4 r( T& u3 p8 H
" C/ y: I: V2 S+ \/* assign the tl som board LED-GPIOs*/
& O; T2 F9 U3 C7 [+ s5 O" a Ostatic const short da850_evm_tl_user_led_pins[] = {
8 C4 Y$ @0 G9 }& v /* These pins are definition at <mach/mux.h> file */
5 N* T! N# P2 i: P- h2 N DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,7 W, H3 u( B) c W+ C: k1 L
-1
( {: @) m. { B};. j9 s& V* @# H# X' u$ [+ i3 n
+ Q" O" e8 g5 R: {, n1 `8 pstatic struct gpio_led da850_evm_tl_leds[] = {
3 ~5 B3 P. k: Z+ d6 { {
6 L/ C$ H( p: G .active_low = 0,
* _3 V- Y" [9 A, Q& O/ v7 S- Q o/ E; } .gpio = DA850_USER_LED0,
$ U# n! d \) B8 U9 a' q7 P" X .name = "user_led0",
% y) W2 d5 s/ D5 q .default_trigger = "default-on",
# L" ~4 m: R* }2 _+ W! L$ W },
. d3 u; S2 J' `8 s1 } {
& @- N7 w, w9 X- c; z) K .active_low = 0,
+ l! u& x" p8 A- d- o7 T .gpio = DA850_USER_LED1,
( J% i" q' Z! |7 O4 y* Q6 Q, L .name = "user_led1",# f7 [" P* b& c( R, f* |
.default_trigger = "default-on"," Q6 ]0 _$ }+ p5 [. J- q7 M; c( B5 ^
},
$ z$ @/ O( s+ h3 A8 a5 p {
+ e$ K$ b8 f3 W: D' P& G .active_low = 0,
/ D* D8 H8 [- |$ j& ?# I .gpio = DA850_USER_LED2,7 G k) U5 U! ?( y3 ^4 a
.name = "user_led2",# k, p, o3 i& u j' A; k! F
.default_trigger = "default-on",5 w' V8 P) d! X( J$ r# X9 D
},
) ]2 s$ W! O2 |& f {4 W0 G. s9 c [7 g& k4 i- a$ _$ r
.active_low = 0,) K9 o" M# W. Q0 v6 B9 c
.gpio = DA850_USER_LED3,
& [& d# ~9 Q) y0 w3 l9 P1 K( q) Y .name = "user_led3",
4 h! q1 L2 F& f1 r5 G2 A, y .default_trigger = "default-on",
- L$ n" d) O3 h0 _) u2 H },! V' f7 Y+ t( ~1 M' X3 ?7 N2 t
};2 u* O: B/ v3 J+ ^- W% ^$ J
: B/ W N+ Q. _& K
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {! a5 \$ \+ n7 f. v# m
.leds = da850_evm_tl_leds,
* I8 m, M1 A! ^# b* @2 G& w+ F .num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 D, w. Q' O) w; \; x0 s
};! m1 E, [! ?7 J2 t& w+ R$ ^( ?
4 r) Z/ @. h4 b0 sstatic void led_dev_release(struct device *dev)5 m+ {7 f) b8 Y+ q; h
{4 o R% \! ^& R" K0 |6 s
};) _% t/ q4 t1 {" ]6 W
" R s. ` V: E9 q6 i8 c" s
static struct platform_device da850_evm_tl_leds_device = {
% P8 R3 J: G5 k .name = "leds-gpio",
# g) ? v: k# M2 T .id = 1,. @% ?; b, S3 \
.dev = {$ ~9 p U( ? L. _/ e( }4 F
.platform_data = &da850_evm_tl_leds_pdata,
1 p# z' g5 l W/ o8 l5 r .release = led_dev_release,
7 G. u( h2 o$ V, m" s. ~9 w0 Y }8 d( Z5 T# S6 F+ k' [, c
};
- T1 `; D# x. t6 B
5 p$ A* Z# N/ H% J6 \static int __init led_platform_init(void)
1 J: m0 y! ?% d: F4 u* I* ]{
; q! u) C+ I0 p" s int ret;+ {/ O) E$ B7 m; E" C. a
#if 0* h7 n) \( ~) @
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' j& e. E5 t A" V* W if (ret)
' P2 M6 F, R+ Y- G2 g pr_warning("da850_evm_tl_leds_init : User LED mux failed :"$ P! N7 h2 P7 I
"%d\n", ret);# Q; H; T* R) F- V4 F
#endif$ E9 L# U% I! f
ret = platform_device_register(&da850_evm_tl_leds_device);
0 u' _% o- Q& y* y: R+ a if (ret): ]( `7 ?) c7 a/ x5 D% y
pr_warning("Could not register som GPIO expander LEDS");
+ G" A' v, z+ K$ O" ~) }% }; E- H else; E, J. l9 r4 d' o E
printk(KERN_INFO "LED register sucessful!\n");9 v, l" ?/ @) B+ o- J1 @7 {4 x/ x2 T
0 t$ f$ x0 m8 j* Q9 e7 ~ return ret;. W3 A4 a3 Z5 W; m' z4 V0 g( P( | U
}
# ]" n& B* O, m) C4 Q4 U
2 u$ e5 Q4 R# t6 j6 J" p+ ^static void __exit led_platform_exit(void)3 g1 B% c0 ?! p3 j5 [6 w& v! i8 C
{# w P' Q* Y! g7 a1 W
platform_device_unregister(&da850_evm_tl_leds_device);6 S# f3 o Z+ r5 h: H
3 u! l0 r( W6 r printk(KERN_INFO "LED unregister!\n");
& a2 l5 G) F8 r- i9 `}2 L# [! _ k% @5 ^
9 }, }5 u: D+ x" Mmodule_init(led_platform_init);
8 i, B3 ^1 m1 p: X( q' ^+ l2 u/ }module_exit(led_platform_exit);
; t2 M; E' p7 \$ X/ h2 d* H: i/ H# n; [- N& S t4 M( @
MODULE_DESCRIPTION("Led platform driver");2 s% T. Y6 ]$ G! d9 r1 L( ` ~
MODULE_AUTHOR("Tronlong");9 i% R6 }; M: P! _; F' ^! z
MODULE_LICENSE("GPL"); K2 P7 D! E+ T8 _7 J
' l7 T' h0 q. [2 B+ k5 w. g/ A% f
|
|