|
|
求大神给下面的程序做注解,请稍详细些,谢谢。) ]3 [' Q' k$ [. j) n) e
#include <linux/init.h>
9 Y! c3 L7 C* ~% W7 B6 x#include <linux/module.h>
?- N$ I0 i& a& N7 ]' H#include <linux/kernel.h>
; ]0 Q' p0 i$ g6 `* h#include <linux/types.h>6 a- B' T+ z% K' P( O
#include <linux/gpio.h>
% {! x! S3 k9 l#include <linux/leds.h>
8 W1 z) O/ i0 j8 d5 f#include <linux/platform_device.h>
, \, L0 l/ j8 x
! M1 O9 x4 c' g' {% {8 t' J#include <asm/mach-types.h>; J1 k; A1 {# g' q: q; y. i! Y1 P
#include <asm/mach/arch.h>
$ {; ~! ~7 B- q( N0 s( R9 J#include <mach/da8xx.h>
8 {$ N0 B" b2 X( j) D- }! Q9 {1 A$ X0 w#include <mach/mux.h>
2 K' A6 w9 N$ ]4 f. M2 j
0 ]' X+ c+ S' ?+ K2 n#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
# h* b) n5 \% M& }9 D @#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ \% E* [& J3 ?* f
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1), T6 K: J, N8 n6 B
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
+ i* N* O! f$ V6 @3 l* Z" ?1 Z2 g! e+ G" A
/* assign the tl som board LED-GPIOs*/4 X+ f8 C6 ^0 c' `
static const short da850_evm_tl_user_led_pins[] = {
: l- f7 B5 n* G3 s /* These pins are definition at <mach/mux.h> file */
- Q; T8 ?/ E) R' d( Y DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
7 o+ O5 ?( }4 S# w -1
1 `/ T, C5 R: K: ~: N};
* f4 Z; f# d [2 \+ x/ P
?( Y+ }& D9 G8 r- A. wstatic struct gpio_led da850_evm_tl_leds[] = {
V9 {, p9 D, ~) w4 A8 S {
4 U6 [/ m: M! Z" R. q8 t .active_low = 0,
* I: }5 d0 f6 n* I0 Z .gpio = DA850_USER_LED0,0 ]) n( `7 D& C# D
.name = "user_led0",% L7 S" x$ E- b4 A& ~7 w
.default_trigger = "default-on",9 H8 o9 _7 q0 s6 U. x
},, A2 \; w/ G, Z- a8 z! Q
{5 n+ d4 r2 k: [8 k
.active_low = 0,% p G1 v, V6 J* P
.gpio = DA850_USER_LED1,
, Y+ _( Y9 M/ h& G/ R! E* I6 O& C .name = "user_led1",5 S% q% `4 B& D- O# J
.default_trigger = "default-on",
3 k" `2 S4 F! z8 C2 ~0 C },/ Q T( I# P2 z o/ k7 m0 n+ }2 j
{
# _2 D P4 f* L3 T4 S .active_low = 0,3 F8 ]( f9 h8 r
.gpio = DA850_USER_LED2,! s; K! r7 b6 M, u5 a* m# z
.name = "user_led2",4 C: u, U( B* H3 |1 Q% \' h' ^
.default_trigger = "default-on",
& Y3 ?: ]. X2 E5 x },
( s2 k) z0 S; R$ w6 g9 P4 n8 J {
% J( y( k9 g1 h2 O .active_low = 0,) }) l( z* y! m( L1 J
.gpio = DA850_USER_LED3,+ y5 U( c! i* B+ E, _
.name = "user_led3",- s' W3 e6 S# ` s/ P2 _, ~7 F
.default_trigger = "default-on",
5 ~: c: }/ [) {% ^! j; C8 j6 D },
" Q, P8 {6 k: I7 f3 z};
8 E7 B+ `! O) f: V4 R7 ]+ n
# q, j* N2 b! Y0 P% M. ]7 l. m" bstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {: a! T( P, l% o8 N
.leds = da850_evm_tl_leds,7 u6 X" ?: c: C. a4 N8 ~$ {
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),& K D% j8 Q. @/ U( Q& J
};
& K0 R- q5 i) k% ]2 ]5 v" d. f5 H3 O$ w, E' t a; [
static void led_dev_release(struct device *dev)
/ E6 z8 w. |; s+ c{
- g1 j) B1 M& d1 f1 X" M. ]};! k% {" R$ h0 q" R) q
/ y8 ^$ S2 \6 ^; A* Cstatic struct platform_device da850_evm_tl_leds_device = {) \2 v" P. t6 d+ m3 j. _. T
.name = "leds-gpio",. ^& P& G( h$ x
.id = 1,
# F% l+ H) R2 r7 B5 r; ]+ ~ .dev = { g8 A" Z1 X( ~, E K% S
.platform_data = &da850_evm_tl_leds_pdata,8 C/ X$ T6 I, i
.release = led_dev_release,
; j7 F. z4 I- H( | }6 ^) t' m- O G# u4 E
};
2 v- {+ ?( b8 f2 A. ]
" L5 x- q( T) a; {static int __init led_platform_init(void)
2 u1 J+ {; L6 M* v' M4 Y2 {{" K* ?. u: Z/ [2 D
int ret;4 q. M4 I& m0 |2 q2 @- X: N
#if 02 q* C6 Q6 d( A% `2 ^/ v
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
3 c. [! Q2 s. F: w# u* H3 } if (ret); u. E9 V. V% M+ W/ M) ~2 c
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
$ Y5 k. v7 x# ^& j3 I0 b5 R" p "%d\n", ret);
, @0 w# c( D8 @' B1 c1 i/ C#endif; Q* ~$ T2 p) @& H0 s
ret = platform_device_register(&da850_evm_tl_leds_device);1 I5 p5 M: a W' Y
if (ret)
1 o* J; S: W6 l- s4 `+ Y7 ~" @% |$ J$ a pr_warning("Could not register som GPIO expander LEDS");
" [ V) Q. r* W9 ~! a1 e else
3 C+ V5 [" ]9 g d printk(KERN_INFO "LED register sucessful!\n");: F- \, b% I) g* ?. F) ^0 \3 ]
" w8 V4 @+ F8 m- V5 v" K return ret;; `0 y7 C4 [/ j) s9 ?
}+ Z$ Z) u- N$ t0 v$ d
( H9 L4 I1 u/ [static void __exit led_platform_exit(void)
" `9 n0 U% R7 n6 E( E, w{+ J7 R! y1 \) ]; e1 i
platform_device_unregister(&da850_evm_tl_leds_device);
' {/ w( J" q/ A: Z- o
9 o) [( m+ C1 N' c# H3 F printk(KERN_INFO "LED unregister!\n");
2 I P# e( d# v& M z7 {' q}6 ?% `% z# b6 e$ u& B9 V, n+ F! q
" q. @9 p0 B# N. ^module_init(led_platform_init);
9 X) W n6 u% ^4 Hmodule_exit(led_platform_exit);
2 n# z8 r( W; d* D* n% ? O
3 Q- d1 f: A4 j. ]+ U% X/ Y5 i+ MMODULE_DESCRIPTION("Led platform driver");
/ ?* {, F! T1 q. \, a3 kMODULE_AUTHOR("Tronlong");% G3 M9 q# V' a8 V0 z
MODULE_LICENSE("GPL");
+ @1 n4 {( ^1 S4 l( t3 J$ M
. e% M N" o- H" z |
|