|
|
求大神给下面的程序做注解,请稍详细些,谢谢。4 x) \7 p& i; W# g6 I& F2 J! z2 _
#include <linux/init.h>, Y+ X% r/ a; E3 u# O
#include <linux/module.h>+ J0 r% ?" S5 [
#include <linux/kernel.h>) M+ a8 g) W2 \6 v5 x5 _
#include <linux/types.h>
6 D$ U( l: z' i. v* @" N#include <linux/gpio.h>
( B5 E/ Q% I& D+ A#include <linux/leds.h>
- j& L- X; Y4 x1 _ E#include <linux/platform_device.h>: v& Q- S/ P4 U0 D
. K9 U6 r: {: C8 t6 J% z9 n2 y#include <asm/mach-types.h>
1 P0 x0 r5 w V& I# |6 R#include <asm/mach/arch.h>9 W$ u+ q! Q. J) |0 K
#include <mach/da8xx.h>
8 x) L5 `! t) Y; s% c4 ]- v#include <mach/mux.h>
& n" Z% j% G$ D. a* r* P. |* t7 T* }. Q0 w- x/ R
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)4 K9 k1 u+ \* D$ d3 M
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5) v3 C; o! Q% p' N `# v4 L
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)3 {$ k! o- u: ^& M4 e7 U
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
# \5 I' ` B2 g6 ~! P# W
: u6 [9 K% x0 i5 _( U/* assign the tl som board LED-GPIOs*/
- a6 u: C: F! M0 o/ Zstatic const short da850_evm_tl_user_led_pins[] = {
0 c# k: R) s, C6 O, z /* These pins are definition at <mach/mux.h> file */
" L* W9 H9 \$ O* Z/ z' B$ s* a; {5 _ DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,& s! Y% N& [* x0 v4 K B
-1
5 ^# s6 I+ ^7 Y3 |+ \};% v5 [& ]9 K) U/ r5 K
& o) K1 @0 S2 T. z" O) D d9 `static struct gpio_led da850_evm_tl_leds[] = {
8 h( t [7 P n- y' s: {! v {9 o1 a: r7 y8 D8 g
.active_low = 0,$ ?. f- }- k6 t' G
.gpio = DA850_USER_LED0,
1 H' Y8 B4 `- p# A) A .name = "user_led0",
1 K( m: G: U0 A) K% Z& q+ L' B .default_trigger = "default-on",
- O6 M! U& H0 ^) l2 `$ a },
7 G3 ~4 \/ [6 e1 v- r {
( t# K0 ]; F. Q" ]& I5 U .active_low = 0,) R: Y! m- G) M6 L4 a$ p3 L/ g
.gpio = DA850_USER_LED1,( ^) G1 f; e) A( U1 v: y! s7 | ~
.name = "user_led1",
- r. W4 s$ ^+ a; X .default_trigger = "default-on", X, a- n! N! }- Z
},+ P7 |9 Q! a; `$ v5 S6 J( ~
{ ?. ?) S9 y! f
.active_low = 0," y4 D' i. r* _8 a& [
.gpio = DA850_USER_LED2,# I5 `# ^0 l1 ^) X- N8 q$ m: S
.name = "user_led2",
0 _/ {' ~6 L* u' ~' D .default_trigger = "default-on", y& u7 T# ?5 n: q: n( m
},
: U4 t8 ^3 u A9 r4 [; U; c {" k+ f' |5 |2 w5 f. d
.active_low = 0,
' E, q) n/ ~. U7 B" T4 d( c& v .gpio = DA850_USER_LED3,) {2 q/ g! b: V: J( s
.name = "user_led3",3 Z& D1 |; o. E3 [- M/ c
.default_trigger = "default-on",
: z* v3 v8 N9 e! k0 L3 ~7 I5 G7 c8 p },
- p+ c$ x# G5 ]4 s4 u3 e};
. {% k6 i. d' U; k' M6 `8 u$ T% m
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
9 C( l2 }5 K; q6 c .leds = da850_evm_tl_leds," l1 Z* j) i- N, x
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
N) k4 P! \ E* c6 d};
1 M: O" R" _2 A. b# K, y
, a1 i; |7 X! b& g0 g5 e# }static void led_dev_release(struct device *dev)
! ]0 b# d! S0 l4 ^{
. Y1 V8 {& z! D) @9 a8 k};$ X1 v# F3 A' q$ x. b
% {! {( @( K2 b3 X* n. d
static struct platform_device da850_evm_tl_leds_device = {5 ~; I( f& ~& p: \
.name = "leds-gpio",
m* e7 A2 U- @# f .id = 1,
: U4 x. K: n2 W .dev = {9 Z5 ^% ]& G9 K& t0 ` y1 i7 H
.platform_data = &da850_evm_tl_leds_pdata,
* |2 M; m0 H+ f' t8 G; T .release = led_dev_release,; b- k2 _; A$ g
}8 J6 j% ]. y% x% X
};, Y; e3 U% r% Q) j
7 A% L% H: S: @# T3 U* w; qstatic int __init led_platform_init(void) d2 l7 P" |7 ]! x! V
{/ D4 T* G: s% Y/ W' C8 K
int ret;) e- d3 E) T9 k, S6 O6 W# w" u+ ~
#if 0' P9 J! n, Y6 @( e8 a" s# B
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);5 z( q& [7 u0 m
if (ret)9 t5 ] S/ d2 ?1 [- b& z
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
6 m3 i! G; L; `7 J" v0 ~: j* M "%d\n", ret);8 F5 y7 |: |2 I% M9 E
#endif' W: v, |4 s% u. B. d
ret = platform_device_register(&da850_evm_tl_leds_device);
9 \/ s. ^8 d! C* `, T if (ret)5 W& K" q' q- n& j
pr_warning("Could not register som GPIO expander LEDS");
7 \8 i* @: f% h1 G% I. Z else E$ e, t2 u0 p% `
printk(KERN_INFO "LED register sucessful!\n");
% R' F# X2 p% m B2 X7 u
& o/ j$ h+ \( w1 u0 ]$ ` return ret;
0 J# G2 d) c& S. j, g}) h% ]4 C! ~$ \7 f2 x. Z
. \8 k# q. z v& H) A/ o
static void __exit led_platform_exit(void)
( ]7 R$ ?6 B3 N' g! S4 |3 a{- Y; Q! @/ L# t* Z
platform_device_unregister(&da850_evm_tl_leds_device);! O7 o+ \; Y( H; w* n2 N9 @( \- S# f
; k' n g/ f3 j0 ~2 t
printk(KERN_INFO "LED unregister!\n");
6 v; M0 V. b8 v) _. X* T" S$ s}
5 |/ V4 }1 [' E: a
: h* Q O& m, \/ m m- }+ B* nmodule_init(led_platform_init);
; e* U- e2 A Umodule_exit(led_platform_exit);
( g0 X Q7 ?; I R, L& G7 a8 X( R' p; y4 L0 z
MODULE_DESCRIPTION("Led platform driver");7 q8 U$ S/ S# v# _9 P$ X+ u
MODULE_AUTHOR("Tronlong");* F: s5 L1 D. m2 E, u7 p& A: y
MODULE_LICENSE("GPL");2 h. T& Q& [6 u8 L: U
f% R9 R0 c/ d" F" A* q; { |
|