|
|
求大神给下面的程序做注解,请稍详细些,谢谢。9 T \7 B. Z- t( b- T8 p# m
#include <linux/init.h>
. ?6 L+ \ G" v* _* I2 z# S#include <linux/module.h>
8 P+ g1 h$ R* G# P7 J#include <linux/kernel.h>
! K/ |8 y, v' j. B( H#include <linux/types.h>
/ \3 l9 B( H9 J2 L#include <linux/gpio.h>+ [- |, ^; M6 n+ |6 `; g# R$ W# _
#include <linux/leds.h>
0 |$ [( V' k2 @/ V#include <linux/platform_device.h>
4 }6 h9 f3 G' i# ?2 t+ F/ m3 V& h7 @5 _
; n3 `( N. I: x, G$ P" r1 \8 q#include <asm/mach-types.h>
2 M) w- G& ^8 g9 ~5 H4 S* x" o#include <asm/mach/arch.h>, c# @' ^6 t2 F
#include <mach/da8xx.h>
5 {: G$ J5 h& }#include <mach/mux.h>, l' @3 R5 G# ~' w1 {
7 Y( C+ e) M- H
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
$ d; A. t& Z% F5 V+ g6 A#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
, P5 f. s' q( \! ~) y" e9 F: q) j#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)0 d; }$ r( ~& m5 J
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 A f/ Y* f0 w6 ~6 z+ C3 f: ~; A+ H( w( L* _+ P
/* assign the tl som board LED-GPIOs*/* t6 `, m# Y6 R3 G
static const short da850_evm_tl_user_led_pins[] = {
0 N7 t1 y' _$ Q* K, r* d /* These pins are definition at <mach/mux.h> file */% ?7 i- C- x/ r! H. G
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,, A* \* [6 ]4 o2 k o. T
-19 ^4 C7 f9 G( e1 @' V
};: K3 \) k- U) ~4 p9 l* Y
3 b" ?# g) w: g# A4 X5 ]) Z+ ?static struct gpio_led da850_evm_tl_leds[] = {
9 U9 n" y' |- i- y7 A1 o {
" j' t6 R, |& E: m7 p .active_low = 0,
" e: j4 O3 t+ z, I+ i! S9 E3 r .gpio = DA850_USER_LED0,
! F% B& _! Q8 d) C: Y .name = "user_led0",% H: u" D& o6 O. Y ^7 w; V) V0 [
.default_trigger = "default-on",+ ~3 v1 e9 Y9 F4 f# X0 I, f
},' T3 I4 D) g6 y# @/ L4 z
{
8 I/ h G4 ^2 J! q7 } .active_low = 0,
7 H" h" C8 w1 M# I& |) W8 O .gpio = DA850_USER_LED1,0 X* K1 y: ?3 u! @% C7 B
.name = "user_led1",( p/ i# p0 v. x3 P" o( o
.default_trigger = "default-on",3 F% e) D- \& b
},; U1 d# z p/ b8 u
{
% j+ t' h+ P$ J; {7 R .active_low = 0,
- |% z% i s# N .gpio = DA850_USER_LED2,: G0 ]% A- n. T7 L% M3 Q0 G2 j+ h
.name = "user_led2",2 e( E9 @; M# X$ d$ v# O
.default_trigger = "default-on",; }8 w1 a& F5 w
},1 l1 X. Y w0 ~
{
/ g1 P, \ P5 }4 { .active_low = 0,2 P1 [" O' p/ z, B
.gpio = DA850_USER_LED3,$ w7 P9 p: i5 D$ X1 N. v
.name = "user_led3",
! o0 E# a6 z1 x* |+ E .default_trigger = "default-on",
/ D0 @, g& [4 s) ] },0 W0 }( q0 ?6 I
};
2 C) L" `4 c& s3 h5 V! r% ~
) u% r/ I. z7 |) istatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ Q4 l5 {9 `, U( A9 E8 l
.leds = da850_evm_tl_leds,
. |5 B, U2 j( n' t. _" F* X .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 w+ b2 K) ]% K" M
};* D, Q$ o' m) t* u3 h! I# t* m
5 O* _. K$ l/ Z! n9 b
static void led_dev_release(struct device *dev), O7 }; G5 ~) t$ r2 @4 n
{
8 }* I! l! k' j5 m. |};
- k& f B! \* K) |9 k+ H+ P; D. f0 {' Y- C
static struct platform_device da850_evm_tl_leds_device = {
4 H$ A5 S$ @+ @3 z .name = "leds-gpio",2 x% q; ? Q9 ~/ N6 j5 {
.id = 1,
: I: K5 L! D0 v. Z5 E .dev = {
. ?& v5 i5 D; b" u7 Y i .platform_data = &da850_evm_tl_leds_pdata,
" s. I- U6 `& V3 X+ Q& x .release = led_dev_release,
7 f, k7 h9 @4 \* K( p }
' ~0 h/ \1 K$ Q4 k0 l& e+ J};: p. ]/ W; T# `% n) p
! j9 G* R( w- Jstatic int __init led_platform_init(void) j% i* m# A; V) M% Q
{
* ^% b6 a2 t* R int ret;
3 s6 d) i9 b# i# |6 d. S#if 0. T) @' \+ F' `
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);/ Z) L0 E. |; d
if (ret)
. p- d+ w+ D' }6 c0 c) J8 D pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
9 a- n# y5 B. f6 Y- |7 H, F "%d\n", ret);) V0 `, S( {: Q- s
#endif- r, a0 v" ~$ z: [
ret = platform_device_register(&da850_evm_tl_leds_device);6 f( A) I& p! e' }9 n: x
if (ret)
+ V O! M$ o/ i2 A" l( Z$ h pr_warning("Could not register som GPIO expander LEDS");( R, G- F B0 d; @" V
else" y2 j' K; H8 v3 ~
printk(KERN_INFO "LED register sucessful!\n");
( h7 l3 ?5 X5 T; p4 }3 Z
# X; e" Y, n% s H4 _ return ret;
8 ]2 V" U1 S9 {/ \& |) P; P}' `9 f& i% H& w! J4 N" o! I. ^
) H( M8 w5 p" S, y7 R: H* n
static void __exit led_platform_exit(void)* D9 `+ \: F- h8 F
{
" i* b; W1 ~2 O$ o platform_device_unregister(&da850_evm_tl_leds_device);
1 R L/ ] \& I0 k$ _4 @6 @$ f% |4 o9 i9 J* d# v
printk(KERN_INFO "LED unregister!\n");& `9 V4 ]3 {! R
} H; `9 E- D3 `! H; i/ B$ G
- E/ g: q# K' J0 G) y8 t" d8 X) V
module_init(led_platform_init);
1 c7 C" H+ X( B0 d! Cmodule_exit(led_platform_exit);
: R3 |3 Q9 f1 f1 q0 F7 q0 [0 O% j; F- E) v2 {) T7 R. e! g
MODULE_DESCRIPTION("Led platform driver");
1 G; |+ x# P* }+ L; zMODULE_AUTHOR("Tronlong");
) k$ [- r' w- XMODULE_LICENSE("GPL");5 H% k) \2 g0 \3 L6 y3 A; o/ r C% g# O
7 V. Q/ p7 T" m A% P
|
|