|
|
求大神给下面的程序做注解,请稍详细些,谢谢。2 |: v: t# y* G7 d1 O3 G
#include <linux/init.h>
/ v8 G3 l4 x z4 j4 ~#include <linux/module.h>. t3 L9 ~- ]0 [6 F
#include <linux/kernel.h>
# t5 O/ e6 {. B! i& E% h#include <linux/types.h>% ]( e7 C$ f0 V* Z B
#include <linux/gpio.h>
2 ~2 H6 f; n/ `1 Q3 {#include <linux/leds.h>
+ G9 m: {5 a$ D5 o7 g#include <linux/platform_device.h>- O1 @4 ]$ y+ p4 `
+ X% @. o3 F0 j4 t9 F6 v0 G
#include <asm/mach-types.h>* m' |2 k0 D- ?# `5 E/ P7 O
#include <asm/mach/arch.h>
) X# Q: O5 U) O ]; ~#include <mach/da8xx.h>
9 z9 m7 J1 f6 g: Y' H#include <mach/mux.h>
4 C1 p" I1 m0 r# [2 o+ V* G$ g- C9 O1 J5 p" ]1 c d" n
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& {6 d; e4 @4 [' n, P6 V
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
7 d5 M k2 [! S" L- c0 I% g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! O. x/ V! Y2 C( E#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)9 p8 Q3 Y6 O# |, M$ O& t
7 `3 h( f* R( Q8 t5 G
/* assign the tl som board LED-GPIOs*/' ? ~- q' @/ Z- _
static const short da850_evm_tl_user_led_pins[] = {
1 u# r' R, W- D+ o1 Z" h /* These pins are definition at <mach/mux.h> file */
, G: R# Q$ M9 m6 e; P DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,& a% k$ J' F4 h! I# P, k Y/ i$ s0 Y
-1
6 m: N1 v. W( { n( Q& G};0 q# L& s0 |0 i6 z, Z. s
, x) d+ f6 d* T0 Y% Z4 B6 _
static struct gpio_led da850_evm_tl_leds[] = {
# n8 V4 `' m& }+ ?: y K {6 P, ^8 @2 ^ W% l, ~/ k
.active_low = 0,- H) \2 Q( n# L9 d( `& X' S8 Y
.gpio = DA850_USER_LED0," U( h* K7 W9 j2 J- E q
.name = "user_led0",
+ a/ j3 Y3 n5 W6 M% i3 ] .default_trigger = "default-on",; p8 E3 `$ i2 f4 p
},& n5 P+ l7 q. T/ b
{
3 C+ H% X& A, N, J1 ~6 a% W# K& N .active_low = 0,4 O$ V" X9 W1 k/ \- X- d- u& z
.gpio = DA850_USER_LED1,9 X; x6 \% b# C9 ?9 z% V# U* U
.name = "user_led1",
# G, U6 o4 z9 h* y .default_trigger = "default-on",, ^6 Y' h& p2 s
},& W. k* @& X. V+ V9 \2 a
{
4 b; }% }. a( ^0 E8 ]* y: \ .active_low = 0,
7 o k% X0 y& W .gpio = DA850_USER_LED2,: |" G( H0 ~( y4 k% u
.name = "user_led2",% a2 x4 _. J* M# w
.default_trigger = "default-on",
% g, E" n* Z9 S },
5 e8 k8 q" W, W% @* G {8 w+ ? _( T+ X
.active_low = 0,& Q9 Z/ _" u i1 {
.gpio = DA850_USER_LED3,- {& B# u2 n: _( {+ V9 a
.name = "user_led3",: v4 u; l1 {7 L8 D3 N7 r# s
.default_trigger = "default-on",
' c' ^6 B, ~# ~8 N/ a* b. } q },* V; r/ i" H- z) L, `
};
5 G/ M" G+ n. F4 j' G1 ?& \6 y" m7 i' W; p
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {8 ]$ E* K# T7 G8 |- F; I+ g- @
.leds = da850_evm_tl_leds,4 ?4 D: j3 g- ]. b9 F8 V
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 l, g2 s9 h, P4 p2 r1 ^) x};
3 w4 ^3 z, a% v& _
( i! x3 _8 V3 Q% mstatic void led_dev_release(struct device *dev)
; t: g) L* u/ s/ j( ^. K* ?{
& {1 ]3 u/ n2 b2 u8 c9 U/ ]$ [};/ N+ Q1 D% |: @! ]2 s
) k0 w# A$ A# ^ l0 k
static struct platform_device da850_evm_tl_leds_device = {/ D$ C' q: {, X. c# }0 {8 A
.name = "leds-gpio",
* f U' X1 E$ g9 O1 }; t" Y .id = 1,/ @5 F7 a- {* m2 s& `9 n
.dev = {9 T. K+ a/ ]3 K6 G% N% n0 s- v( k
.platform_data = &da850_evm_tl_leds_pdata,
0 |5 z0 e: i! @( h .release = led_dev_release,! i( B5 R2 z/ H* P) r
}
, _5 L* x9 ]: _( u3 W. W# {! _: r};
( I2 }/ s. L) b& P# L7 T: O9 k( ]/ W, y# B) i$ |
static int __init led_platform_init(void)) ~* L, @; y9 k* ^
{
; e8 t: ~( R4 R; Y8 s int ret;; L, [# |7 Q( E5 {6 D$ y6 e1 r
#if 0* g1 @/ o7 t1 |- S& m* d7 ?
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);, }" A* f( [3 K5 O
if (ret)
( b6 H. V( m( N( s$ y9 E pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 ^: d3 w% ^6 X$ D" K2 u& i; K "%d\n", ret);
6 x2 g7 Z3 J% H0 ~0 X) y4 [#endif8 P/ d( G! B; ] b
ret = platform_device_register(&da850_evm_tl_leds_device);
3 A$ |8 G4 M0 F! o if (ret)( h. O7 b1 h8 r6 m
pr_warning("Could not register som GPIO expander LEDS");6 @0 S* r( V! L! L
else; _4 d& o. f0 z$ k
printk(KERN_INFO "LED register sucessful!\n");
) d; h) Y6 h+ s1 X( O% u. z; k- `) ^8 E n
return ret;2 h) x6 I6 i0 m2 U3 q0 b5 H* V' M
}
* V) W+ z7 R. B( @$ N9 Y, V
# B, o1 W, }! z! o. `" |% F6 Nstatic void __exit led_platform_exit(void)
3 k2 M m8 @7 Q: L; l7 R; L{
2 {1 Q6 f7 a& i% y0 U platform_device_unregister(&da850_evm_tl_leds_device);
( ?; U/ x9 A0 H! _
" y9 y. j* Z$ g/ O9 o4 t6 p printk(KERN_INFO "LED unregister!\n");
: B1 C. s3 L- W6 w9 g G- }( s}
2 @ Y/ F4 I% f, D- |
3 c; Z1 W' J5 O6 C. K& wmodule_init(led_platform_init);
2 T# Y# E$ E: e8 I* ~+ Umodule_exit(led_platform_exit);
/ w& d' Z4 u0 n4 S$ } c8 a1 X) g8 I1 p# q0 ~
MODULE_DESCRIPTION("Led platform driver");
) [4 e* L$ S. z# W& ^0 zMODULE_AUTHOR("Tronlong");
, D8 T. i' n8 v, I$ d% N! jMODULE_LICENSE("GPL");
1 a" a4 [& n1 C( U* t; a. Z2 v) I0 s) X5 v+ |/ _
|
|