|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
4 Z: l% |4 n; X: S1 l2 ?#include <linux/init.h>! s. P! H! Q% s* R+ i+ X
#include <linux/module.h>
& L4 g1 A( N) e' a#include <linux/kernel.h>
- `) q( J, A) `5 w. E2 ~#include <linux/types.h>+ X. q y( p8 i: L
#include <linux/gpio.h>$ `! a$ ]# V* Q# D& n( `9 e; _
#include <linux/leds.h>
5 |! O+ C0 n/ U3 h. q2 ?#include <linux/platform_device.h>
8 m* V- ~2 V8 J+ }4 N0 b$ K% o& v9 q6 ~+ r1 W3 x4 ]
#include <asm/mach-types.h>' t3 F) i( b' q# { a! K( u
#include <asm/mach/arch.h>' P# q# W' c, z# m% y; W6 {, V
#include <mach/da8xx.h>) `8 ~3 S5 w) m( m# M% z4 ~
#include <mach/mux.h>
* v M7 m$ h: X& K' V8 S0 g
0 t. l" X, o. R4 O' S0 a$ a+ J H#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
# k0 E/ X6 Z/ a' K* J. b#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
. L0 x* L$ Z/ r4 `9 A2 _4 S# R4 `#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)8 r; |# x" L$ E8 D+ Z; j% x( j
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
1 w) D# u$ ]* H
) I3 T/ y8 X' q9 C& m+ o* v2 @$ v! s/* assign the tl som board LED-GPIOs*/
( n- h3 d$ ?. L. ystatic const short da850_evm_tl_user_led_pins[] = {
, w! r; N& @* ~- y /* These pins are definition at <mach/mux.h> file */8 @3 M3 _4 x2 k6 Y& U
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
4 k V0 I: r# ]% E5 c -1
8 l/ L9 e9 \! B- W5 P5 j% Y/ Q6 U};
3 [* C$ X! _( r4 Q1 H# \
7 W( X0 ^4 _( G6 P, ystatic struct gpio_led da850_evm_tl_leds[] = {
8 E' h1 n# \7 M {- b7 P& K9 q1 a O" E8 ?
.active_low = 0,
2 F' y: N+ `& ` .gpio = DA850_USER_LED0,
, @4 e& _8 `# s+ }8 _& n& E1 I .name = "user_led0",
- L7 A" h' v G5 j5 y5 } .default_trigger = "default-on"," `$ _4 U1 S( X4 @+ R. L$ s
},& M. C, C1 K+ D
{* i7 a& Q) \" }! x
.active_low = 0,
% n1 o/ u- e5 k3 M4 \0 U .gpio = DA850_USER_LED1,
6 c+ ^: F( x6 c0 U .name = "user_led1",/ Y9 p4 E8 N V7 p6 u4 l
.default_trigger = "default-on",
- L$ j) P$ V) p+ Z, f5 ? },
+ a3 W, ]1 V7 H6 p$ k: u: t {
% C$ n+ o7 ` w) `6 ~" v+ K .active_low = 0," t# N- k. N e' o$ C- @
.gpio = DA850_USER_LED2,
+ n: [+ W3 U$ @3 T2 @ .name = "user_led2",9 b+ ?9 i8 _& W' ^. u
.default_trigger = "default-on",
C$ N1 l2 R& }. p' @ },
5 c+ @/ s1 v G {
) r6 b' A( r# ~0 E+ v6 b0 Q .active_low = 0,
: }1 q" I2 E6 o8 U8 ~ .gpio = DA850_USER_LED3,! o$ i- I# V' q" v
.name = "user_led3",
4 J# a" u2 v5 _- K# T- v .default_trigger = "default-on",' V& u- O/ m, r; K# `9 C& M
},* B7 J; q1 d% B5 u6 Y, \
};
0 B' {8 _9 S# Q( D
# H J1 q* G3 l; @static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
P. m3 j6 ^3 \ .leds = da850_evm_tl_leds,# l* u; y* r e3 P3 g
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
N& \# @2 }: x T& y. \: G};
$ i; M0 R2 q1 J) p3 v4 o( B
: W5 I/ A9 ~5 G* Q: I$ f$ g& Ystatic void led_dev_release(struct device *dev)
3 A$ p, `9 j# x+ E6 N{
8 B" G, d+ O! p2 {};7 Z# q B" B2 z/ Q
5 S* A2 I; A) I! e; j8 \ [
static struct platform_device da850_evm_tl_leds_device = {
6 z7 @: C# ~: }! b .name = "leds-gpio",6 @8 f/ Y6 }! d1 M$ a& J
.id = 1,
: J! C* }& H* a0 P3 H .dev = {
) c/ U+ K+ m2 I7 X( ?/ }; {; f .platform_data = &da850_evm_tl_leds_pdata,
0 D6 h1 \1 z$ R5 V .release = led_dev_release,3 D- S \+ a8 a5 L' X2 U
}
% T6 w5 f$ ]1 h7 |8 q! [};
" E+ A' H, P+ e Z& v: ~& S+ g0 j& g- N! i1 N1 b+ Q
static int __init led_platform_init(void)
/ Q( |) }+ F0 E( a9 l. @( r{8 C% s* o3 W# u5 [
int ret;$ v& k1 L" u$ W4 v& Q& R- ~5 i
#if 0
6 x* O0 Y- X( u& Z4 c6 x ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 B8 D* n/ p) |" x I( ? if (ret)
! X$ K' Y5 s- e3 M" j9 f8 w pr_warning("da850_evm_tl_leds_init : User LED mux failed :"2 ^0 f% o8 |6 f
"%d\n", ret); L$ @& k4 H: {( f- o
#endif2 Y) C5 |$ [+ _8 x4 {+ S' \. n. m6 Z
ret = platform_device_register(&da850_evm_tl_leds_device);6 B/ i! P& e$ b. g7 a
if (ret)
5 ]; Z# b+ w% J$ A pr_warning("Could not register som GPIO expander LEDS");
( | r3 z& g8 n& Z0 x! v else+ F% }/ X0 D4 L! g& I
printk(KERN_INFO "LED register sucessful!\n");4 f2 R; s7 @/ B* F# ?9 v, j
4 J' C7 d3 p8 E: K/ R
return ret;
# ?; T+ a8 w4 w2 M! x}
0 Z1 S5 S: H9 ~6 k* S) G8 m" }7 g: ]8 n( S: Y, W( K9 }
static void __exit led_platform_exit(void)
' M8 @4 ^; ~( e* e+ \6 K{1 p" Z# ]- o2 q N
platform_device_unregister(&da850_evm_tl_leds_device);
; C4 B" q; y9 _" T4 i" y. i: z8 j$ D; q/ e7 O1 D, ]* H. S+ s- ]' F1 J
printk(KERN_INFO "LED unregister!\n");5 Z$ F8 b3 `% q2 B' ]3 V2 [3 A! f
}
& u j, @3 ]* c2 ^- @4 [0 u1 D1 P+ f) e1 T1 B9 l
module_init(led_platform_init);0 |5 c2 g0 s2 u+ @8 C7 L8 q
module_exit(led_platform_exit);
0 O# P$ @+ p9 h; R9 V, |
9 H0 F+ L) X' W6 v/ n, y; l$ E, HMODULE_DESCRIPTION("Led platform driver");
2 u9 x2 I4 e Y2 w6 y- SMODULE_AUTHOR("Tronlong");
) y! r n6 r' B' b, \3 v XMODULE_LICENSE("GPL");8 h. L8 v4 `. ?# R/ t
8 y @5 f- r" M. E+ r |
|