|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
0 D) s. K; |: u& p! a#include <linux/init.h>
X( V( g- m4 W, Q) U#include <linux/module.h>
& k4 o0 [& Z% s' L6 l$ P' @- o#include <linux/kernel.h>3 ?, s) c8 H/ ?4 w& A, n
#include <linux/types.h>/ g# E( {) m u' u7 Y- y
#include <linux/gpio.h>
, s$ E* @0 C" r#include <linux/leds.h>6 a: [5 _& P9 z- d+ `; O/ B
#include <linux/platform_device.h>
9 Q/ h% O7 B5 R0 y5 m# J) ^* M
+ t e1 W( N6 ^$ g#include <asm/mach-types.h>
) C$ D" b9 [! v1 C2 g3 g3 C#include <asm/mach/arch.h>% P3 w+ B1 a8 k. C6 v# ^
#include <mach/da8xx.h>
3 z: f: K @" W# [ G5 V#include <mach/mux.h>& r' e/ w7 A. Z; M. Q, R
/ N" c2 n# j6 { C3 ^#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)9 g0 B0 s0 ?: R6 @# [
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
; X" D# L' X/ Y1 J' O#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
% `5 ?# l8 M% g5 g#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
- X0 Z6 q; V) W! t: i; `
* S' L C6 v+ v; A& {- I7 b* R/* assign the tl som board LED-GPIOs*/) X2 k1 Y, Z: R% v$ W
static const short da850_evm_tl_user_led_pins[] = {$ N7 c2 I0 Z4 ?- [
/* These pins are definition at <mach/mux.h> file */
/ H* ^, |, g( e" t DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
+ D8 g4 x# A$ i, ?6 P -1
5 z0 h' o- E/ }3 {: T};9 c: m2 Y0 k$ | [0 i7 F, G2 F
, s8 M7 W. F+ t, C: Wstatic struct gpio_led da850_evm_tl_leds[] = {) E" m7 `9 b1 S$ W. p" ~
{
" ]/ v& `$ a& B2 j" n4 f .active_low = 0,
/ d/ I; A* S2 j .gpio = DA850_USER_LED0,
% r9 }# |- A( F3 \ W3 g5 Y" A, E/ r .name = "user_led0",% r) Q! r- m/ E' O& b# t
.default_trigger = "default-on",% c& {. |6 L+ t& t. K: s9 ^( x
},
+ p+ ~2 ^% B, w) F {0 O- F0 n! u& K# D4 U
.active_low = 0,
0 g" f) d5 i. S6 N .gpio = DA850_USER_LED1,+ L+ H9 X# y' e/ C
.name = "user_led1",8 s3 ^4 p( @5 O8 T8 ?
.default_trigger = "default-on",
- E' U4 ~# K) {9 p m W& ] },/ z+ t, X. w5 ~- n, t2 B
{* U5 _9 T3 c( M" d' E0 }( q
.active_low = 0,
0 J0 }4 X% M; V, c. L. a .gpio = DA850_USER_LED2,* r' U: A w$ g; K
.name = "user_led2",9 w! n9 B; L- M0 [1 |/ d9 ~0 y
.default_trigger = "default-on",% S* k/ L2 W& [3 g1 g- s! c8 F+ z4 c
},
. D8 n6 I* j) a0 G% G {! [3 Q& Z7 @/ w4 I: A2 {9 n4 B
.active_low = 0,- t l7 t5 s# d3 t! J9 t/ t
.gpio = DA850_USER_LED3,7 H5 ~) \& q K; v) o: L1 l
.name = "user_led3",
4 |" w' V+ X: j- u .default_trigger = "default-on", B. j* b& U. h9 S
},
1 C4 F+ o& @. _2 T- A, v};
( @" G0 E% A% R: B$ K
& p* f9 E' h/ x* u* u- Ostatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
* j0 `* o$ M+ c6 v6 v' r+ C .leds = da850_evm_tl_leds,
( m/ q6 t. A$ M$ Z9 x6 r .num_leds = ARRAY_SIZE(da850_evm_tl_leds),6 l2 ~/ a6 p# N( G7 D w& X5 t' f
};
+ ^* e5 n% i% Q* h! F4 v: U: l" H: q0 x: G/ ?' Y- h
static void led_dev_release(struct device *dev)
- J1 R) ?7 m; R& N* M{- L/ a. p" F/ P8 X: |
}; B) T6 {" s, V9 s1 G: m" i) y
0 S" f: B( z) R. K- `' ]
static struct platform_device da850_evm_tl_leds_device = {
2 n4 P5 c4 `2 A( J. n .name = "leds-gpio",
4 t# r! r- b3 w .id = 1,
8 l& ?1 ?) w) a5 w .dev = {
2 d; ?8 K0 p: V& x2 X .platform_data = &da850_evm_tl_leds_pdata,. W0 t9 c6 V+ l. m
.release = led_dev_release," u- Q2 B3 j& Z. @
}( G6 y0 R5 y. b+ b; y) F
};$ ]& H, T2 s3 i T0 b# n: X! q3 D( J
5 M/ K9 m; P# z8 ?) H% }! w5 a+ z
static int __init led_platform_init(void)
: n3 B; u) `% W r{
; O1 Z _) A: w9 }2 P int ret;: d( ?& c; I9 |
#if 0
1 K* N6 e* a+ d3 t ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
9 a/ `4 t7 R% R% \ if (ret)
4 w+ C7 i8 t W; N0 u$ i pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
+ y0 [/ d- ~6 f: Y( q0 T "%d\n", ret);0 @3 M( v! n6 { \6 D" P5 l
#endif1 {3 F3 m" J- @& e; `2 D5 n$ p3 \
ret = platform_device_register(&da850_evm_tl_leds_device);7 _& g* R7 ]) I6 u4 z1 D
if (ret)7 G, S, p/ x4 Y4 x7 ~
pr_warning("Could not register som GPIO expander LEDS");
( u4 _( R% O7 Z9 a else H. Y/ z( i% d- V- v, m7 T4 B" o
printk(KERN_INFO "LED register sucessful!\n");
1 B/ P/ e( E7 q5 |, N" `5 q
; u# B* q4 a$ J9 O, o, ?0 R1 N5 s return ret;
, O& g7 D1 y8 h. M) U}0 y4 V; R) l( K# [( F* ~9 d3 A
, c1 \; x% |/ g2 o3 W% w5 H
static void __exit led_platform_exit(void)
+ I6 k! B" X3 D6 L7 q{6 k h4 w N% H2 W: M
platform_device_unregister(&da850_evm_tl_leds_device);% H! U, e/ ]( ^- g
+ r3 m8 b: U! S printk(KERN_INFO "LED unregister!\n");
/ n- h s0 Z2 `3 Z9 Y, Q; p: A}" u' g; y, ?% D4 M' z. t( X' I
- l5 E; ~6 Q. x; D0 m, Wmodule_init(led_platform_init);
2 J- Y3 k% ?3 m; ]. Emodule_exit(led_platform_exit);
: }% ^2 e6 f% m. o+ d* J' Q, U/ l
3 s4 S; O. U; `# L& X5 ]4 KMODULE_DESCRIPTION("Led platform driver");
- v: w( | j+ w7 y1 c+ a9 DMODULE_AUTHOR("Tronlong");
4 Y, y2 X& C0 k0 VMODULE_LICENSE("GPL");( A4 b/ _9 k. P2 |& [4 e
/ D% l/ z: `( z* s: \( ` |
|