|
|
求大神给下面的程序做注解,请稍详细些,谢谢。* e# @ d5 U" Q& ?/ I* C) m
#include <linux/init.h>
" ?0 z* n, {6 {1 k7 @#include <linux/module.h>% x* Y- ~. A3 y2 d/ g Z+ F) a
#include <linux/kernel.h>
$ E4 r/ E1 ?3 `#include <linux/types.h>
: ?; s0 @1 T1 ^" C( V- f#include <linux/gpio.h>
9 d: u- v7 V- R8 r$ d#include <linux/leds.h>
# @- u. u7 d1 O `#include <linux/platform_device.h>
/ u# N& s, |& ?$ p
; n$ \9 x* q2 n/ g4 j4 \#include <asm/mach-types.h># [! N6 H" h9 x3 B6 J: m
#include <asm/mach/arch.h>) X+ u$ y! l( c
#include <mach/da8xx.h>. |% R, d3 C, f2 N$ |" `* y
#include <mach/mux.h>
! L' k# y# n' o" ?6 m' t+ a7 z1 a4 {! I( `( ? Z j) L/ u
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
u: m. R4 _4 X" m0 R#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)" S4 e" N/ R" S- M: R
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
7 O7 g, m5 v( n; U#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
! |) D2 I$ S: x+ w4 H+ \* T; w& n. }7 i9 m% g& s7 d. K" j
/* assign the tl som board LED-GPIOs*/
* s4 \1 D$ [$ H5 X4 s1 b, ]6 J$ ?static const short da850_evm_tl_user_led_pins[] = {
: T6 s; y- @- H4 j# G /* These pins are definition at <mach/mux.h> file */. D" N+ y" ^7 g! p$ O% M7 @' b
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
+ m, E4 s/ j* \ -15 R# k0 ^! `5 m/ y1 o) x
};
9 H2 G! b% t/ W8 v! T" h7 l: p+ s
3 E& U% a) n$ O4 o1 B0 f( ystatic struct gpio_led da850_evm_tl_leds[] = {8 ^8 B! {. s/ T2 q3 a N1 x
{5 m5 {! E" W. w% X) a8 _
.active_low = 0,
- l4 F* o. r8 q) Z# z" ?5 Y) F .gpio = DA850_USER_LED0,: e' h: L) k( u( _2 G. M H: L" Y2 T
.name = "user_led0",2 [7 K/ Z) o2 n7 [4 ]
.default_trigger = "default-on",
- @! B+ U1 w' r7 s+ l* Q( G },
% K6 r( g# B2 T1 }5 B' m {
( x- f" |# l$ W7 H1 y% e .active_low = 0,. A! `" |. [9 G; X4 q( M
.gpio = DA850_USER_LED1,
1 T- c! J; Y: i; I6 e .name = "user_led1",% E: l* a h' t$ G9 I
.default_trigger = "default-on",
- P# O2 j# Y4 N* F9 ^: @" q$ |# C },
3 V* l8 ?5 u4 Z5 ` {
( p6 p& g1 W. J1 x .active_low = 0,
E- K9 ^. I( l7 w .gpio = DA850_USER_LED2," }! C2 h- b$ ?
.name = "user_led2",6 Q& j3 z3 u- s
.default_trigger = "default-on",
; z% a d9 R' H& t7 P) V },; z. v8 o+ c4 T: J
{
% W' R9 O, @) g$ j! j% Q, D3 j" f .active_low = 0,3 Q$ t1 b. S% d9 P& p$ J% f2 I# @
.gpio = DA850_USER_LED3,1 t9 D M- u2 |8 U; _
.name = "user_led3",1 T- Q9 j7 c, {6 G
.default_trigger = "default-on",
+ ^' @/ H# {9 x V },
( O! f. \/ ?; v* K};: x$ D7 L' X. Z2 c" K4 X) n9 b
8 ^% s$ u( c4 s% \static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 S4 L5 b5 N; l) v
.leds = da850_evm_tl_leds,
3 d; F# Z' r I$ H9 u8 F) M .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
4 {9 C' u$ b6 ?* }6 W/ }};
2 p) W' t2 ]8 t! u0 I7 V2 V7 k7 p0 p9 R' N; l
static void led_dev_release(struct device *dev)
- c. q% ], Y) Y- G W: O# r{/ _$ a3 C: Z1 j5 |. y0 D5 S' |4 r- Q2 G
};
2 k- K j0 Z4 ~1 l o
( l, Z: r3 Z7 f; [! V2 P: N( Rstatic struct platform_device da850_evm_tl_leds_device = {; x! K3 `0 G2 n: q- F
.name = "leds-gpio",+ }; A1 g& A. t; l* y, L
.id = 1,
& @2 S9 K0 Q/ `6 f* I( L .dev = {3 a' p5 m, Y2 h- ?! c$ m
.platform_data = &da850_evm_tl_leds_pdata,& B, U+ R+ ^' I7 h
.release = led_dev_release,& q4 [; F0 u+ @% ?- {
}
4 n4 \% m2 Q; Z};
8 W! y4 S W$ V2 x' l* ?6 R# K; x: F& T+ w; ]* p- x: f
static int __init led_platform_init(void)# _8 D, u' r# x0 N9 U8 V% c
{( \( u- t' d6 P. V ?
int ret;* F/ v$ X* m; G" h0 V
#if 0
' Q4 R5 }2 N4 A4 ? ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
, u! F3 ?6 s& I6 ^5 }) _+ f5 G if (ret)
2 B; z" d/ J& J2 b: k' ^7 S pr_warning("da850_evm_tl_leds_init : User LED mux failed :"3 J1 {) s5 X) v5 T' r
"%d\n", ret);6 i7 D6 O4 M- D e
#endif1 ?& l, Y$ F! r9 i' s. L
ret = platform_device_register(&da850_evm_tl_leds_device);
: F" w G( L0 n/ R1 W% Z" d. X. Y if (ret)+ E6 N0 s7 W- E- h
pr_warning("Could not register som GPIO expander LEDS");+ M" j0 J# M2 E) s0 b
else
: E/ z1 P) \0 I/ o$ J printk(KERN_INFO "LED register sucessful!\n");
1 z! w( E! @; C3 k( q) @6 T4 ~2 b# i2 J/ \
return ret;
- W, C! t R4 S7 j" E4 u6 ? o}- p1 E- _# [2 Y T- O0 V
1 `/ X7 n& L9 \
static void __exit led_platform_exit(void)
5 ]! C; j+ {, L+ C{+ T" l8 }3 \" N+ ?$ [
platform_device_unregister(&da850_evm_tl_leds_device);
2 [. Z$ N0 E# q- u6 y( g" N3 W, O8 Y& F2 D, ^% z6 d3 p# k
printk(KERN_INFO "LED unregister!\n");3 i2 \9 y4 v/ i+ |/ Y! L% H& u5 P/ d: W
}
& ?3 }- L) l7 o8 j, M' y% |/ L8 P1 g- X2 l3 \* k
module_init(led_platform_init);) `; [$ n) W' N& `* c C
module_exit(led_platform_exit);" V- V( e X4 v w6 n0 o5 F6 z; U
% B8 K6 k3 [: s! S
MODULE_DESCRIPTION("Led platform driver");( h/ ?2 D0 X1 L* I S" ?( H1 V
MODULE_AUTHOR("Tronlong");( y" d) b, g, `* c5 M
MODULE_LICENSE("GPL");
+ I/ w& j/ c# h% F6 X: N4 `4 I/ J
- p: E1 J0 i, x. O( W+ f |
|