|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
: F! @0 X. E5 V4 v: y; ~#include <linux/init.h>
- J/ `7 g, A. R# O& L# {7 F#include <linux/module.h>4 \9 y- B" r) k4 ~( |$ B3 o0 M5 U
#include <linux/kernel.h>' U! g# t' V7 c, `: O( i1 m" [4 z
#include <linux/types.h>
) J# d, S& \; e#include <linux/gpio.h>
/ K V, V0 ^* d& Z3 J#include <linux/leds.h>
- w* F4 q5 p" R4 h" t8 E+ E0 d#include <linux/platform_device.h>
' S$ M5 M6 j/ N+ F5 x7 S5 s5 S8 W7 B) ~/ n; M+ ?
#include <asm/mach-types.h>, Y% H5 X7 x1 @7 ^& a1 a0 ^
#include <asm/mach/arch.h>
r% c/ e! M1 s#include <mach/da8xx.h>6 \; d- ?$ e: y& |- B
#include <mach/mux.h>
* ~9 d$ l# V4 j1 y* q8 c/ x& c8 I; Y
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)/ P" `6 L9 X' \. D7 d
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)/ `5 p# L1 p- h+ ?+ v2 _! T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
) S+ {: E) {/ {7 ?, Z& z" c#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
3 j: }2 a9 |, t; E. ^- V
8 t& P* p6 c1 j) j8 c/* assign the tl som board LED-GPIOs*/4 N7 f) s3 [. j2 n
static const short da850_evm_tl_user_led_pins[] = {( w( }0 H7 r8 ]+ k( D/ [
/* These pins are definition at <mach/mux.h> file */
2 u) R7 |5 K c7 g" X$ }+ x$ O8 U DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
! ~6 m( |% }! K4 v1 s% d* s -15 k0 ?& w" x) o. ~
};
+ H2 G$ T d, X' _* r$ s
7 B: o; z( a6 l" {static struct gpio_led da850_evm_tl_leds[] = {$ G ]1 q- j1 Z% k, ~9 v7 a) n+ a
{
. R8 G) J' `+ c0 S$ Z2 r .active_low = 0, m: i* X" _1 ?) q
.gpio = DA850_USER_LED0,
5 r/ B0 u8 ]6 N" b .name = "user_led0",- _& @# y5 |, {& N7 Y0 u. n
.default_trigger = "default-on",
- |/ E9 c9 N M, r" L! t& Q },% }5 B! v" d( q! B- @2 }
{
) k' w0 j8 Z1 p5 j# N: Y .active_low = 0,
& g* k/ p5 _' f$ o .gpio = DA850_USER_LED1,8 w9 E/ h' m. G1 V. v2 @1 o6 H. i
.name = "user_led1",; t+ v2 Y5 [5 Y, }8 f# T
.default_trigger = "default-on",- o) d* ]$ S6 @5 m, o( K
},
0 f* l# P" |4 m7 P {
3 ~2 _6 K1 g, h& U1 u .active_low = 0,
: }) Y3 ?% H; G$ M .gpio = DA850_USER_LED2,. V9 [/ b( T! |1 k. o+ _
.name = "user_led2",
* r: K8 x5 C% S2 F7 x .default_trigger = "default-on",9 e0 w* I/ e [! ~
},0 }, H/ m: P5 k; U
{ s2 I: S. ]1 P$ I6 p3 k
.active_low = 0,& `- ^; l% @3 I3 Z# o# B1 B
.gpio = DA850_USER_LED3,
* ?8 Y* V3 \6 ^. j% Y .name = "user_led3"," @1 J; ?/ I! L; B& r7 a( y7 L
.default_trigger = "default-on",5 B5 B7 `$ m9 H B) U
},
* R7 F" K3 R, C9 t};) g7 ^1 @3 N" {( Z5 T% E# Z
3 Z+ n4 S: c [1 n- _& j9 e
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; n6 ]- u! l2 v .leds = da850_evm_tl_leds,
a* z! Y& c; X9 W' ^" ?5 }( X, L .num_leds = ARRAY_SIZE(da850_evm_tl_leds),4 r o8 \( |. R& x
};
, @) ?+ u3 P1 j# o2 f8 l+ i- n/ }4 j5 J9 k: [/ @5 e
static void led_dev_release(struct device *dev)5 G9 A! K/ L% L6 O0 M
{! X$ I! ^: g7 M
};
/ V" k! Y) L0 K/ f u9 Y2 a% E+ m" Z9 f5 F
static struct platform_device da850_evm_tl_leds_device = {3 Q; x6 }- V( l5 Y+ F* A9 n# m' G
.name = "leds-gpio",
% j9 G2 P6 M! v .id = 1,3 q3 ?$ L/ I5 R: s
.dev = {
2 G+ A# ^, |7 t/ q& ? .platform_data = &da850_evm_tl_leds_pdata,
0 t7 U( j; l4 c/ v) ^" O .release = led_dev_release,
+ Q: F" P- I2 a% J7 g }( c& F, J6 L, E9 V. h' {+ F2 g" T9 T9 u
};, X/ t1 l* i4 U8 k: r, b
; c: A. \4 ?* [3 C5 i8 F" H z; \
static int __init led_platform_init(void)
( g/ J f: D$ t" F( U- V% ~{5 ?7 R/ r: @) N6 R7 F% [
int ret;
7 H9 l; M, f; O; f' o% ^$ g8 S#if 07 X5 j% C# u' ~/ y2 E/ k- ]
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
4 T% h5 l. [# ~7 ^+ t, _% S/ z0 Z if (ret)9 Q' }6 V X# C
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"; U+ K3 N9 ^- w" C8 V2 T) o. G
"%d\n", ret);
% U; y6 ?) j$ E- ^( D0 g#endif! l* a- S' G3 V* q, V
ret = platform_device_register(&da850_evm_tl_leds_device);
, p: i6 r' f# q$ m if (ret)9 K8 Q: F/ M% q5 U& B; X0 a3 T" @
pr_warning("Could not register som GPIO expander LEDS");% f. S: K* E( ]
else
* _& ?" w2 v5 p3 O- A printk(KERN_INFO "LED register sucessful!\n");
: n0 t, C/ Q* ]" g( f( {
$ T7 l& ?( D9 G0 `" h return ret;
/ ~8 K3 R2 i5 d* G}. x2 O/ g1 ? d5 i3 H: {
: R$ h# [6 C8 m+ z: ^& t! v
static void __exit led_platform_exit(void) C$ ^- k3 {7 m% y
{0 G3 W. ^( m/ }3 O/ n
platform_device_unregister(&da850_evm_tl_leds_device);
5 ]2 {! @1 _$ E: f. Z/ }' G; L
* z! @ S6 K: Q: [% H" V* p1 ~8 K8 l printk(KERN_INFO "LED unregister!\n"); F1 L2 Y% p/ y8 l0 m2 A$ \. @. `$ z
}* H) C; r0 ?' W1 b" h! b
: V f8 y; E7 W% C& umodule_init(led_platform_init);
. T0 `% ?9 [* z& Jmodule_exit(led_platform_exit);
# p" w% t2 |! z/ L3 ?
$ ~# f$ h4 J: N3 k2 x1 x% P* CMODULE_DESCRIPTION("Led platform driver");9 }# K3 ?8 v9 D- Y: P; L5 W
MODULE_AUTHOR("Tronlong");9 j# f0 L2 [% q" h; i" t
MODULE_LICENSE("GPL");
8 @6 L# T w% c' \5 b# m- U/ k- ?) M) P9 U/ U% A& S" ]0 \, u( z( S# p
|
|