|
|
求大神给下面的程序做注解,请稍详细些,谢谢。" n$ m& q* [- x- G
#include <linux/init.h>
: }; H+ t& N1 u1 U# S; s' f$ y#include <linux/module.h>7 b2 n0 R6 k. t W6 r
#include <linux/kernel.h>
7 V! {; D& H/ H, A5 h* z! [7 V: v8 L#include <linux/types.h> B' h- d* I9 G
#include <linux/gpio.h>6 c7 ^' g$ G+ v9 H) i+ o4 \$ |3 @
#include <linux/leds.h> \( F9 e V$ {* A6 ^: S- T3 k4 O
#include <linux/platform_device.h> Y3 h' c' ?; c3 x% n8 u, k: A
3 l1 Z* C2 T/ Y
#include <asm/mach-types.h>+ V' A( \, ~3 a* U6 Y, K
#include <asm/mach/arch.h>
/ d1 o3 H5 ]2 P5 j#include <mach/da8xx.h>
3 M3 L% k* b/ k8 s, A) v- D! h#include <mach/mux.h>0 e! ~( ^% U8 S3 S" M
& C3 V5 H3 E& y" \. O& @* D
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)+ b$ e) t& H' v" j' l
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 X5 N6 q+ b' V w#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
$ i4 `) L! } E6 t/ I#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
! m, B; K! y) w/ R0 {3 F- T& `1 ^
8 J/ }' `1 m+ n( q/* assign the tl som board LED-GPIOs*/
% F( T( m1 }) u, n9 G' rstatic const short da850_evm_tl_user_led_pins[] = {' `5 y S {) A4 U
/* These pins are definition at <mach/mux.h> file */
6 L% [' N1 r9 e4 a' E DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
) s: ], M2 Z! G% f5 C+ @" P -11 H6 f% g9 K2 I
};
7 v5 I; i) b2 F0 T
; o }& N% h+ X, l, Fstatic struct gpio_led da850_evm_tl_leds[] = {
4 v0 Q# A, q* E5 R8 Q {" E& N& e2 D, {
.active_low = 0," ?" O; l+ k. c' W
.gpio = DA850_USER_LED0,3 Y/ u3 e; S+ ^+ A. n
.name = "user_led0",
+ n) j/ V% Q& y2 e .default_trigger = "default-on",
6 u. ^3 S- }/ b( D },) c! v2 D7 n, _: w
{- d8 e+ a1 w! R. ]. t1 {
.active_low = 0,' {; H& c) F# h9 {0 a. |
.gpio = DA850_USER_LED1,1 i& ]' M# J& M
.name = "user_led1",
; ~, j/ ~7 N% T) Q |. ?& `4 g- d .default_trigger = "default-on", g* N3 C0 B R8 `4 k' ^ ~ F# d8 G
},
5 l2 Y [0 w3 c' P- D9 } {
- V, F- ?8 H& d6 C/ B; c$ n .active_low = 0,: a4 C' R& S1 H
.gpio = DA850_USER_LED2,
9 P, T5 b3 G# Q5 ` .name = "user_led2",
. H, J9 t7 l( @! m .default_trigger = "default-on",
6 _3 @0 D, ?! i% F* l4 |, X$ q },
8 J1 ^0 {/ S c$ [: Q; C' { {
8 _5 ]2 y' }% |+ ?) v: {9 f/ j .active_low = 0,
5 Q z" W+ y. n+ [2 t% @ .gpio = DA850_USER_LED3,+ K/ H0 h) F8 ^/ P7 p" l/ b: r7 Q8 p
.name = "user_led3",
7 J7 j3 w8 D V6 z .default_trigger = "default-on",
6 w* o& {9 D, D" o" l5 Y, ? ?/ C },- l1 F s' \$ P# g( w
};
9 t- ^9 H+ [( m8 }( J: }( q7 V) D# P, t6 v
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
( W% S% \! b: A4 t2 ? .leds = da850_evm_tl_leds,
4 r' q" `: [/ l6 ^/ E .num_leds = ARRAY_SIZE(da850_evm_tl_leds), u) T9 J! W8 i2 ^* B, v
};3 k6 b1 v; S4 a/ a F
, h/ u& K3 i3 Y
static void led_dev_release(struct device *dev)
9 C7 R7 t. e2 B9 t" H1 s! N{
% Y' ?/ y2 F5 l4 \};
( {6 Y. G+ X3 }5 }0 t) U% T/ V/ n. ] ^2 C: p+ X7 n
static struct platform_device da850_evm_tl_leds_device = {
. u; b3 A( H4 K- _: B5 R .name = "leds-gpio",/ U" _# T4 B2 I
.id = 1,
8 o+ I( r$ [& G- p .dev = { u8 H( ]. @8 G1 G
.platform_data = &da850_evm_tl_leds_pdata, N+ Q7 t7 k7 Y4 y7 m/ g
.release = led_dev_release,
( S/ j- }2 |! }! z! c1 x/ T" x0 C }
# |4 m: X$ u2 ~3 h2 p};
3 `+ M |. ^0 v: x* }* ^8 u
: V8 \+ J- \4 m* N. nstatic int __init led_platform_init(void)% a# J, o9 ^. R3 ]7 L2 H
{
: X( a6 h2 o) \9 C$ j& o/ L+ @) z# @ int ret;
* z: K# r% }& C, {& ^9 {#if 0
& [8 J+ k3 s7 `: D m: x$ f ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 s: i" N9 p9 v; q7 g if (ret)' B. G2 H" @5 \/ G; B0 Z X
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
! F5 P( J# V& k "%d\n", ret);* h! S% K6 t N% G0 Q# k; ^0 @: @
#endif
4 B/ |% |- B# a8 O+ u ret = platform_device_register(&da850_evm_tl_leds_device); E2 W, N4 V4 ^/ |
if (ret)
: t5 N# @+ D& G/ ^ pr_warning("Could not register som GPIO expander LEDS");: Y3 |( }/ l6 j8 H
else
' |' |' d$ l- {8 R' l: E5 o: s printk(KERN_INFO "LED register sucessful!\n");9 K& O9 _5 R- q& s! q
2 z- ]8 W6 S1 S return ret;
4 o( M7 ~! t" g' o3 \9 ~/ m8 Z4 C}
8 Z" v+ O6 V6 n1 W1 l; b& N: f, g6 p" j- c6 [- Z
static void __exit led_platform_exit(void)
: s, C* O) a. S- x$ E{! C, Y h; d: ~: d( A. M
platform_device_unregister(&da850_evm_tl_leds_device);
9 B: b4 o; F6 h Y' w7 Q8 V$ L+ L( `* r, G" d/ y/ \: _
printk(KERN_INFO "LED unregister!\n");
; W) S8 s* K8 \( [+ z6 f6 @* I}
0 U/ m. p- B" I2 g* |' P
X ^: \ i) I* q M1 Amodule_init(led_platform_init);
7 G: D; q. y% A/ n9 vmodule_exit(led_platform_exit);
# n" _ U9 ^, F- |! o
- O* ]- @& n" B% @6 E9 c m/ z& TMODULE_DESCRIPTION("Led platform driver");
. O1 S+ V2 C9 vMODULE_AUTHOR("Tronlong");
( N7 W7 K# ^- N# KMODULE_LICENSE("GPL");
2 {' Y+ w& N7 y: M; Y' P, B, G! q+ u
' W* v+ O I2 {5 J' i. H1 ` |
|