|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
3 M8 k! p, M" C& a$ f/ K3 Y- E#include <linux/init.h>
7 D' Q) e5 y6 Z- k, D5 Q) h/ r#include <linux/module.h>
) p, N7 e. m( q& ~, Q$ p( g( x4 d#include <linux/kernel.h>" B2 {$ s1 _0 R* m2 P; i- x5 t7 J9 p
#include <linux/types.h>
5 {. ^, D- u; Z1 W* R" _' M# W! @0 v#include <linux/gpio.h>' T5 a2 ^, ?6 I, ]- m
#include <linux/leds.h>8 H5 D ]. ?6 O* c) }
#include <linux/platform_device.h>8 R. M9 a0 t9 x* r" a8 ^
2 k$ ? e( A7 k z8 Q
#include <asm/mach-types.h>
" ?- P+ u, _7 ?# V#include <asm/mach/arch.h>1 z* o, E9 F- Z. @, {5 Y2 ]
#include <mach/da8xx.h>
& ~3 I% [+ P: t#include <mach/mux.h>& n' {( x: s4 K) l( M5 W
1 c' P! ~; m) G+ v#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) ~- m, [- A; C. ]6 Z#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)* N( o7 e! @( P" e4 f* ]
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)" Z$ a% A+ Y6 y( C' Y! c/ y& i
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 f1 ^* k" x2 o9 W: ]
! M( T9 ?: O5 H4 T/* assign the tl som board LED-GPIOs*/
, u# ` T. X5 t0 ?1 {: b4 tstatic const short da850_evm_tl_user_led_pins[] = {
" ]0 g' D7 ?4 W8 ?- c, ~ /* These pins are definition at <mach/mux.h> file */
! W: F, j: O, f3 W9 z0 c! \ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 H8 B3 F! F [( ^
-1
( M5 j% ^0 ~! _" v- L) F};
8 O1 J( k b/ x! M
/ D' U( F! W( `, mstatic struct gpio_led da850_evm_tl_leds[] = {
$ g# E* R5 H1 N6 O+ Y. p {
. i* l2 S& i1 c# |8 T8 u5 q .active_low = 0,
6 b8 |. Z6 [# j9 z W/ R .gpio = DA850_USER_LED0,
" [. ^! u& I% ~5 d: V& {/ n7 Z .name = "user_led0",
' [1 e- W4 _) |' a .default_trigger = "default-on",% k& p3 z0 O" o! P; c) V- Y+ M/ K
},; |' H9 X* l/ N2 l
{
+ y. W' M9 a! @- ^9 j/ q .active_low = 0,
# q7 d$ p+ _; S$ C .gpio = DA850_USER_LED1,1 z- p# g* x5 B% R7 X4 Q! W
.name = "user_led1",
0 O% ]! K! {% e* j' O0 u% r5 M3 ?5 n' b .default_trigger = "default-on",& h( ]! W! `9 A2 m
},
4 s6 k% H* k! r8 }1 B$ s {9 M2 ?( ]% w0 J' {3 _
.active_low = 0,- M/ J" _+ ^/ E
.gpio = DA850_USER_LED2,
5 l! A2 G/ n: Q) j, [! s+ b- ~ .name = "user_led2",( i# X9 ?- N! V. u
.default_trigger = "default-on",+ {0 \- s+ A' H7 M; K0 ]7 }: j
},
& N4 f; [! f7 `+ W% }1 Y& h; F3 N {% S# j4 u* g0 M6 @/ P1 u- ]
.active_low = 0,: q9 J- }( |' v5 O7 q0 g: F" N
.gpio = DA850_USER_LED3,5 ?* V* g( |" s y
.name = "user_led3",( z$ B/ Z0 q" i, G$ k" @6 ]
.default_trigger = "default-on",
0 I! g, r( d$ F' z4 E2 N) u },5 m% x( M$ U: Y, n& a
};- _; E5 ]5 m- H9 U0 j; J- b
4 G" y8 n/ U7 _1 w! p) I3 D
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {% r1 Z0 D: W) O/ Q& h
.leds = da850_evm_tl_leds,& A+ l7 C) K1 x* K
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. d$ V. Y( I; s7 o};
9 o# l X) [0 e W- Y3 h& W* @9 Z4 F9 w
static void led_dev_release(struct device *dev)
6 s& K, j" }5 x8 y{
+ h& @3 I+ S" G4 C};% o) G3 @- k8 `
: H* d1 I2 D7 k8 x5 R7 o) Fstatic struct platform_device da850_evm_tl_leds_device = {- j9 ? m9 c7 |% W8 C
.name = "leds-gpio",* T2 ^" y1 P% f/ z% p2 K! V8 j6 z
.id = 1,
3 E( }/ c. Q4 B7 U l .dev = {6 \; y5 x! l# a2 B
.platform_data = &da850_evm_tl_leds_pdata,( r# @9 j. n/ C8 y/ k
.release = led_dev_release,
; r' m3 L% u1 j% [ }! _9 E+ x9 a! o Q1 o# l
};6 M) y- j+ r$ J% [- P; a
6 i+ ^) Z$ D" y$ b! @0 Astatic int __init led_platform_init(void)
4 W( Z) p/ D5 L/ v% j# |& A' {{+ K1 d7 x) g' F1 i+ R
int ret;9 I; D3 C$ J+ \9 h H
#if 0! f* k6 ]# n6 B k! \" c/ C9 m
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);& P' q6 a0 ? k# L" L; S
if (ret)! c2 N; W4 L, ]
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"8 B( ]2 O5 u2 A8 f4 O8 z' e( i
"%d\n", ret);
# H6 D( b v* Z# M#endif" a/ r, S( B! |; {3 N: q9 {
ret = platform_device_register(&da850_evm_tl_leds_device);* G2 H2 @# c; P3 y. M
if (ret)
' M4 U# R/ \9 J2 R. \4 F0 A' L) F pr_warning("Could not register som GPIO expander LEDS");
7 D9 w/ |4 c8 W0 E* n else& e' V0 ^9 X% Z' p" V( E' O
printk(KERN_INFO "LED register sucessful!\n");$ K9 u& Y6 \5 L2 k5 p( ^. j
" a6 P- n2 q: R$ j
return ret;
$ Q+ G, k6 b4 C/ z}% b- D/ E2 S+ q- @: T3 g
( j6 l+ n1 L Y/ n) K! x3 z
static void __exit led_platform_exit(void)
; c* G7 `1 {! y$ J9 X9 b1 R% D$ p{, j9 J5 N- f* U/ [4 ?
platform_device_unregister(&da850_evm_tl_leds_device);
0 D4 y1 l+ l! H: M2 r3 A" q( q' E( w X+ K; Z
printk(KERN_INFO "LED unregister!\n");
3 D) {8 ]5 k! {# V/ U( J+ z}
- h! }! U3 C6 K/ p0 _: t3 y/ X0 f5 j/ L# r
& A! u6 [) F0 j& P- E1 u% a- _module_init(led_platform_init);
7 R1 s4 g: c, Jmodule_exit(led_platform_exit);; `$ f4 I2 X, D. s: ^
* `1 G( n& q; M" g2 y
MODULE_DESCRIPTION("Led platform driver");/ X. D0 B' Y4 u' \+ Y4 e1 z
MODULE_AUTHOR("Tronlong");3 J2 Z$ ]) L8 r. G" G9 {3 q- \
MODULE_LICENSE("GPL");
W/ `2 _% d4 f
& |0 ^/ r7 U! H) {+ w0 Q6 Z. P |
|