|
|
求大神给下面的程序做注解,请稍详细些,谢谢。( Z* L$ o/ M# k$ L: W: ?7 |& V4 B: C
#include <linux/init.h>
3 x+ r/ z7 D% N$ ^4 Z5 S#include <linux/module.h>9 z3 \! t# C5 K" E+ X o- f' U
#include <linux/kernel.h>
- @" f/ H( f8 I. A# z#include <linux/types.h>/ [4 v. C) o7 h$ t/ c0 j& Q. l! }
#include <linux/gpio.h>0 g7 J1 `6 P2 Z; y
#include <linux/leds.h>0 H3 ?& F" H8 i* Q9 {! M1 x
#include <linux/platform_device.h>) i) V8 F9 N. @ W' ]
. `# p+ y) m0 n/ Y9 [8 y#include <asm/mach-types.h>) @6 n C; f2 D9 p
#include <asm/mach/arch.h>
# O" y0 t0 d N9 N! x9 b#include <mach/da8xx.h>, k7 g# {( q6 X2 e' N# [
#include <mach/mux.h>
- B& m. M( ` \3 a, K: y$ f8 D# j7 R5 f& {
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
) M0 b! o0 U2 G4 B#define DA850_USER_LED1 GPIO_TO_PIN(0, 5). C; U; g. ^$ R1 ~# K
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% q8 P/ f8 y9 v/ }: a- ]#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
/ a# P3 b. @2 N/ [3 l/ U* y" n, @, G$ Z# t/ g( j& G
/* assign the tl som board LED-GPIOs*/
3 r& e# F% d* v; u8 ?static const short da850_evm_tl_user_led_pins[] = {
/ a/ d% @ M* M0 M. I6 _0 h /* These pins are definition at <mach/mux.h> file */
% x8 ]' S- {, o DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,) s, s0 K1 b0 k% z: N
-1) M/ {3 m2 w" Z4 l
};* E ^/ m6 B# j/ c
5 Y% x7 L2 L; `% q. V
static struct gpio_led da850_evm_tl_leds[] = {& `* p8 [0 f6 ?: l
{
" w2 y( g$ l( N .active_low = 0,; z, n0 t2 n$ l4 }/ Q1 u
.gpio = DA850_USER_LED0,# o* U4 J- ^5 y% Z7 ?3 `
.name = "user_led0",5 b3 S5 B7 s% l4 p7 k2 i+ H
.default_trigger = "default-on",
; i0 Q2 E& t' L: Y) J7 h# u. M' x },7 c$ H0 t/ d# G( b, o% }
{8 _' d! M4 n/ e3 M
.active_low = 0,6 M! j2 a' W8 m
.gpio = DA850_USER_LED1,
+ }: B# f8 c6 p; k- M .name = "user_led1",
1 j2 F4 v( g: u .default_trigger = "default-on",$ A- }5 h+ G0 Q# m; U' R* P4 [
},
5 h% U X* U8 W8 X+ J; d {
" j8 a4 z y6 j/ k( A .active_low = 0,0 c7 o1 {7 R/ X& a2 r3 H0 p2 I
.gpio = DA850_USER_LED2,; p! H( \/ g5 y
.name = "user_led2",
\- ]4 r% a! P3 u# Q- w" v .default_trigger = "default-on",
( E9 |! T8 s. m$ E/ m },
Q. [$ l& _# |2 H: ^; G$ k8 m {/ C& N0 m9 ?+ A4 ?9 @- N
.active_low = 0,
/ m/ h2 R- T2 z .gpio = DA850_USER_LED3,2 @3 R, h& K# u+ x. G
.name = "user_led3",
q7 }: z' x3 U$ u/ S7 R .default_trigger = "default-on",
1 e& ~, t( K4 k8 c3 W- X },
C3 O6 e' S/ m* j1 M};4 t0 B6 D' k C5 t8 }3 ~
& P& J8 g' ?* p ?) _0 s8 U
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {: D+ q0 l) j& w2 M
.leds = da850_evm_tl_leds,
. y* f! {& G+ x .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ z8 R, P. T/ q! B8 E; A) ]};
$ o: U; p7 d% t0 d( o7 X! C1 X! z- V3 a
static void led_dev_release(struct device *dev)# |4 F$ E, ]0 S% f! j3 O) E
{
. ?& [+ H% a& t5 v};1 k, r2 z5 d9 e8 l* r
, X, ~5 h, ?) D. ystatic struct platform_device da850_evm_tl_leds_device = {4 N3 R3 e1 x9 J! h/ m; k
.name = "leds-gpio",, W! I+ T/ f \- G8 x1 c. v
.id = 1,+ {4 b6 t: S& h# a# e
.dev = {) j! Y0 \" f7 Y+ }% y
.platform_data = &da850_evm_tl_leds_pdata,# P) L, \* ]3 H
.release = led_dev_release,2 a( P2 i% N6 d5 @1 |1 x/ H
}
! a/ g+ X" q8 v};
8 P- \& F* B, U' H; ]4 ]7 O( l2 z; [4 ]) |+ \
static int __init led_platform_init(void)
% T+ S( y. C/ U; T! r: S{
' B: C# Y6 E" V p" Z- _: s int ret;
; ~/ m8 F. j* z% Z4 c( A" h( _#if 0* V% }8 e* M" e g
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ R! x. F( B) t% G' ^* _0 A
if (ret). ]4 r z, @- z( B; y
pr_warning("da850_evm_tl_leds_init : User LED mux failed :": u( b" c8 ]+ o" Y
"%d\n", ret);( z& O% b; @4 g M/ d8 A6 R1 {
#endif
4 |* \% E( }6 \% o* n" o5 @! ~ ret = platform_device_register(&da850_evm_tl_leds_device);
c3 B. _1 \4 u5 \* H if (ret)
$ A1 D {& Q l; ` pr_warning("Could not register som GPIO expander LEDS");8 m( |( H( i; N6 @% H2 B
else
% G$ @' |( n. H7 A1 o printk(KERN_INFO "LED register sucessful!\n");
7 m8 \: q5 M! q: \" P6 I
. B2 n) Q8 _; V5 G& k! a4 T return ret;0 l$ H. F0 q* n0 k# r) k# \
}9 n6 L- j+ o- ?9 C
6 P+ \# m: L. q" }5 m3 S# Q( {static void __exit led_platform_exit(void) v F* c/ P4 P% g5 b
{
( r! r/ Z# U* W& E6 I9 U2 m platform_device_unregister(&da850_evm_tl_leds_device);+ m5 E! P6 e% k9 F3 I, w, U
0 a2 [& C0 E" I printk(KERN_INFO "LED unregister!\n");) Z' l4 k" D, _1 p
}
- q ?2 }: g& b3 i' Q z5 F
! h1 I- H, o1 F: i; W* mmodule_init(led_platform_init);! _) W+ ?/ H& u. X5 T8 q
module_exit(led_platform_exit);
c+ {5 I! ?9 q2 x, i/ g- V% B8 Y
2 w4 e( d i# D- w- r. {MODULE_DESCRIPTION("Led platform driver");/ }& x4 M4 Q/ [& w: m) n8 s8 V/ j2 X# V
MODULE_AUTHOR("Tronlong");+ r" M5 j% L( j
MODULE_LICENSE("GPL");
2 Q0 x2 W8 w& y/ m6 e9 M
1 m+ N# k* r6 C+ n. J |
|