|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 m, z9 y* C) N) S#include <linux/init.h>6 i8 {% h* Q, [' ~4 e* |! t: n! s
#include <linux/module.h>) ]+ j( `7 z1 D* F
#include <linux/kernel.h>
, O6 B6 X/ I$ P0 s#include <linux/types.h>
3 j) l3 o6 M0 [4 H9 X#include <linux/gpio.h>
9 g! R8 i% _1 I! [2 ] K#include <linux/leds.h>! [9 f# F( I6 o% ^3 M
#include <linux/platform_device.h>- v8 B0 @$ U$ I# f+ y" ^. U
1 e) p- f' s- r3 z( a, A: V- a#include <asm/mach-types.h>4 K: `: v3 S$ D
#include <asm/mach/arch.h>9 y6 B) @7 i3 _6 G
#include <mach/da8xx.h>) [2 l3 _; C! Z7 Y' t4 d( z
#include <mach/mux.h>2 s+ i( ~5 ^( _; b3 R j# B
% C) e8 p2 `1 s' D5 ]% \/ B+ j#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)2 q1 p# O+ w" v+ y7 r
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ T- y d1 x0 ~3 W
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)* c! C& z9 \5 W2 K: D; B$ M$ ]
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
$ S: Y' q0 ]7 X; H2 v" e
1 J" R1 }) L% r' _/* assign the tl som board LED-GPIOs*/! _0 O; ?' G: N6 Y& N! C6 L+ p
static const short da850_evm_tl_user_led_pins[] = {
5 f+ @8 Q* d0 H' R4 W! | /* These pins are definition at <mach/mux.h> file */9 x* C. W4 C/ H- w/ K
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5, e& \7 {. D7 R. D6 }- U
-1
# r% B# U9 G, W3 N* `};- Y; }4 w# T; O( w
8 N1 A0 B5 D. J; ~7 y( @# nstatic struct gpio_led da850_evm_tl_leds[] = {
. y8 U" X" R1 \) u& F; L5 Q {
3 a) r3 k' j' @1 W .active_low = 0,
1 a) s0 e0 l/ }1 ]/ K2 M .gpio = DA850_USER_LED0,0 x. R* f- q- d. s. e+ Z
.name = "user_led0",
; u2 Y9 z: {0 i9 |7 t .default_trigger = "default-on",
2 E8 J2 W: j% [; c! G1 \( f. E },
9 }6 O# L, K7 w' s$ K& S% S4 U$ i {" C f" G8 {& ^, D& m
.active_low = 0,
' f* d' r: A# ]) i+ `$ W .gpio = DA850_USER_LED1,( A' v1 ^; V% S# y3 n* J
.name = "user_led1",
( v2 e5 V, v2 q8 @+ ~ .default_trigger = "default-on",
6 _% p/ e+ e- q, I2 y) P },
4 ~! l0 s7 N2 C N( N5 J( {5 X {
% J3 J ~' P. O7 w9 c) W8 C3 p .active_low = 0,
" @2 X# T; { X .gpio = DA850_USER_LED2,4 L1 {6 U9 y1 D% c, h+ f3 E
.name = "user_led2",
; E) J4 e5 R7 K8 Y& G0 g7 z .default_trigger = "default-on",
* V$ m/ P! s8 s2 F. y7 p },- m$ h2 q& A' o4 Z
{$ U7 V3 c ?) L* y4 `
.active_low = 0,$ v/ n3 p* `" U' Q; E
.gpio = DA850_USER_LED3,' \. k4 [, n- ^+ |8 Q( y" j$ _# ? T
.name = "user_led3",
0 V4 ~" }# r" A .default_trigger = "default-on",/ n" H6 o3 h8 Y5 [) K5 Y- T6 ~
},1 _* W5 D! q+ J, R
};. I6 S5 p" J9 t' I2 r' ~
' r# U8 `& j% W' y
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
7 o5 ^# m- o0 H9 ?. m! v+ ]0 Q .leds = da850_evm_tl_leds,& L- ]4 W* h: U
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),3 |/ |7 Y2 F! F0 ?& n) c5 P
};# w$ a9 e1 D" Z3 L
0 y2 v* B# K5 B3 m, ^ S' c# ~
static void led_dev_release(struct device *dev)
8 \# C1 Y( w* {% b+ u' a" A# F{
& s# x3 k" u" p7 J8 W0 S' v};
8 }9 w) ~- P4 j" ?1 ?5 f3 l
: T4 }5 ~) Q4 q2 {static struct platform_device da850_evm_tl_leds_device = {
/ ]" V) R2 q8 M5 k7 p% v5 [) l! D .name = "leds-gpio",- M' g6 ~& q9 m3 v+ _ D
.id = 1,, `. [: i0 B' n1 Z% M E/ e
.dev = {
8 T" T8 ^6 r' O$ k V1 r .platform_data = &da850_evm_tl_leds_pdata,
I5 K; w0 J% O7 M4 g .release = led_dev_release,
l3 D. {" ~0 y8 o2 |, U }6 I$ t$ [) r3 ?6 L% ~) R
};
w( A& s3 ?9 Q, l! E) n- L8 H% E1 T" Y
static int __init led_platform_init(void)
; h: ?+ Z- M1 l$ H! |! P4 Q) s{
" u1 H# O& \3 W' S4 G8 G int ret;( f. z7 ~6 N9 s& p! q
#if 0
" @+ o& r# m) m: c ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);! Y# o7 W7 O; B4 ]
if (ret)
- w' K0 W' H; p$ H* Q+ X pr_warning("da850_evm_tl_leds_init : User LED mux failed :"2 f2 l8 `% d1 }3 r8 I/ c e5 U, e# m
"%d\n", ret);& b& N! |! H S7 \4 T9 ]! Z- p
#endif. G7 } ~# H7 d# \2 v" E: B
ret = platform_device_register(&da850_evm_tl_leds_device); F' R$ C, i! v' e6 n0 P
if (ret)$ c2 f& r, r) }! f! B( Q+ J( r' p
pr_warning("Could not register som GPIO expander LEDS");1 X: [5 v6 {4 ?3 m/ ~$ F7 e2 r1 @
else
+ w! f' p; \' J' _& c2 O7 K% M printk(KERN_INFO "LED register sucessful!\n");
8 e6 H0 U9 [" E9 E; I5 c- _& R. m$ ?$ k- Y0 J' T
return ret;
" U" P: w9 Y" U}
$ ~$ g/ a$ T/ T1 J7 Z; N1 l8 A/ _5 x) z% f5 I% t% e$ T' V
static void __exit led_platform_exit(void)( X6 z* m! K% u
{4 B1 R+ L! O( g# I
platform_device_unregister(&da850_evm_tl_leds_device);
+ `6 d3 \" U! D' D2 o0 Z# ]. E5 F3 r2 F0 r8 i' ]1 e, |' b" {& m1 t
printk(KERN_INFO "LED unregister!\n");( ]* n( Z7 F9 P! L% k# T. j. D/ _
}+ l0 l& N2 D, g3 b
; o+ Y. ~4 ` u* u
module_init(led_platform_init);
5 J) |" K5 Q P: amodule_exit(led_platform_exit);" K" x2 W# j2 |: o) y
; v. q! T/ s* h/ h# m
MODULE_DESCRIPTION("Led platform driver");+ _; f' v1 G) h4 O9 u: j
MODULE_AUTHOR("Tronlong");
6 \1 x) W$ [" t& PMODULE_LICENSE("GPL");5 F* r3 \3 p$ N$ j# B5 J
: c# b# S( G6 H3 D. L, f+ g! X: ~
|
|