|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" @: k5 B" c$ r8 s2 Z$ H0 l
#include <linux/init.h>: m7 [; G2 J8 d; d; E9 o
#include <linux/module.h>
; e- U. k/ }: ^6 S% Q#include <linux/kernel.h>; m1 T/ ]1 F6 ~# u2 |/ e) G- C- J
#include <linux/types.h>
( u8 Y5 ]% Y9 p( k, R9 L#include <linux/gpio.h>- Z$ R9 ]0 \9 F9 i! D' F. Y
#include <linux/leds.h>
/ S$ f) F! L1 ]$ D J7 z#include <linux/platform_device.h>3 t/ d! a4 ^+ y4 `/ ], j
Y/ ~/ _, L6 s; p' W( A
#include <asm/mach-types.h>
}: X& j+ W( J! k- O* Z/ s' w( W#include <asm/mach/arch.h> I. N/ K/ B( L2 C( _+ `
#include <mach/da8xx.h>
2 P0 @0 T! F' M1 ~#include <mach/mux.h>
' ~, d7 n1 `( T. V6 ?) C- v- ^! P6 l& c# C6 R: A1 X
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0) P; \1 K7 V s! `2 D& [
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) c% M( B2 g' v) N" B0 W9 R#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
; T7 e% D3 B- T1 ~' p( O& J#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
: X& C+ H+ k5 ]6 Q; `( `2 ~7 H
% T, v7 V b" Z1 ?8 V$ D/* assign the tl som board LED-GPIOs*// t( }. j1 w* F$ l* ~& H
static const short da850_evm_tl_user_led_pins[] = {
5 r3 d3 C ]# v$ _) V( } /* These pins are definition at <mach/mux.h> file */
+ S: ]! [. S* M$ } DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,% N7 f5 E) }: _6 l; N$ P9 D
-1/ B0 T4 k. l6 r9 z, P) D
};
7 X) p( S) g3 i
3 s. G4 d8 S# k* m8 }static struct gpio_led da850_evm_tl_leds[] = {
0 ?2 }* p3 C5 ~! q4 i! L {
0 J1 R( y1 _% Z$ Z! W& a .active_low = 0,
+ x, y' s) V l9 y: M# w .gpio = DA850_USER_LED0,* g, V9 N6 _ u1 O+ ~
.name = "user_led0",4 P5 U% k+ X+ {6 f z# ^$ a
.default_trigger = "default-on",
5 \' l R5 v2 N },: w4 R% z/ W; M4 c; W* ~7 k
{* \( g" U8 q/ c7 L
.active_low = 0,5 j- {* R, p: m6 F5 W( X! P& n/ {
.gpio = DA850_USER_LED1,
. m) s" B# F' { u# k: F; q; x. K .name = "user_led1",
/ u% |7 f5 b% C% H( v3 P% @ .default_trigger = "default-on",
T5 u- o6 E* R },
/ l% v) j* n. P$ |) k6 T2 Z {0 ]5 c- o8 l: C' V& _7 w* L$ v+ G
.active_low = 0,
; x' b5 V3 B7 {$ R .gpio = DA850_USER_LED2,& x4 J7 B4 f+ k/ G
.name = "user_led2",
3 V8 s. m. O7 L0 N5 F .default_trigger = "default-on",
8 W+ q. u" j7 k. D/ A# Z9 } },
3 h" a) t$ |2 J9 ^ {
d" [8 q+ a- K: Q" H6 C7 V& @+ @ .active_low = 0,/ G8 \1 B# s) X- ]2 j, p
.gpio = DA850_USER_LED3,
6 W" x* C1 @- ]) t .name = "user_led3",
) q1 v5 Q2 F; U$ i1 [5 N .default_trigger = "default-on",- ` Y2 t, m2 {; X; a& I
},
. J5 O+ A! `2 ^}; L5 W: |" H \0 H6 F4 ^# Y
, w) A3 R, p, Pstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
' }7 k6 e$ r6 V9 ~( S% w$ k .leds = da850_evm_tl_leds,
4 i" K8 | H* {) z! N9 {. e, }2 ~ .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ B/ ^1 {/ }$ g- x9 N6 P};+ e5 l" D$ v" `( [8 f
5 r, _1 E$ g/ g* \/ W$ W) O
static void led_dev_release(struct device *dev)
7 b- F' @! z- B7 Q) F% t. c{
$ d* M% e/ o, \/ \" U, x};7 I8 Z9 @& a& B5 J, a
% `& m" f" o0 ~; Ystatic struct platform_device da850_evm_tl_leds_device = {
/ u; N. ]7 o, |" G% n" @: a .name = "leds-gpio",
. V, x3 l3 J# L" j .id = 1,
3 ^- e8 n0 L' q& S; l: P .dev = {
0 K0 C# W" p) j7 X* y3 ` .platform_data = &da850_evm_tl_leds_pdata,1 ^! F" L- \) r& p" Z0 c
.release = led_dev_release,
( E+ m- O, U0 y& P4 m }& |8 c% U% N, b2 r) M+ r
};% B( z+ J& y! `! ^3 H: l ]
% V" X5 e& g% D4 \0 p+ q
static int __init led_platform_init(void)& a5 h7 D4 y3 I7 m; O) j
{
+ L5 K/ ?3 `) R, c: ]+ } int ret;8 o0 p; P) ?+ Y9 m8 T! s
#if 0
/ R& o0 H, H* `' P; X3 [( }/ L ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 O. l, |8 M$ C8 D
if (ret)4 N3 M/ i. f& }! [& G6 w# ^
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
! ]& a& w+ ]/ X* |( \8 `) _' k+ P "%d\n", ret);' d9 o0 a5 L# j
#endif
) V! ?9 I) W# B& d7 ?, ? p ret = platform_device_register(&da850_evm_tl_leds_device);1 e% ^- m2 n8 V G( x
if (ret)
' z! g1 u. r" _" A4 d! [9 [8 W pr_warning("Could not register som GPIO expander LEDS");
% Q3 _3 o, O; _ r4 v else% L9 c0 B# c2 Q4 z2 c& ?& u
printk(KERN_INFO "LED register sucessful!\n");! b+ b/ L" Z+ T2 o& v
# W; B) i+ \% q2 A# T7 W
return ret;/ D- z! @$ D ^/ `7 i! A
}6 i* t. E7 t5 Z/ t1 C# ~& j+ ?1 Y3 ?
+ k" s4 |1 N/ c% x$ I. D
static void __exit led_platform_exit(void), v8 U5 Y1 ]; v- V
{
- x" z5 H2 b6 n% @2 e platform_device_unregister(&da850_evm_tl_leds_device);9 `" n( {3 @; u3 I9 E4 j
+ l& W9 }5 q; E6 P printk(KERN_INFO "LED unregister!\n");6 J/ o, U7 U3 I/ L& ^/ A, ^/ i1 v
}( m8 {/ S- B9 O; R) f& T
$ p' U$ z f' X; xmodule_init(led_platform_init);
, Z# v/ w! |8 L- q b0 y7 o5 Lmodule_exit(led_platform_exit);
: g- b$ V- k3 S& Q6 |8 g! Q& U- k- e H3 }) P- B2 ]* x
MODULE_DESCRIPTION("Led platform driver");
) W* |! B. W; q+ xMODULE_AUTHOR("Tronlong");
. v" P4 Y H) HMODULE_LICENSE("GPL");
) S: u: T) W7 h1 @
- u" a+ U$ D( }' s! @7 [8 n |
|