|
|
求大神给下面的程序做注解,请稍详细些,谢谢。6 Z U3 ], b1 B8 L0 T) x
#include <linux/init.h>
5 X. O1 S1 T/ d% I2 X#include <linux/module.h>
, b, T. i* H: U+ h% @' p#include <linux/kernel.h>
& ?1 V x$ L# D2 A8 o#include <linux/types.h>
) a/ {& ]) Z2 t$ D8 M: o% \#include <linux/gpio.h>, D; C# F( u" D6 c: O+ W( o0 ^
#include <linux/leds.h>5 C" l/ w, h/ V4 L
#include <linux/platform_device.h>
! B% p0 V# [/ q4 y' q: S
U4 H; V$ x, ~* v( J#include <asm/mach-types.h> v% E7 S0 a0 Z6 g
#include <asm/mach/arch.h> H$ v+ `- ~! O$ o! Q6 x
#include <mach/da8xx.h>6 M' i8 t7 Y/ d) O5 L, p
#include <mach/mux.h>
) |( r/ }' n9 F6 k$ |
) N* [8 N5 F6 [+ E#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)/ B6 o) h% w7 m/ T
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5): A. _$ m7 Y, `4 y6 r
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
1 U9 Z9 x4 l: n/ ~( ]7 R) p5 k#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) w/ S0 l9 C5 L |. F; M7 b$ o1 I" J _; }) L0 x0 F7 S
/* assign the tl som board LED-GPIOs*/
: c3 N4 @' {* m; @static const short da850_evm_tl_user_led_pins[] = {
8 {. K6 q. O+ d8 b P. k( k. I /* These pins are definition at <mach/mux.h> file */ N0 p7 }+ O2 E' X& f" u0 b
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,3 n7 q+ N1 j* A& ~0 h( q
-1
5 B# J4 w" r* {};( `9 I# |) d( }1 v$ h3 b
4 u+ @! p' N5 }# Gstatic struct gpio_led da850_evm_tl_leds[] = {: P* H9 V9 l" `! p& j
{5 Y/ Z- t# g- ^5 g; b
.active_low = 0,5 G) q% c9 n( P9 n/ N. t. V0 }( T
.gpio = DA850_USER_LED0,% z& m7 V! j# d, J9 ?/ s! Q
.name = "user_led0",+ ^2 c* W' r: Z- s# x) F
.default_trigger = "default-on",
# f) o& c% n7 F1 ]" k8 v! ~ },( K; [ S" e0 z9 k& H2 N
{
1 f2 A' m/ ~8 T) K: q8 g .active_low = 0,
8 ]- m5 S) l0 q5 S .gpio = DA850_USER_LED1,
8 t8 \# Y) I7 ]8 @4 {! b .name = "user_led1",
: k+ ]5 p: U. P5 T, H ~% O .default_trigger = "default-on",
/ x& K i* x$ v8 u) \" p },$ A; {, \2 Q4 E, o2 n
{& ~/ b" v# ?/ }; y7 g0 ]6 S
.active_low = 0,
' b ~" t: J/ m- Q0 r& V- j .gpio = DA850_USER_LED2,, t4 z& l- ^9 g0 L# X' x: r4 s
.name = "user_led2"," u+ Y: y3 e5 o6 g+ G
.default_trigger = "default-on",
8 F# n E+ a5 H3 R },: g! N; c( T. c7 ]7 M) w/ @0 [
{
1 n; c {8 ` `6 g( N .active_low = 0, R8 n' D. Q, f. x5 r/ k- S% U
.gpio = DA850_USER_LED3,
8 V- N! N( X/ N% @. x .name = "user_led3",
5 r* {( F& p% B( C( h .default_trigger = "default-on",6 T* R2 n3 _" L/ p* [
},
, p6 K& X* r/ h2 D};
0 x3 l2 x6 T) N- i0 T6 v7 H3 I- L' k( w; v2 |7 z6 m$ J$ Z& y
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
% r7 u3 |. q, l* g: F, { .leds = da850_evm_tl_leds,
$ m1 d# h1 z1 I5 i .num_leds = ARRAY_SIZE(da850_evm_tl_leds),9 ~- D2 ~, {, z0 J
};* c# j8 |* U9 f+ w) {1 s# O
/ Y6 X8 ?2 _" O. z4 K6 _1 X: \8 Q
static void led_dev_release(struct device *dev)
; h: Z/ W. o8 C n6 Q{
* U5 F4 w1 l! d2 n U};2 j6 v! o; l2 O0 k+ z) c& Z
( b$ E3 L$ A$ a5 U6 @; `static struct platform_device da850_evm_tl_leds_device = {$ V+ R9 I. d" c& t$ W
.name = "leds-gpio",
% _- j6 _! ^/ ]( |* k; Z .id = 1,: T5 ]- J; D3 U, N/ u
.dev = {
4 |" {3 f7 B1 i8 m .platform_data = &da850_evm_tl_leds_pdata,
5 {; x0 C+ K- m+ @7 p .release = led_dev_release,
, } Z) M' B# h2 r4 C) l }+ r6 n" D7 {; v
};
7 d+ z$ \: G/ B* _, W; ]$ I: E; \; n1 Y A8 y: i+ {
static int __init led_platform_init(void)
6 ^' s0 ]. p; ^{1 A; }8 p* t' X" G
int ret;
7 J. V1 k" I. v/ `. S5 X#if 0
0 V$ j& @; u+ v7 }! b- D ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);# \, i& c+ W8 T6 i
if (ret)) }+ T) }5 [1 Z- E/ P$ B& W
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; a5 w$ A$ H! `
"%d\n", ret);
& ?$ P3 e, ~6 v8 W#endif
: W. h9 w$ h/ O" R+ A) } ret = platform_device_register(&da850_evm_tl_leds_device);) p. m1 \# s# o2 C* Q
if (ret)
9 `$ q ?" j( ?* t) ]; o; u pr_warning("Could not register som GPIO expander LEDS");) l1 x( ^6 E- |; t, A! a
else2 E( y/ ?% V1 X0 m
printk(KERN_INFO "LED register sucessful!\n");" E# ^ m, J( J+ d# L( V
4 u& ~8 Z; v& M return ret;
9 l) \, i- W ?* p: a}, O) w; x: H# W6 f
0 d4 L+ @- J5 Y* t3 ~; N/ c# b
static void __exit led_platform_exit(void)8 f$ A& G! [- V6 x8 r. j
{1 @, H, d& n) o7 B5 g S. j2 h
platform_device_unregister(&da850_evm_tl_leds_device);
# ~+ H3 H& k7 M+ D* e8 J3 i& k; D- S& T8 _; i$ _' g: }
printk(KERN_INFO "LED unregister!\n");8 I9 b* M" u; K% n- L
}3 o3 Z% C( m- B G: K$ L! Q
$ }$ q: k+ Z! n. O; l' Tmodule_init(led_platform_init);# w" V2 l* w6 F4 {2 J. V
module_exit(led_platform_exit);
+ @% H& M T; a9 w' T r. ]' n# S7 b) I% s
MODULE_DESCRIPTION("Led platform driver");
! g& B% G" t! x# {* EMODULE_AUTHOR("Tronlong");/ a* O) B# w P" o$ K6 q4 r" [
MODULE_LICENSE("GPL");. V, z3 k g- r
2 f2 \" } w9 h4 p( W |
|