|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
2 [8 R% Y# P3 H7 P7 B0 q#include <linux/init.h>
; u4 X6 e0 G% ?#include <linux/module.h>" {7 \ C! s8 V( ?- d9 U: h
#include <linux/kernel.h>! E# n. U7 z9 m, b
#include <linux/types.h>' Y, X8 w$ @' z! i# Q- \
#include <linux/gpio.h>: U$ W7 R4 t+ I6 h7 C' f Z
#include <linux/leds.h>
* M+ C( O7 ~$ o, m) v& s" y& O* {#include <linux/platform_device.h>( k/ A3 m- A+ i8 ]2 E0 }3 n0 n7 [
L) \' |2 g; h#include <asm/mach-types.h>1 e8 X: L6 \& B" y9 g& d
#include <asm/mach/arch.h>
, i* ~( w9 Q i/ R( j& q# m#include <mach/da8xx.h>1 T$ f' E4 o ~ _" j
#include <mach/mux.h>
7 Z* ], p$ D7 V1 _9 s8 f M
3 B: h+ t N& d+ H" R#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)6 j9 }8 t! J3 p( y2 `
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
$ Q# S( b9 Z3 Y5 f- G#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)9 F- |% o# j; |6 T
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)2 F3 {6 M/ ]$ `( B$ W
& F9 c7 H4 y8 z. z: e1 J
/* assign the tl som board LED-GPIOs*/
6 B' S! O) g2 `& Bstatic const short da850_evm_tl_user_led_pins[] = {
; A/ v, y2 G0 f: c# g$ R9 j% ?0 z; T9 {7 l /* These pins are definition at <mach/mux.h> file */' b; D; j8 A1 C8 n
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
& z ] a; q9 b -1% i! J% n1 A& B" ~! D) N& v, `
};0 e! Z; b- U& G$ w
6 a5 |) O2 _/ ^3 }
static struct gpio_led da850_evm_tl_leds[] = {8 w4 L$ c) P! { _# i/ y1 y% ^
{, _1 x) K# ?) k: F/ O
.active_low = 0,# D: h N) s* e0 w& J! D/ z l
.gpio = DA850_USER_LED0,
$ W" t, x3 L* W8 j1 p7 _" h .name = "user_led0",
. r5 a5 E; P. R: N0 o* p .default_trigger = "default-on",
7 |" {8 H, ?2 T0 M8 |3 O m/ v+ o },
( |) C/ N( `2 r4 W$ ~! H- K {
0 G( e1 }# C4 j1 I# a7 u) E" c .active_low = 0,
- f9 k3 y' l& \0 r* V5 o& W .gpio = DA850_USER_LED1,
7 p: B" d O2 m- |* a5 E; u .name = "user_led1",
& v: H7 }- {- U/ }0 v+ @: Y! b7 F; l .default_trigger = "default-on",
, Y, B% e8 [1 ?4 T$ f$ Y },
7 C5 F6 k* l5 D. J$ d0 } {
4 H: T) [& c. G. M9 Z .active_low = 0,
5 c! f: b& j2 m" B* c9 ^. y .gpio = DA850_USER_LED2,0 ~. M' h2 x( n3 a) h! c' q0 @- j) U
.name = "user_led2",
: G9 ~2 Y0 P; g: [0 v5 E8 ^ .default_trigger = "default-on",
. J) S' y* {2 Z/ A4 \4 ^; X2 O },
2 p$ `% y/ ?/ l. h {
3 O9 S9 y1 k: p, w* h$ j .active_low = 0,! x# O G- P: y* R3 q
.gpio = DA850_USER_LED3,
6 A9 P9 G7 \. w; |/ [ .name = "user_led3",% E& h: ]' o" d ]
.default_trigger = "default-on",8 L% t. U. L1 S' ~& M
},
( W. V$ x, q v% j0 p2 O};/ U1 B& R3 ?( o
: l }; `+ G1 L T# ~# z
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
# o+ R) F( G7 g: L2 n# e .leds = da850_evm_tl_leds,3 A. O8 E# @. o* _+ S
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
d4 j L: ], s% a. {};
& E3 s q# S' Q$ S$ I# K2 T5 ?! l7 V5 r4 _) S
static void led_dev_release(struct device *dev)- F9 d& b; |2 I% _' a, ]7 ?
{
; w8 X; p! L) a}; r! y6 o6 v& h/ t% v
, g5 h5 W2 D3 v% D6 O! ~- z
static struct platform_device da850_evm_tl_leds_device = {0 g2 g3 C1 }+ {+ D2 H
.name = "leds-gpio",
2 ^0 t& v' K) i9 m .id = 1,
% L$ y' \4 y* V. m8 v6 z: {& I .dev = {
) l0 o; m2 B, W* a .platform_data = &da850_evm_tl_leds_pdata,
8 O, ^, P* y: }* L .release = led_dev_release,! b# e. Y' Q5 a/ q% R3 @# J1 B0 i
}: t2 {0 n2 d& J" m: Q$ n
};4 {" R F/ N7 V; n1 o+ ]
+ j3 E3 \7 a; D9 U% {0 ?* r: dstatic int __init led_platform_init(void)3 e4 Y: H" O* d1 n) j, ^" P
{
9 z* u8 B& k+ @' n2 C int ret;
3 n, y/ j/ P* v8 }8 R#if 01 m$ o( k) {3 Y* x9 b9 i* v. _) r( f% q/ H
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);0 F( h2 `/ P, g# A: v8 d0 f; ?
if (ret)! c- x) F2 C; V5 h4 s. M8 m
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
$ S8 F$ s' e: o* l: }( v$ C1 { "%d\n", ret);0 {1 N% a1 b* G* Z
#endif9 ~6 e. Q9 ?; y3 X1 n5 M
ret = platform_device_register(&da850_evm_tl_leds_device);
) [- D: |: j! r if (ret)
3 E% b B: I6 e. o+ K; H( V pr_warning("Could not register som GPIO expander LEDS");
! p1 ?" ?( k/ Q A else
- x% C3 V3 z9 j8 [% J7 g& T+ u printk(KERN_INFO "LED register sucessful!\n");) R1 H( y1 l7 R9 p- \* v
7 ~5 i# h( ~# H- v- F( l7 C
return ret;
" h' n2 O' u9 }4 D; Q$ v, |7 _} v0 w, C7 I7 |/ a1 e# h
2 Q0 O3 H5 s# k0 x% `
static void __exit led_platform_exit(void)
% r( U3 z$ f& _, [0 D{$ k% P, w: L! j! y! g9 B' Z+ _
platform_device_unregister(&da850_evm_tl_leds_device);
! c y5 h6 |7 C/ B+ d& Z% @' O7 Y2 b: U1 H
printk(KERN_INFO "LED unregister!\n");1 k- s. g! }& I" ?1 |0 k( ]
}
5 T/ k. s& w( |4 k, X& |! e' w0 ~; {1 l1 _3 n# S5 Y8 F
module_init(led_platform_init);- b* ~% V7 `' Q6 S: M* R/ L& f9 a
module_exit(led_platform_exit);
2 X8 E) u& z: L( ~. v9 ?( w6 F a; b! s. ], `' U# U
MODULE_DESCRIPTION("Led platform driver");/ @6 f1 ^5 h- X3 d
MODULE_AUTHOR("Tronlong");8 U) e* A2 b% N# s x* e+ O
MODULE_LICENSE("GPL");. p( h4 c V$ M8 f
: ?, Q& a, ?0 O |
|