|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 _! D) y* _7 v8 D+ x4 L#include <linux/init.h>/ _+ n) }+ Z% R2 e- W _- f
#include <linux/module.h>! g, c9 {; t) F" y0 x
#include <linux/kernel.h> K3 W' x8 m3 Q4 f; L! V3 c; _
#include <linux/types.h>4 r* M" z& e, R# N8 Q, l. N
#include <linux/gpio.h>1 S$ A* d* y4 Q! \
#include <linux/leds.h>& S( ] `! P! u2 y) n8 t5 |
#include <linux/platform_device.h>: h5 d4 ~* \# T! u8 w+ N% ^
0 Y" n2 k0 q' p- J2 X( L2 O- n
#include <asm/mach-types.h>& X' q1 M6 \* c! @: O. A; Y
#include <asm/mach/arch.h>7 p3 Z. p4 B; w8 Q- q. y( i. U
#include <mach/da8xx.h>, O4 h& x2 q0 D
#include <mach/mux.h>
, i0 H- L/ m2 r `/ p' S+ l" k; j. t) P$ J
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)& T9 s) J; [7 J# E5 ~
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)* s( j1 T, \7 O6 M) d* w
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)0 ~6 g% B5 I1 c4 W7 [8 {% z
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
( _, s' ?6 G! w1 J! B4 N& P
t! s) W y/ \! Q$ x/* assign the tl som board LED-GPIOs*/
- k# P( ]! _& |4 Y0 k' C/ p$ [static const short da850_evm_tl_user_led_pins[] = {
# U* M- e- G8 U7 t& [- ` /* These pins are definition at <mach/mux.h> file */
; f. q3 q; ?3 r% @) r+ X/ {. B DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
6 Y) t/ t# c u' e -1- `# r3 J T2 ^* J7 a# E
};
7 o# X6 L: j# h- y7 C
3 v; U8 | u- T! X+ r# X1 b7 Ystatic struct gpio_led da850_evm_tl_leds[] = {& J$ A6 e2 K/ _. ?3 e" z; L
{: E* L' Z0 t" E
.active_low = 0,
0 F. S. E. b0 ^4 A .gpio = DA850_USER_LED0,
' R( u# V% ^7 H3 {( }5 b/ X .name = "user_led0",
1 D1 H1 f, Q+ j: }3 S .default_trigger = "default-on",
8 R# m2 z0 X( C! g( \" G. ^! ^ },
. K0 X4 z" R8 F( v8 G% H {
! x# l5 [6 s& s7 P1 |/ N* E! Q .active_low = 0,
1 W" h3 A9 \/ y- Y5 M .gpio = DA850_USER_LED1,
5 v3 R' [# g" h# a3 Y# R E .name = "user_led1",4 @# D" f j4 t2 I+ N' P7 w
.default_trigger = "default-on",* L! |1 c" ?' K+ V8 @) Z
},
$ `8 d; s2 B+ v/ J {" K1 X' \$ M7 G( ^. Y( i
.active_low = 0,
+ X" k: e2 j- B$ z .gpio = DA850_USER_LED2,
- f2 y" T: u& j' ^6 h5 D1 k, P .name = "user_led2",
! t2 A8 {6 ]9 \ .default_trigger = "default-on",! |) y# d8 O" w
}, C/ [7 M8 s- A& `
{& l% C9 r( s1 L! x
.active_low = 0,
5 ]' x: R: l, b& x6 X .gpio = DA850_USER_LED3,
4 _" t& I( e5 q r8 ?6 O; j8 I .name = "user_led3",
1 I I% y h2 o: H2 S8 b0 o# D .default_trigger = "default-on",9 p2 W. [+ U) `) ]$ b
},; j% O' _7 V7 d+ `& ~: d7 e
};& ?" J! y Y/ r
+ V; E& n* F/ a' f& k' gstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {0 ~$ M! ]6 U3 x U: a6 s
.leds = da850_evm_tl_leds,! z% ? M& t. y* \' _( D4 Q* f
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
3 }" X: a' a# I" a. G};
( G9 }/ \1 p: I x* t1 g- s. V! `9 f" O
static void led_dev_release(struct device *dev)
! r* ^/ Y6 d: M3 W{! |0 z3 b8 L: M/ ?- v
};7 r6 U8 T7 s6 s, N6 R$ p
# d* _4 V: B/ U2 y: Q8 X( }' L- ~
static struct platform_device da850_evm_tl_leds_device = {
3 s! ?% r. u- g' J .name = "leds-gpio",% U: @; L9 b1 r8 a2 Z* ^
.id = 1,
1 d5 @& K, l2 Y3 B .dev = {3 S& h$ {' ]! B" L, R8 J3 X8 `9 b; Z( d
.platform_data = &da850_evm_tl_leds_pdata,
% ]5 g& [5 J% w3 ~, Y' p .release = led_dev_release,; G2 Y4 Y4 l1 @4 A, P7 u7 p0 q `! \4 n
}
. R& o$ \; b, V' ]};. e2 n7 W& `; u6 {$ a
3 Z9 d% b5 \; u" J/ ~$ C
static int __init led_platform_init(void)3 ], o7 u" F1 I, v | {
{
Z- y5 r, S' n* N8 ?0 y, P/ ]! S int ret;
1 J- l7 {- F$ }#if 08 f; s/ B3 x8 I4 i8 L* K+ s, R
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);( d7 @& ]5 h9 Z7 O2 Z! [2 M3 ]" C- Q
if (ret)5 _6 p' O0 V4 W# e
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
4 K4 |2 \' y) n6 W. ^ A$ w "%d\n", ret);
7 ~7 S8 P. Y0 I3 v1 H4 V6 G#endif# M" s0 r1 j, e& r7 m
ret = platform_device_register(&da850_evm_tl_leds_device);
# S3 F* R8 u$ s6 F if (ret)! [5 V( J$ p, k
pr_warning("Could not register som GPIO expander LEDS");) O) \# Y% X- Q9 h& c) ~
else
6 \! \* Y% q5 q$ O8 E" l+ Z3 q8 C- ? printk(KERN_INFO "LED register sucessful!\n");
7 t4 D9 K' _( k
+ d A1 T: h0 U2 Q return ret;3 @! q* `( @9 O/ x! s
}. P# c) t5 Q# h8 G
/ ~- h+ ^: a$ ]; x. i* j
static void __exit led_platform_exit(void); v( p2 K$ W6 W. |! m4 K$ f
{* E6 h8 F! Y7 V( Z* i/ V5 h
platform_device_unregister(&da850_evm_tl_leds_device);
N) ^$ I4 A7 m2 B/ n/ [0 N5 i# T
9 v% b% c7 w0 Z# ^- D* ?; ] printk(KERN_INFO "LED unregister!\n");
6 v6 F# y% F2 O4 A: p}
; T+ o) g2 x- W8 d2 n+ l$ U' k% i, T w& G$ G4 R
module_init(led_platform_init);
6 J& n p( i% hmodule_exit(led_platform_exit);
- i+ `7 o9 \0 O9 M' M4 M
% v) `9 V6 n- [MODULE_DESCRIPTION("Led platform driver");
6 ]5 ]: K* _& c+ EMODULE_AUTHOR("Tronlong");7 p( U. ~8 L) B" y" j
MODULE_LICENSE("GPL");
5 c% e9 @1 P* ~3 k: u
1 |. K* D' N. q# C0 @, O6 W) ` |
|