|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
. J/ N9 Q4 h! k+ A1 i/ u2 b/ b#include <linux/init.h>4 e' h, Q8 B" C* O
#include <linux/module.h>7 c3 t) E* D( w! z. m
#include <linux/kernel.h> ]4 B- Q1 E) i2 H1 f. g
#include <linux/types.h>
1 Q. L) G( W* F#include <linux/gpio.h>
+ }& z% g* q ^! Z#include <linux/leds.h>
, D! c. _ |( J#include <linux/platform_device.h>+ r) {* b6 N" J5 T: i
- r U! k" `8 C( I( a* Y#include <asm/mach-types.h>% p1 E w' @4 O' C8 E' A
#include <asm/mach/arch.h>1 \6 r/ V9 @8 L! k x* ] [2 E
#include <mach/da8xx.h>
9 R! T+ n1 r! d# Z3 M) s# X+ F#include <mach/mux.h>* H9 O+ E. t9 V4 e" T: v7 P$ ^
/ \! O' V" j! g0 r' l& `#define DA850_USER_LED0 GPIO_TO_PIN(0, 0); O1 b' x" @5 M2 W6 q( B* g9 c3 q
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' ^& a, D/ x. n* k. ?. [3 ^8 N
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1). R( _: X8 q! E6 W- h0 v
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
; e6 v4 e: o9 ]+ s. x0 {" ~
$ B5 F4 d6 \4 s* n/* assign the tl som board LED-GPIOs*/
! I0 ]8 Q/ J3 o3 G; \3 b# bstatic const short da850_evm_tl_user_led_pins[] = {
n* T% a, E# w0 l /* These pins are definition at <mach/mux.h> file */
" |0 z* r0 g/ E& r( |4 N DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,& _5 l$ D& T3 l0 T8 V6 K4 L
-1
* s0 w& s' \# n# B' T+ d4 d# N};3 B" W5 n* W; K
# c4 n! ?# ~3 m }) O" B# X
static struct gpio_led da850_evm_tl_leds[] = {
, u: T/ p$ G( K* N0 z- V {
/ {! y) W( G* m% {% k .active_low = 0,
5 i( n' C4 j: U9 N+ N! T+ C+ x .gpio = DA850_USER_LED0,
3 O& t P, v( s: |! m0 ?9 ` .name = "user_led0",' }+ Y( D' u% F7 V
.default_trigger = "default-on",
! X% q4 U0 D( ~ },/ o/ q) m$ P; _6 A& i3 F. i
{! D o2 A+ p# w6 S1 w6 [3 g
.active_low = 0,
- O2 l8 Q- o0 N! Z, k% A5 [ .gpio = DA850_USER_LED1,6 r; Q0 u f+ f
.name = "user_led1",
! j) g% h+ _3 z% q/ a6 o' \ .default_trigger = "default-on",
, T# N4 k, D7 S1 J1 Z0 L },
# v& \/ v, Z @7 N3 D m4 k {
9 C3 T4 e1 G! C& n# J# [& f; z .active_low = 0,' l! X) d* E! I9 p m' a4 y
.gpio = DA850_USER_LED2, M& \4 V+ P8 K
.name = "user_led2",6 B8 c/ C. L+ U$ s( p
.default_trigger = "default-on",. I, r# ?: C# M! [1 C; Y
},) ~2 s* |$ ~: ^3 O" J
{
2 t+ Y# |, M' n( Q: k, \( I .active_low = 0,+ H2 n+ o o/ T; H( c. D p; ]" F
.gpio = DA850_USER_LED3,
; r9 l: j- O0 S) h) t& F .name = "user_led3",6 I- k: O6 [, o6 e# c. ]
.default_trigger = "default-on",- A# f3 `2 r( ? L! Q9 O: L
},
- N4 L9 i: f, g! Y};
4 q$ ^* `: Q4 V, b5 ~( J* M; n8 I) Y j; O' L7 g
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
. I' R( j2 s. }9 S: L .leds = da850_evm_tl_leds,+ O$ C. v5 G7 G+ D
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),6 j1 S; W$ t' n. G- W5 B& B
};' O7 W, N" F) E: X) H5 H( w E# _
- `. ^) u/ S& R( f2 E8 S1 e! o
static void led_dev_release(struct device *dev): [6 u& n' x, ^1 i8 ^- h7 e1 X
{: y6 ^3 j1 P: B" E5 b
};
5 m+ d6 M# q+ K; K5 z4 q/ B& n- W3 A/ e" ^3 W
static struct platform_device da850_evm_tl_leds_device = {
# j% `% K% j/ s! { .name = "leds-gpio",+ |9 q/ }5 k% o% n9 r
.id = 1,
4 C; A1 o9 r8 M' n$ _ .dev = {
4 ^9 y4 M) l6 r1 a4 J% K" \ .platform_data = &da850_evm_tl_leds_pdata,
* N6 z' A2 B% h5 h .release = led_dev_release,& y: f0 ^. K8 p7 k2 a5 e; |0 Q. [! u
}
9 f9 U* u% N) Y9 P5 w6 K};
. P; L; s) }7 }+ D8 S
6 b1 @/ T* H$ }/ M8 o3 Jstatic int __init led_platform_init(void)- {) V* k' x" l/ R6 y& D
{, o: X( Z, @5 ^! Z
int ret;
* y0 e& j" D. t; |" ?& ^) i; Q#if 0# Z1 z' Y1 t3 F$ i$ l# z( a3 R% d3 O
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 E3 K0 q+ }; t7 a& n+ F
if (ret)
0 R3 D& r. v7 U( q% V pr_warning("da850_evm_tl_leds_init : User LED mux failed :"! J/ ~, i5 x: z, K( l
"%d\n", ret);3 l% U8 @$ K" S
#endif
+ v p1 n6 b; h7 n; B ret = platform_device_register(&da850_evm_tl_leds_device);
$ E7 {' n6 B/ m# M9 e if (ret) d* l& G. I/ m5 [& I
pr_warning("Could not register som GPIO expander LEDS");
1 }! V& c3 R. x5 g2 B& p- K7 D5 l8 q else1 }2 F: i7 }) R' N# `5 L4 m
printk(KERN_INFO "LED register sucessful!\n");- j5 y! |- y( \4 q1 k7 A) _
. `% a$ C, {4 t/ o3 P6 j2 | return ret;+ f$ u: C1 q/ B9 k
}
! W8 L0 d/ w s" u! x2 N% }
4 M" p2 }8 U" Y- E% T! e, @/ o6 `static void __exit led_platform_exit(void)
& m( i' D: S8 \+ l& x, p{
. W3 K7 l- |" Y! J platform_device_unregister(&da850_evm_tl_leds_device);$ t- |/ r; ]9 t3 O' w
$ S1 Q" D3 P* c printk(KERN_INFO "LED unregister!\n");! S4 D {6 r' L0 K4 U' Z* A% }7 L' k
}6 V9 G; D6 D8 [! @
2 t) w6 |* C% o3 f- ~module_init(led_platform_init);4 g& J. d& R( D! r+ _6 o
module_exit(led_platform_exit);
( O6 E* E! ^) D2 x% ^7 E0 c- \& j) m( o# y, r7 j
MODULE_DESCRIPTION("Led platform driver");
: r# |& C; } z2 M3 D( MMODULE_AUTHOR("Tronlong");& M; C& G# O: h2 f0 n. T1 @- |7 c1 [
MODULE_LICENSE("GPL");8 Y% P! y; k; P6 t) L
% b* C8 o0 Q9 G7 y/ p* _- {
|
|