|
|
求大神给下面的程序做注解,请稍详细些,谢谢。. v- N0 v. o# g* p- P
#include <linux/init.h>5 i7 N: r6 s+ m3 X( u, p) }, N& j
#include <linux/module.h>& L5 v! P+ ~ a
#include <linux/kernel.h>9 f- l6 ]- U" r4 e% k' v
#include <linux/types.h>* }: g2 A7 r0 T0 |; f
#include <linux/gpio.h>% ^& r+ @. B) N2 @
#include <linux/leds.h>; j0 m& J; V6 @! R+ C
#include <linux/platform_device.h>
; d2 n0 v4 `' I+ L
u' Y I: B, A! ~#include <asm/mach-types.h>$ ~) Q" M' Q( F3 d' Q
#include <asm/mach/arch.h>& s7 f) f1 L- G* {+ L& |
#include <mach/da8xx.h>: f0 u; k# f6 Z
#include <mach/mux.h>; \3 |( `- W) V4 S8 ~* f& m; o
3 R& K0 ?- J" V1 @$ D7 g6 F#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)2 l' r5 B4 \ h: H7 Z
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
" p" Q+ E, g* _1 ~4 J4 q4 f1 z#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! p+ g( S: m" @# j: @ u
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
+ e, X! S- Z2 K J3 L6 X+ R' q' `! T z# I$ L" k
/* assign the tl som board LED-GPIOs*/" ?+ l U7 @8 [' p/ E2 g- a
static const short da850_evm_tl_user_led_pins[] = {
. q- R! U" W0 a( x /* These pins are definition at <mach/mux.h> file */, s( z; [- M! t0 T% A; Y6 h
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
3 K2 ^3 k* }$ y- L4 ~7 J -1
2 L, F9 z5 N% L4 R3 v5 q" t};+ D5 t5 y2 [6 k9 B' o" C0 `
1 H( g @) `" Q' E) Wstatic struct gpio_led da850_evm_tl_leds[] = {7 _ t5 W, l( C8 `; H" H* @" S
{
- f i% f$ ~! ] ?! U8 A6 t .active_low = 0,3 ]6 M8 x, P) d/ T! } f* g$ J
.gpio = DA850_USER_LED0,2 n1 h$ c/ z0 c/ T( a
.name = "user_led0",
T' e1 e: \8 @9 u% j7 g$ ~ .default_trigger = "default-on",) F7 v$ _! K/ P- O8 ?( p8 l8 r! z
}," x4 y' v# b) }* o7 ]
{5 T; H, N+ c8 o- i' I* X# r
.active_low = 0,$ k* C6 G5 i9 `, s: n
.gpio = DA850_USER_LED1,/ g f" G; [" S% _; v
.name = "user_led1",% E2 l4 v# j2 N) E( U+ ~" J% N
.default_trigger = "default-on",
% D5 z b& a/ e" `* T },
2 u7 q$ g, i' |. K' N {
2 T: \0 T0 c! ?( [" H .active_low = 0,- ?/ s, {+ }6 b& y! Y
.gpio = DA850_USER_LED2,) L3 a( s$ ~, z: g
.name = "user_led2",5 c6 Q# R. W6 _6 U
.default_trigger = "default-on",
$ u# I5 v3 R: ?4 q3 a }# v },
4 k" [7 L% O A0 a2 k {
* F( e, L% @; Y, a- L7 h .active_low = 0,! f% d1 X( h$ o, a
.gpio = DA850_USER_LED3,2 E# Q( P) }5 z
.name = "user_led3",/ o0 d$ `+ i- b8 y, P
.default_trigger = "default-on",
' n& X) ]' g1 H- e7 e; ]* L/ K },
3 j0 [. F, {# G l5 h};- h$ a# H! j6 i2 h) g3 w% e: X4 d
" h. a$ r$ l2 D: f9 Y; |# Hstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
3 _5 m8 u' e% [4 B" ?% M& n- D5 @ .leds = da850_evm_tl_leds,
4 q2 \2 p: }+ u0 K; }$ ?' z. v. o .num_leds = ARRAY_SIZE(da850_evm_tl_leds),! N1 Z) M+ [6 m" r# o( K' t V! ^
};
+ Q5 a* A9 F( d3 H
, |2 M0 C5 T3 `! g# ^static void led_dev_release(struct device *dev)
) q! @# `2 _( i+ e3 C1 ?{6 D5 ~3 p9 ^' R7 Y: b1 q/ ?
};: c# _6 _5 F9 C( I6 g& S y
" [ t- U h! U$ f) J6 c
static struct platform_device da850_evm_tl_leds_device = {- \3 n9 p6 ?9 F
.name = "leds-gpio",
5 v; u6 j% P- ? D! ] .id = 1,# c3 k# d9 @0 G1 F/ p
.dev = {! N& L, u# s7 T6 B( w
.platform_data = &da850_evm_tl_leds_pdata,! ? a& `: J7 c I, G4 v1 Q
.release = led_dev_release,
$ O! H. b; @ R }" S ]# j& J% g2 d* z
};
: W- D& z7 Y; c/ b [5 @0 i: r1 X' C6 n- ~3 c. y# n w. s) Q
static int __init led_platform_init(void); f2 ~" r3 }. _
{
* V/ w. Q0 \& `' |5 l int ret;8 g `' g; W7 X5 K& H1 F6 h( a6 H0 F
#if 0. l5 U9 i: l& s0 |
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);: a! c& M. a0 x: c# R/ q4 E9 v
if (ret)
|3 c N) e: ^6 p- U pr_warning("da850_evm_tl_leds_init : User LED mux failed :"2 M& e: k# q [$ v
"%d\n", ret);
5 w, W6 g- \# D#endif5 E1 y' S% ` c* s7 V5 |
ret = platform_device_register(&da850_evm_tl_leds_device);; C' a* w- }, D
if (ret)
1 n$ q3 n' s( O/ _$ Z& c7 K pr_warning("Could not register som GPIO expander LEDS");1 N/ q; a! Z: J$ R, ]7 d
else. Q+ t- H+ i. V
printk(KERN_INFO "LED register sucessful!\n");
) \* r! [! U7 D; X
' r# j. ]+ o6 X. c3 [& e' E return ret;; }) a" ^0 x3 C+ }( ?% Z
} n2 t- x; ]; N! s( H
0 m1 n# g3 o+ l" z h
static void __exit led_platform_exit(void)) l$ g. {% e( H6 O
{
" o! t' W5 ]9 G4 P H platform_device_unregister(&da850_evm_tl_leds_device);1 J) m2 C; L" K) T
" z( q3 v8 I* P4 q. G$ k
printk(KERN_INFO "LED unregister!\n");! ^- j t! _% Q) k8 ?; q' k) S
}
1 ~) t& ]# |) _# _$ ~
/ [, ?5 y2 @7 x! E* e/ @+ Mmodule_init(led_platform_init);
% P- A7 N; R. O9 x" k5 y. V9 {6 dmodule_exit(led_platform_exit);
+ u8 L, l% |: y' o3 q4 v" R( V/ z+ q- F! \ V' e; ~
MODULE_DESCRIPTION("Led platform driver");
4 E! {# d- W Z. B7 Z$ j1 P# pMODULE_AUTHOR("Tronlong");
8 Z Z; u, C* V: i k4 A$ jMODULE_LICENSE("GPL");
m7 l5 P1 `9 M; E$ `8 i- O) e* ?# [
5 F, x! k( ^! T3 e5 j& x; B% m |
|