|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
( g( i, Y: k5 e) ?! m, O#include <linux/init.h>/ |- N5 V9 Z) h X3 S1 Z
#include <linux/module.h>
! i3 A k" i% |% {#include <linux/kernel.h>
8 f) c) \: p0 i4 z' N2 P4 `3 e! A#include <linux/types.h>" C5 H* L A: ~* t# p# m
#include <linux/gpio.h>2 ~3 `- Z: Z& G' }! W0 t0 P
#include <linux/leds.h>
% K6 }, o6 C, b r4 g#include <linux/platform_device.h>
- G) X5 g$ H8 l' v$ U0 m$ s5 c* S) l
7 `" ]2 S! ]- S: ]& M* ? V#include <asm/mach-types.h>
/ a7 W* l! z) U& H$ K' c4 s#include <asm/mach/arch.h>. e! _% G( O4 m3 S+ g" r
#include <mach/da8xx.h>
" {3 O$ ?5 P. e g3 d* c# W3 Y) z2 c#include <mach/mux.h>/ u: f, T' v! W$ n O+ r1 G
( ^1 u2 X) x8 ~3 S% K#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
4 N- n4 M" v8 }$ T y#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
/ K4 S3 ^, }1 ]+ S8 h& T# ?! K4 k#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
: o( m1 N$ j5 ]6 l3 B) E& `8 Z3 `* B#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# q8 V9 p7 F4 b4 N* L
* l2 |' J2 M7 F+ S4 ~' g* Z/* assign the tl som board LED-GPIOs*/. b' {" H% i# N, ]* R* N9 ?
static const short da850_evm_tl_user_led_pins[] = {( j0 Y% K5 I4 K& y) j. @
/* These pins are definition at <mach/mux.h> file */, M- b2 H* c$ B/ N- h
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,: X4 N: c$ R1 ~# ]. x1 i. u
-1
3 K: }% l) g- U$ [- ~# v% A2 O};. }* X! U( d% V1 ^
' {- Z f! F6 Q+ i) W9 S# [
static struct gpio_led da850_evm_tl_leds[] = {$ O- X% d$ D; u) W7 l1 { ~
{% O4 v; a/ y( P S E1 J
.active_low = 0,
( O) Q/ m6 j/ x$ f3 x$ D; _ .gpio = DA850_USER_LED0,0 }( B; o; w4 _" T3 c1 s5 o
.name = "user_led0",5 _8 D" H; ]% ]+ Q" Q
.default_trigger = "default-on",
+ u& Y. L [1 R' z2 a% I x' D; ?4 R9 v },+ p5 L( ~% D3 U" M
{) n2 t: M: N. a N$ D0 h
.active_low = 0,
3 B: o* s# Z2 o' [ .gpio = DA850_USER_LED1,
; L' A5 W9 B+ X6 o2 B .name = "user_led1",: Y' g- A7 x. \- G
.default_trigger = "default-on",
5 z4 C8 m1 Z& i' k },* {2 w0 ^9 @ k! r; s
{/ E, u- a; b. Z5 c) H6 [
.active_low = 0,% o! b1 J9 D- Q6 F) B5 m
.gpio = DA850_USER_LED2,8 C8 R& f5 o; E
.name = "user_led2",
: l" E; _& E; h5 C# C .default_trigger = "default-on",
( \! a1 `# w+ R" g },2 A. p: B$ A7 c* b* A; h' E
{4 J5 O" O: F% E/ n4 r: x2 m2 G
.active_low = 0,
3 {2 r& r: H, r; j+ N .gpio = DA850_USER_LED3,
! \: |/ y) r4 Y. W& s7 ~9 C( C2 l .name = "user_led3", ]. q3 F& p: \% ]& n
.default_trigger = "default-on",: K5 n, n0 F4 Y0 A* {/ [
},3 v! T1 I* `! N+ R8 v8 w
};9 x+ n& `7 R; k; L; y
8 a' Q$ z( k+ X; Z5 l# U
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {2 T: V9 R3 ~$ ?( ?1 G' P
.leds = da850_evm_tl_leds,5 O9 W }* a# y: ]3 g- J4 B
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
* Y$ Z! R- T/ c};
4 B" ~0 F9 m6 r2 g; l$ k) d, p0 K* t; a9 ?
static void led_dev_release(struct device *dev)% |4 P& ]2 l" z0 m, g. p0 [
{
2 l* |( v6 R+ r* S( p! }# v};/ `- [: c% u$ ]
6 A. l' C& j6 w# K2 u, @static struct platform_device da850_evm_tl_leds_device = {8 q% u* p! P: s* c6 z! h
.name = "leds-gpio",
5 g5 |9 l: B/ T2 |$ e% ~) C .id = 1,
4 u* G5 z4 s4 H; r! v. ]# `. ~) y .dev = {
. X% K8 w: m' M( M .platform_data = &da850_evm_tl_leds_pdata,+ j i2 n. u, p L
.release = led_dev_release,
; w: h' b) N2 x }
+ ]# q2 N9 M5 n. I( z7 V, P0 W};
( x7 _/ ~5 `, G$ ]5 S
) ]3 A0 K- E; E7 R$ q3 J1 sstatic int __init led_platform_init(void), E9 h& I' `( Z2 y! Z
{7 o, D _- f: [5 v$ b) b
int ret;
A1 S& S% i! X# h#if 09 {; `* J) \" V
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' }: u ]5 H* m" B) ?; `8 D7 y if (ret)- O1 l. `. e& h# O* [0 w
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
1 w2 ~0 p3 h& U1 z "%d\n", ret);8 @5 f7 l' ~8 X6 l, F
#endif
( p3 U" r2 {3 g. B7 l1 ]! s* u0 I ret = platform_device_register(&da850_evm_tl_leds_device);
8 v( o7 }5 e" b if (ret)
" l+ g! G+ l' f( u5 h* ~- Z pr_warning("Could not register som GPIO expander LEDS");
1 s+ X+ ]' L* Q/ u/ ^$ {: W! g else" g( g/ k# ~9 [, J" {# ^& S
printk(KERN_INFO "LED register sucessful!\n");
1 [) Q8 c+ S! B5 i X+ U0 K# \8 a1 ~" h; n3 B; m; |
return ret;; W t, s" Q) }1 \3 ]$ `
}( D4 q7 a( c0 O
0 K! D* ]" `7 o/ b0 Zstatic void __exit led_platform_exit(void)% z: `8 U) d2 T+ Q4 W
{
% I+ a+ M% @& c! H( N' T6 o9 u platform_device_unregister(&da850_evm_tl_leds_device);; q4 p7 m0 ^* E a/ v( ~
l- ~: n, V/ a
printk(KERN_INFO "LED unregister!\n");
1 ]$ o9 v, M( E ^, B}. B: b1 X `( j$ _; o
' I N7 a0 [- a0 z$ i. R
module_init(led_platform_init);
' W: f, T+ v/ G7 F+ k1 Fmodule_exit(led_platform_exit);, I7 p4 h* F& O3 V/ O: G! R2 {5 ^$ F
Y; W4 D/ s1 B4 S" r, T) [8 {! bMODULE_DESCRIPTION("Led platform driver");4 Z7 V" _+ Z+ L; w" y
MODULE_AUTHOR("Tronlong");( X' n: B- f6 w4 _/ @$ v
MODULE_LICENSE("GPL");/ s. X9 u; P" |( M: I# a
" o; S. n7 ?* u4 E& z! `% }* y1 `3 f |
|