|
|
求大神给下面的程序做注解,请稍详细些,谢谢。2 s5 a4 g1 E9 Z0 @. N$ t2 S, _$ S
#include <linux/init.h>6 G6 v6 a- ]) T, r
#include <linux/module.h>
( D6 z8 ?) ~) R#include <linux/kernel.h>7 R& O0 D) g0 H0 V# L/ F
#include <linux/types.h>& g7 {6 X; ^# a8 e- |8 J) K
#include <linux/gpio.h>
, ^; Y- @( v7 ?9 N' u3 A#include <linux/leds.h>9 z6 u8 P( w# G2 p Z* ]9 K7 N
#include <linux/platform_device.h>; K1 B) `) ]9 G `; K4 S
" `' b, a' {' B4 m0 A2 n#include <asm/mach-types.h>
5 t" G7 s% n# P( B4 Q' z#include <asm/mach/arch.h>+ G9 g- r* t4 O
#include <mach/da8xx.h>
/ z4 F; Z: Z9 `, I# h- F1 Q9 C#include <mach/mux.h>, I7 X$ @: U0 ?- Q) X% e4 P P
( K& c" f% O* z$ ~$ x& T# g
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
2 A2 B- k4 a+ C#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" n7 g* {) b* T3 G" X#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
+ j9 \: ? L5 P) X: f+ U/ _#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
) I/ |' T$ d7 U2 t$ K+ w
& Y$ X: V; L8 t& @. D/* assign the tl som board LED-GPIOs*/" ~" d0 j( X" \1 \- R
static const short da850_evm_tl_user_led_pins[] = {; r5 W" D1 z( S3 U% i! l/ p$ T- U
/* These pins are definition at <mach/mux.h> file */
+ H5 ^) ^/ V* q d4 _5 P DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
: F8 o# M5 m( }( q -1
% q8 w/ c* p: ?; i. g5 X};8 p5 M6 y K1 }: s. J4 l) d
# c. L7 `1 V, |; ~static struct gpio_led da850_evm_tl_leds[] = {
n; Y8 M- h; G) s a2 X {
! w" D7 o: c) { .active_low = 0,
$ N; T9 h! F/ H .gpio = DA850_USER_LED0,
3 M& }" t& z, K, L2 o# K .name = "user_led0",
( H7 W+ ]1 j. L .default_trigger = "default-on",
4 X4 g" y! _ w1 r },* u% s% q1 r9 V6 L/ M
{1 l# o; p' A: e! H! n* g
.active_low = 0,
+ Q) E3 S" ]) s: X .gpio = DA850_USER_LED1,
8 U# ]+ q( r8 Q; d$ Y. { .name = "user_led1",; f, y2 p# I6 Z, w: M$ z0 C
.default_trigger = "default-on",
# T5 F$ Q0 [/ m; k% j },( k/ P& |0 x4 _0 H/ ?" y4 P, A, ^( e
{
* i3 N) B7 Y. i0 s .active_low = 0,
- ?$ D. m+ X, s$ W0 j" G .gpio = DA850_USER_LED2,- F2 U" D1 A7 F
.name = "user_led2",0 z' T. p5 P+ s2 D* B
.default_trigger = "default-on",' a% n' r2 }+ J3 O7 @
},; m# O, L+ ^3 E2 J2 ~
{
( E/ u; U) C2 ~; r" W! G6 \ d .active_low = 0,3 s7 L9 Z4 y0 t! N& i
.gpio = DA850_USER_LED3,
( b" J& r. R }+ r, J .name = "user_led3",
; `. _& @+ p+ d: T5 [9 i .default_trigger = "default-on",3 a ?( o/ B; |* e$ Q# ~
},
1 R# |4 F$ D: ~& \/ U; m};" r$ D. \4 o7 {6 D. ~5 ]$ S
5 w3 D: H2 J% u/ ustatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; T8 x7 m* F/ ]. k, u5 x .leds = da850_evm_tl_leds," E3 l( s4 i, E1 K
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),5 K$ H0 |- ?7 q7 T3 l- o, j; d8 b
};
1 f7 @7 }* E& g G2 P
, p+ O( P+ R# o( h7 T% Wstatic void led_dev_release(struct device *dev)
* n. b. o) Z" M( P0 }; D( c& g{
A0 L. i, c" X4 U};. x2 m- w) T, w$ j- Y
( m9 e' `' x9 M }static struct platform_device da850_evm_tl_leds_device = {
- d2 K6 ?5 U% j .name = "leds-gpio",
7 n5 U1 }3 b( \: { .id = 1,
e4 L, E& N, j# p! x9 U/ Q .dev = {
5 I! m: a- M3 M. I .platform_data = &da850_evm_tl_leds_pdata,1 d& ]" `1 ^6 S+ `
.release = led_dev_release,' i! t! P; D8 R
}
1 \ q8 ^. z9 O" u9 q/ e/ L: d8 C};9 _' h, w. N# [6 N( ^7 a9 L
5 M! u V/ U! V$ \" |
static int __init led_platform_init(void)
- V8 o+ {: A+ p- X{4 u. i; q. d+ D7 c, T3 u' ^
int ret;! _3 v5 e% `/ y
#if 09 U5 L5 c# P; Z+ C# ~9 ]: i
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);+ h0 J" S. j+ E" F) a# p4 I
if (ret)
9 L% k1 D8 N) C% A/ M pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
% T; C/ n! f) _: `4 | "%d\n", ret);/ q; y/ I/ | @9 i7 K. ~( u
#endif( s) {' E& J/ X8 E- Y z
ret = platform_device_register(&da850_evm_tl_leds_device);
1 x- B. Y1 x9 i) ~! L6 s( j+ V0 @ if (ret)
9 {, o% c$ w* _2 s9 q/ w. K pr_warning("Could not register som GPIO expander LEDS");1 n7 P' U( Y/ O% V" c9 |" ~
else7 m& Y! R* H f
printk(KERN_INFO "LED register sucessful!\n");, v0 b3 [& e* ?& |7 n+ M
1 O+ @7 h/ h4 e6 g8 p return ret;4 S) w6 g5 s# T+ H3 k
}
0 x& U/ e& ]0 M* i6 I2 p {
/ N( K" i. C1 ~6 E Ustatic void __exit led_platform_exit(void)
& q* Q7 T7 W0 V3 M% x5 G$ [3 Y5 `+ z{4 p5 j: Z& a1 N6 d" X
platform_device_unregister(&da850_evm_tl_leds_device);
& k1 K5 {( V6 o+ K- o4 a8 Z# z7 m/ O, g
printk(KERN_INFO "LED unregister!\n");
4 O" Q7 T* A$ x- j5 v# b- l}% p* M7 l _9 o+ }3 N; B" E
$ X/ x! k4 E( S. u. Lmodule_init(led_platform_init);
5 [' r2 F5 G" jmodule_exit(led_platform_exit);
+ f6 I/ |; N9 L7 h# e+ x O4 s% a" }- @+ E
MODULE_DESCRIPTION("Led platform driver");0 ?6 Q( F4 r6 {
MODULE_AUTHOR("Tronlong");0 p& n' k5 O5 c$ C" a1 `
MODULE_LICENSE("GPL");% V, k( F+ ]; x& T2 Z* T" G
7 z: D { Y! i# K |
|