|
|
求大神给下面的程序做注解,请稍详细些,谢谢。% o* z5 f2 f/ P. F' R8 B: n
#include <linux/init.h>
0 r8 U. t% C# w+ H+ A" a) \#include <linux/module.h>1 I [! J% h0 a$ {9 c
#include <linux/kernel.h>
2 j- k( K$ V6 ~#include <linux/types.h>! z7 Q! a. ]0 b3 E% }& t8 W
#include <linux/gpio.h>
+ o+ c( _( W9 s#include <linux/leds.h>
: P; q+ B2 [" d( E) V- s# T7 d/ o#include <linux/platform_device.h>+ b) O% e' c4 B" w
8 F4 H e/ \4 u
#include <asm/mach-types.h>
1 w/ J% `) w& _; a1 b#include <asm/mach/arch.h>* t$ r% W1 [) V8 B; B3 ]
#include <mach/da8xx.h>6 U2 k7 W4 B: q& X
#include <mach/mux.h>
& q0 F1 l, l X% w: x+ i0 I# O9 {" b5 N* j# ]8 c% D5 ~# @5 m# |
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)% e' L% r# u/ S$ y! L {7 M
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
; @# G6 v. P; Z: p4 h+ Q- K#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
' L/ [. V8 Q! K" U2 Q+ F#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
" ^9 W# _ E& e* u8 C& {) x# p+ i7 U' J: Q8 d
$ I% c9 F% h8 N! C. D% A, j/* assign the tl som board LED-GPIOs*/
5 ?) T5 R+ z) n1 lstatic const short da850_evm_tl_user_led_pins[] = {
3 T* d/ n! |9 g' g* \ /* These pins are definition at <mach/mux.h> file */
9 z. c. Z2 Q" c% m/ s4 x! t( M' t& Y DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
; |& j& _9 h, D) [) y -1( Z8 l5 W% f% `. f' i* d4 ]
};, F4 c: i! ~. N/ d2 j0 k8 r6 [; D
" b) |% S2 F1 R* v# zstatic struct gpio_led da850_evm_tl_leds[] = {
- X" Y, S$ D) o$ l6 T L a {
% @+ g( U9 C$ q' Q, R) e7 G" J .active_low = 0,
0 @: r2 m- D5 K .gpio = DA850_USER_LED0,% X% A1 Q$ J* x
.name = "user_led0",: c/ H3 C# {0 H
.default_trigger = "default-on",2 ?" z" l! T; E9 J
},/ a8 n2 P: x2 w( @
{
! d6 T% } ^3 @: p' ^; ~2 L .active_low = 0,7 N/ ?- D5 A4 T8 g
.gpio = DA850_USER_LED1,4 _- j; v9 }. y0 z& P2 t
.name = "user_led1",
; E4 u% g& i& Z% A .default_trigger = "default-on",
6 K: C4 d. @# S" u },
0 W* Z' S8 r o; W% L8 c4 B' N {9 @0 R+ \3 L5 ?+ o2 G
.active_low = 0,
6 R! {+ f7 i6 [ .gpio = DA850_USER_LED2,0 e4 a7 M8 y' F ^; F, \, G& ?& f
.name = "user_led2",
: G) ~, X" L: q7 L0 M .default_trigger = "default-on",
' L4 P# Y' V1 K },4 z8 [+ _' k( O6 M* k
{ C8 M, H) O( l( x2 `
.active_low = 0,: x& ^3 ?; A( h1 W+ G- b% I
.gpio = DA850_USER_LED3,
) `% @ Q( r& T% e! d9 h4 |. i .name = "user_led3",
# h: e# a4 t) {) j .default_trigger = "default-on",
( j; V& \. m _/ x% Q },
, j" K1 b7 ]6 o' Q};6 v4 d1 U, u0 `1 j' b1 f. M
# k& l4 C# m+ o
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
5 A5 V [9 y. ^/ h# L5 S% ] .leds = da850_evm_tl_leds,
7 s- t6 T$ T. a/ \ @4 L .num_leds = ARRAY_SIZE(da850_evm_tl_leds),5 v& A( Y* r W4 K9 }
};
9 ?3 `# H; A: @. w
* e9 D$ Q3 V% L1 k- W) u/ xstatic void led_dev_release(struct device *dev)
7 G9 W4 ^' B: ^( w{
, ]" Y1 @. [% [, @};
0 V ?% y" X) w) W# a9 }: {) t2 U5 Q6 L- u( ~" X# |& x) E( m
static struct platform_device da850_evm_tl_leds_device = {; u K2 D/ X! u; {0 \* M( r
.name = "leds-gpio",1 @/ j- B) ]# t5 i! x* C$ i
.id = 1,4 \' @# H2 j4 B, h. T6 T- h
.dev = {+ t: T0 T* {1 y( w9 ~ x
.platform_data = &da850_evm_tl_leds_pdata,
p& q& ^7 e; @* T$ ]$ p2 y! |; r6 v .release = led_dev_release,
5 c5 A$ q) z+ e( K0 e }
- x* G. x6 e; Y* h. i};
& A, i0 [1 J/ {, V
3 S7 s- R4 ?1 c. l. jstatic int __init led_platform_init(void)
5 e1 M6 d( v8 Z& ?- n- \( {{
5 Z4 ~0 s1 [ ? {1 m% H: k int ret;
/ L3 J' \( y6 A+ v0 g, }" k#if 0! C" v, f3 K2 x! _& \: T7 B; }
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);* L: j! ]; v( K G6 P
if (ret)
# X' d: ]9 a4 i( Y; ]/ _( X( y pr_warning("da850_evm_tl_leds_init : User LED mux failed :"& z3 H# F% L1 O% m- u1 K8 c& Q- b
"%d\n", ret);
/ t" C9 i8 G6 ?1 ^$ z3 P6 D#endif$ ~* F b: c1 m5 o2 H
ret = platform_device_register(&da850_evm_tl_leds_device); v2 p+ v$ i- p7 L& p
if (ret)! F# N$ w2 O. x$ s5 K# r+ R
pr_warning("Could not register som GPIO expander LEDS");5 O; D% y, B2 @5 [4 _1 a
else
0 z! `( A. A4 M6 p; ]" t printk(KERN_INFO "LED register sucessful!\n");3 `1 O7 a5 O( P0 q) x8 h
& c8 m/ O! y: c( D5 |5 }6 G0 e
return ret;
" V. A% U6 U" O% `7 ^}1 |5 I7 p$ V9 p9 y) r
8 g. c* g9 I6 {( n1 q6 z/ [" r2 Q
static void __exit led_platform_exit(void)
1 z6 b/ Y9 s8 [- K6 `2 a{
- Q9 @$ o# v. D* | platform_device_unregister(&da850_evm_tl_leds_device);% e5 O0 ^1 x( l) l3 @- g1 b8 }( s+ F
& L7 b1 s" F. g2 C+ o
printk(KERN_INFO "LED unregister!\n");
% h8 {* ~) k6 z* Z( }* p3 m' }}! [9 }3 ~- p% l2 E2 B* M
8 R. v5 c1 A* e/ L E/ i8 u$ P* M& ~: y
module_init(led_platform_init);
C1 ?; d5 y" a' `$ \0 _- K# Emodule_exit(led_platform_exit);
w6 y; U2 }! l, t& T( H; D7 k* X! E4 y- }
MODULE_DESCRIPTION("Led platform driver");9 A$ n* g( Z: C9 K" X- P/ h
MODULE_AUTHOR("Tronlong");& P% V5 h- W G B2 F
MODULE_LICENSE("GPL");; E6 a/ @! W' W5 z# Y/ Y9 P# a4 g, q
; j; g7 \- `( q/ c
|
|