|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
; J) S; ~1 e7 g6 J, C: q#include <linux/init.h>
7 \+ ^( ?9 q( [$ W7 H. e#include <linux/module.h>
( ]$ b! L/ V2 l& k8 A" C' i#include <linux/kernel.h>
' X& A2 v2 J8 o! L. v/ f#include <linux/types.h>
9 L4 B5 o/ {8 N4 b7 A- f#include <linux/gpio.h>+ S9 h" [6 B% A6 G
#include <linux/leds.h>
6 B6 ] j9 _. B+ l/ |#include <linux/platform_device.h>7 u' ~3 M; R4 e5 Z3 n) m" ~
! G1 B/ K3 ?, U! H0 u0 D
#include <asm/mach-types.h>
/ A1 ~6 f4 i! L" b#include <asm/mach/arch.h>/ j$ ~& o5 c. s& Y* v
#include <mach/da8xx.h>
# N/ u( q2 n) K$ m, F#include <mach/mux.h>
# T0 {4 ? ^2 Q+ [
/ |, U* I$ E: m3 V#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
* h/ \! L! L* f( @7 N2 N#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)& \, B' p9 x* ]& E$ X8 K: H
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). c+ N0 T$ u$ W7 G$ m! K( a
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 h$ ~" |- p$ U$ b# Z3 C
8 s" P5 H* ?+ _2 S- |8 A0 g1 W6 K* I/* assign the tl som board LED-GPIOs*// I# I9 o3 @2 Q$ b. B, U
static const short da850_evm_tl_user_led_pins[] = {. q$ N! v! |$ F2 R- n0 Y/ O7 m
/* These pins are definition at <mach/mux.h> file */+ w% x$ m9 P! j. N+ d1 c
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
* s9 G: y" g+ W r0 z$ K/ {6 A" ~ -1
/ g8 N/ S$ a q" e. l0 {. f};* f$ X9 h, j! Q5 E& X
$ k+ c! W0 R+ {: rstatic struct gpio_led da850_evm_tl_leds[] = {- @; k- r6 e1 _9 F8 Q" N
{
' Z+ u2 B- p. {! T8 U; e .active_low = 0,
1 }; E0 ?. M! F# e( L5 p .gpio = DA850_USER_LED0,
N4 L, U2 g! c) h .name = "user_led0",6 O3 q& f3 g4 Y! {; v0 ]" C
.default_trigger = "default-on",
; A* ]& q/ R7 s' }, c2 g; U },
& x$ O7 m7 v& F! K {
- e" w( Z& E+ ^9 l4 k+ u( D .active_low = 0,
" }" l0 f( M% S1 s( w I .gpio = DA850_USER_LED1,
+ g# i# {4 {$ F/ Q+ W# O7 E .name = "user_led1",7 {+ ]1 v$ b, L! @/ J& ~6 z; Q
.default_trigger = "default-on",0 l# S- l2 H4 e
},
3 T& y0 |8 J+ _ {$ W+ \6 k* y' S) z1 ?8 Y( A
.active_low = 0,
3 H+ Z4 b# l. K8 a7 `( o .gpio = DA850_USER_LED2,# R8 j k/ \) H
.name = "user_led2",
4 \3 e3 U* a6 L3 J .default_trigger = "default-on",# R1 S% O. ` Z7 G7 r
},. G# H5 k& v% O0 G/ D2 o
{: ~) q, t2 |% W( n# R, U6 q* e
.active_low = 0,
' K" I4 j M) S9 Y ^ .gpio = DA850_USER_LED3,$ U* @9 S* x T3 F8 V
.name = "user_led3",
9 n3 z( v* B( |! u( _- m .default_trigger = "default-on",6 ?0 t7 P' F( G
},
$ y+ X# L U7 V. ?7 `};: G% u" G5 @, A5 s7 H/ \, i: e
( X0 U" T% R8 y# B Jstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
4 P$ d8 t7 R& h* N# D .leds = da850_evm_tl_leds,
! l" e& A$ u) J* Q" P; c .num_leds = ARRAY_SIZE(da850_evm_tl_leds),: U% M5 T8 e, w/ V
};
, E& I7 {0 P1 D2 ~4 A; l3 P4 q k8 C3 R2 G! _, k
static void led_dev_release(struct device *dev): a1 }5 O3 `8 P) D& n
{
: v' r2 s1 H, J. Q1 P; `: F2 d9 s: D};) u, C% F+ r- D+ I; K
0 D6 G# X7 m% n; a7 lstatic struct platform_device da850_evm_tl_leds_device = {5 B, I; p$ d7 @" I2 N
.name = "leds-gpio",
9 Y) A6 N" d6 R4 w1 D .id = 1,
8 r" ?% f2 y/ L4 y6 t: _; S .dev = {
8 U {; ~5 V0 i5 w) k4 V .platform_data = &da850_evm_tl_leds_pdata,( n2 b2 A9 T8 T; f7 v* V
.release = led_dev_release,
+ o8 J7 T, _% h$ t0 a+ V }
9 W" _* V2 b3 `* `3 z6 i6 w};1 t! P( k5 B0 x( G
3 k3 Z5 D3 g' \0 s- x
static int __init led_platform_init(void)6 T7 J) c! @) B7 E# Z- x
{
3 |3 e( e" K5 N# m: B int ret;
% s" Y* e! W" |#if 0
% l, _* F* J! o. s+ n* V. E9 |" e# s ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);1 w# H& v/ ?6 V0 n. }0 l# N( U7 g
if (ret)/ }7 Q, K( W% E" e& r/ V
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"+ }; Z) o! X0 `# |/ W5 {1 ~3 q% O
"%d\n", ret);. o1 r; B! b" Y! S
#endif2 a7 I# C) k% `! {0 b. E* u
ret = platform_device_register(&da850_evm_tl_leds_device);
l- S0 A/ r( {4 M9 } if (ret)
) D J1 i9 b- T( M( z5 O& S pr_warning("Could not register som GPIO expander LEDS");1 g3 J* s: E$ s2 h
else
, c6 V# A% V+ [, \. v* v" v: k printk(KERN_INFO "LED register sucessful!\n");, L9 ]- b* [$ {4 Y3 r; F; }" b5 Y2 _
$ z5 v6 O2 [2 Q* W! @4 Q return ret;4 ?8 `) L7 ` n W% T6 j9 s+ s
}
, z" J5 ~- Y3 t: g2 U+ t) u
! {1 l9 G0 X1 u) B0 e: V5 _static void __exit led_platform_exit(void)! i2 E" G& H8 _" b
{3 K) R: E4 B# N/ L# W
platform_device_unregister(&da850_evm_tl_leds_device);
; F' `2 d. F. a4 X5 d5 k5 W" R
3 L1 H6 U7 f& _+ W% ? printk(KERN_INFO "LED unregister!\n");+ w+ z! u3 A# ^; |
}
! o3 e5 L1 J/ B' G
1 r5 a" ^' V0 G- n: L" Lmodule_init(led_platform_init);
0 ^. Q- ?0 }% M6 q7 n5 P Nmodule_exit(led_platform_exit);& M) e" _- D4 U1 Y; I) l) `1 L
x' N* s& O/ b
MODULE_DESCRIPTION("Led platform driver");: w" `! C& [1 Q6 H6 j/ P
MODULE_AUTHOR("Tronlong");" V& I4 @) p# a& R8 U
MODULE_LICENSE("GPL");
/ M! N9 e' p# V- W% G
0 ?" A9 k3 u; w, v |
|