|
|
求大神给下面的程序做注解,请稍详细些,谢谢。# R( G' y/ m, {# F& [5 H
#include <linux/init.h>
! a9 E0 c6 p8 p, N/ n+ b( L#include <linux/module.h>8 Z" N7 `$ c8 r. d+ n
#include <linux/kernel.h>
l5 R$ z$ g" Z#include <linux/types.h>
' b6 B. { D- N5 U/ X6 r2 f3 e#include <linux/gpio.h># b1 R) N4 k$ Y- a* k: {! o
#include <linux/leds.h>
' F3 `6 S6 `& s& x/ B* I' s#include <linux/platform_device.h>0 I! I* Q2 q$ ?1 V+ z
1 v. L4 }2 P5 d. E" g9 o& {#include <asm/mach-types.h>
( n; B7 B) r$ G. R, q# L#include <asm/mach/arch.h>
/ J# p3 A3 T# Q. ^% @#include <mach/da8xx.h>
% g& I. Y$ q0 l#include <mach/mux.h>& V6 g. I: {. F' Y5 N, G$ {
, D9 v" R; B4 e6 k6 a
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
6 ^5 H! l# e/ I#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)0 {6 i& g. g$ Q) U
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)# J5 j# o0 e# o! `$ _
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)3 S V/ w4 c1 `# @: R4 C
3 g& E$ D9 c$ a% m$ C# B
/* assign the tl som board LED-GPIOs*/( a7 `& {1 }+ M* F* Y; I" n
static const short da850_evm_tl_user_led_pins[] = {: }% i/ z7 V8 N3 u
/* These pins are definition at <mach/mux.h> file */% k" q( z) w8 k! R% v
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
$ r+ B7 u5 N; U$ Z2 r* B -1% n) v$ a8 p9 p
};0 v4 ^9 Q$ `1 o. F5 H# z) N
: {. Y# F8 @% ]) K6 ^6 W% sstatic struct gpio_led da850_evm_tl_leds[] = {
; h2 K: D5 F4 T5 I3 X4 V {
; n2 u% l6 f# V& q$ Z! o .active_low = 0,# c7 ~6 g$ v K0 |2 U( l& x) c
.gpio = DA850_USER_LED0,
4 i% s# n$ v. D' I% {- U .name = "user_led0",
& h: V" `3 C" U .default_trigger = "default-on",
5 w3 ]# k# N+ r# `! h },
& s" J1 ?: M4 `6 d0 k6 n {
. f! O: j3 J+ L; v& } .active_low = 0,5 v, L# w9 n2 r. B! P" P7 I: W7 c
.gpio = DA850_USER_LED1,
& f2 F' @$ E3 }% E7 F9 k .name = "user_led1",
) P: J: W4 |3 u; }4 [- j .default_trigger = "default-on",* H$ |. b1 ?) N
},2 i6 X: U9 s. K. y+ i+ l! }
{) P: D2 Y$ k! o! U
.active_low = 0,9 i$ j2 n) ]% W9 O
.gpio = DA850_USER_LED2,& {. Y2 A+ k7 q3 r+ {
.name = "user_led2",
. j- f0 j; P( q3 U: n2 ~ .default_trigger = "default-on",
8 A% u- ^- m9 t5 J; ?4 I X v6 W, L },
4 v$ I6 s Z$ O; i5 r* D T {) F% R x. l5 d Z( U9 C! m
.active_low = 0,
0 C6 T! F- W) }. c- Y2 y .gpio = DA850_USER_LED3,
_; p/ b! [5 | ?2 m+ l' N: y+ w .name = "user_led3",1 B* _* B& j6 m/ [8 u( \. w
.default_trigger = "default-on",8 O y2 d7 ~3 T: C3 U
},, x9 m9 A/ X8 y: R5 ~4 Z, Z5 n1 e
};+ ^9 K$ R6 H9 l
' d0 u. M( H4 ^' ~6 nstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {7 c0 ]9 |( S* n; k6 i
.leds = da850_evm_tl_leds,7 o" Y6 p. O, W; k
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
$ b& p2 o( d# H6 w: e- o& Y( F};, o; {' M y7 \! g) Z& ^" x
: K+ d* c8 k% p4 s+ G- y
static void led_dev_release(struct device *dev)
( N0 ?0 v. e2 `& v& K{
) ]# | j+ y, [8 e9 ]( t};' X$ _3 M F7 s4 D3 o
1 I+ J. ?8 y+ r/ @5 A! @
static struct platform_device da850_evm_tl_leds_device = {; {/ p+ L0 Y) R+ T
.name = "leds-gpio",& Q9 x* F; Q( R4 w6 ^! ^% _7 S
.id = 1,
% L0 T3 [! g4 o. m .dev = {3 _2 q8 F( E3 U7 _6 u
.platform_data = &da850_evm_tl_leds_pdata," X# K- p: T' f$ y( t9 o
.release = led_dev_release, F" ?" H2 _3 k# u
}
* j( D; }( y9 v1 @6 t \% i};
: b# Q4 y9 e6 H# y+ i \9 o& Q+ I
2 I( D) _$ R5 K; k! z) M' Rstatic int __init led_platform_init(void)
$ h. _$ a" c/ Z{
! s! L7 g3 s0 w1 V- _ int ret;4 J+ p' Q: k3 E/ o1 ?
#if 0
+ h2 R* {% n, ~& f" h- {( C ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
' U; Y4 q; M" x( m if (ret). _) s- b( b) A4 E: ]9 C
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
# a M5 H. l; V+ f3 L; T "%d\n", ret);, i8 u6 L" y0 e% N
#endif3 r. t8 |- Q8 h9 f7 h3 e2 C% m
ret = platform_device_register(&da850_evm_tl_leds_device);
# C! S/ e# Q: B if (ret)
, \7 W% W/ q/ D pr_warning("Could not register som GPIO expander LEDS");
& k, G9 t5 [8 U0 Q4 N else
" c" W, K* ^* ], M8 } printk(KERN_INFO "LED register sucessful!\n");
- t* @' p+ y/ N q+ v" E9 E
1 Y' b8 @: ^' ]$ M2 ] D0 v return ret;+ j" V- `7 I: C4 _
}
0 R G: d- E6 ~( {0 R6 O! d
Q! k* {& |1 q4 F' ostatic void __exit led_platform_exit(void)1 p& \( M: t6 l5 g) _
{
" `- B3 x; G2 H* ~2 J4 Z$ s platform_device_unregister(&da850_evm_tl_leds_device);
' c# r7 J3 p7 g5 F
# }, F6 I+ {( t5 N printk(KERN_INFO "LED unregister!\n");
# M' K/ w* | S% s2 R}/ T$ N7 H2 X" O; L' K5 N8 S
S! O# a8 ] ?; h1 G& q1 _) a, ~
module_init(led_platform_init);& V; r. z5 m( Z0 S' n+ z* W
module_exit(led_platform_exit);: _! \- t* e7 M, n9 N8 A, b
1 w) n$ u9 s* Y! d5 \1 @( v
MODULE_DESCRIPTION("Led platform driver");( _( C9 g2 b9 m6 W( y3 v
MODULE_AUTHOR("Tronlong");
% V- j4 e, m# z; c2 `MODULE_LICENSE("GPL");
! J, _" [/ q4 j8 x
* f% S3 B8 X) i7 H; u |
|