|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
+ c* ^0 I# w9 s+ ^* C#include <linux/init.h>3 H7 Q4 i, b g# U) K
#include <linux/module.h>* @0 @$ V" T8 k, {& D R
#include <linux/kernel.h>
7 Q- r( b) w( D* n! P#include <linux/types.h>: o' @% s H3 h, e, y
#include <linux/gpio.h>
1 g' Q% v: g8 {( k4 c+ Z8 j#include <linux/leds.h>2 H. S# m z6 C
#include <linux/platform_device.h>
* t/ \7 I; K4 `% x3 f; S4 r k( C5 G' n$ W- F0 B- {
#include <asm/mach-types.h>
+ O8 @6 a/ V" I; I% ]6 {#include <asm/mach/arch.h>. V5 x8 e" R% f$ O
#include <mach/da8xx.h>0 T6 P) E3 {( C5 B' p0 N$ r1 Q6 w0 H
#include <mach/mux.h>
& a) e: S. Z4 B, L p- \( ]$ l9 F+ D+ j; ]1 h% r) v0 E6 O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
& L3 B$ H4 [, z: \5 v7 _7 v#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)9 E8 w3 J" U3 \! {# y4 T
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
! u" J' o8 n+ g6 I( G#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
& ?2 g9 j" d$ p
/ K3 J. _9 a$ H# E' ~2 q- v4 a0 |/* assign the tl som board LED-GPIOs*/
# \" Y3 B* }* U# p/ @static const short da850_evm_tl_user_led_pins[] = {
5 u2 s5 x! t! L4 C" Z /* These pins are definition at <mach/mux.h> file */
6 ~0 B5 v2 k* p% ?: X DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
8 _* F4 G y q! n6 ^0 f X -1
# u' b4 O2 R+ W8 _};
- |4 y2 A9 c7 P7 Y! b3 e/ H
& O/ o. c0 \ M7 K7 n3 K& _static struct gpio_led da850_evm_tl_leds[] = {
- J$ ` }/ [* i t4 U) y {
$ a+ Q* b# K6 P2 W+ E .active_low = 0,
/ ^$ Y0 `; J: ^* Y2 |+ s( t8 X8 \ .gpio = DA850_USER_LED0,
. @) }' `/ {" h- R) `; M4 C0 f .name = "user_led0",
# r8 E' q8 q, y* \! z8 I) r .default_trigger = "default-on",
4 h: K2 p3 i3 D9 w, O5 y },7 w: d- m1 ?4 W# j1 _9 J& q
{* Q. i- ]9 A: Q9 B" S! E
.active_low = 0,4 w0 h: X( U; m; f
.gpio = DA850_USER_LED1,, P# G% x( Q" p0 Z S; T: c
.name = "user_led1",
3 {% e, B$ x8 a( o .default_trigger = "default-on",
: Y7 m4 T9 J1 C9 R9 s, X },. o: {. ]/ G# V; ^8 g/ E
{
* D" E3 X5 V# h5 U .active_low = 0,/ X- I3 u7 B6 n4 g s; H* Z
.gpio = DA850_USER_LED2,+ _. B! V6 n$ P# {0 v" n* ]4 z: u
.name = "user_led2",, j6 A. }$ _ M7 t4 U" w5 i2 h; _
.default_trigger = "default-on",2 T, D/ I3 @7 T" F0 M
},0 a- [* W* u8 U
{% p+ P o# M! a
.active_low = 0,
7 m6 S( S9 j5 H1 A0 _4 } .gpio = DA850_USER_LED3,2 [+ B6 V( t" m" s7 Q
.name = "user_led3",
% z8 ^* d% }4 _( n! c- U) M7 W .default_trigger = "default-on",
; F `" `, i: p/ P1 o6 J& W0 j },
/ V$ o3 W) j% I9 j. @};
7 ^0 N5 I& C( ^9 Y# @/ W @" O) b% _* ]* [& N/ i
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
; @6 v& [2 m& k .leds = da850_evm_tl_leds,
) q4 F5 C A3 |5 Y! h .num_leds = ARRAY_SIZE(da850_evm_tl_leds),1 T& n; m* z$ T+ x C$ O; a; n8 {' z
};+ e) D. f% n; A1 A2 i$ j( x
8 e% p- Q1 S! V: T. r& `static void led_dev_release(struct device *dev)
* }* B( N0 O& f; z4 t7 l; d3 K{# g1 G. N l0 C0 l- A2 O6 ^
};8 I% y+ J. R5 ^& p6 A5 E. S
1 @9 R6 z( Z% jstatic struct platform_device da850_evm_tl_leds_device = {) l# d. ?$ ~0 @* g3 a- x
.name = "leds-gpio",0 B# D( @+ i9 z6 L
.id = 1,
5 x, N z: x3 C! d) o .dev = {
- D& S: X4 c- Q) V# W# i& O9 X- { .platform_data = &da850_evm_tl_leds_pdata,
, Q- r& A% ^" B6 F0 s6 I1 w .release = led_dev_release,/ `7 X7 g \0 |4 X5 \# c/ @, R0 W
}! }# N6 V! P( f$ o. e6 ?4 U8 D# ~
};/ L) e9 E+ z) F9 U P3 |! e
# D" q5 U- W. \& r0 V; R
static int __init led_platform_init(void)
0 p7 [) u/ f7 d J0 K{9 L$ {7 Q M- j% k
int ret;
: \1 c1 c. s0 m- m#if 0, t' `0 {$ G% |4 _8 m6 D7 N
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 I9 M3 F% M2 k if (ret)5 m4 r8 T/ z# j+ e p- N* b; ]
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"0 R* [+ B8 [5 T8 O1 J8 c+ D$ r
"%d\n", ret);
, U( t6 c& R7 B3 s9 H' b6 b$ }2 H#endif @% L* y5 y3 _2 y& _8 W, v
ret = platform_device_register(&da850_evm_tl_leds_device);
( O& m) b5 X* M/ Y9 ~ if (ret). o0 Z# E( N& K- O* U3 q
pr_warning("Could not register som GPIO expander LEDS");. c2 B, u. q: f o6 J( N
else
' h$ _- }9 U0 T( R! w! W printk(KERN_INFO "LED register sucessful!\n");
& I7 D' s. ]9 j1 m
4 Y1 N+ G1 u1 F, C' Z" n9 d return ret;7 |) o' q7 r( E+ N; z: O
}
' s- I; A: w* z9 A( \2 ~8 D5 P' c& o D# I
static void __exit led_platform_exit(void)" y l" d4 M: q5 { T0 o' p1 n
{
2 m' d$ f+ ^1 C3 L platform_device_unregister(&da850_evm_tl_leds_device);
- Q2 T+ a8 J- q' X; q/ m4 {: Q6 a7 B" X; q& V
printk(KERN_INFO "LED unregister!\n");9 h6 k" o2 a& E
}; ]6 B8 X$ p; D. J
7 L6 ~/ a% p6 H4 C9 u' ?4 v% Zmodule_init(led_platform_init);9 O- }: L/ r. ~$ N
module_exit(led_platform_exit);
0 ^8 q4 L1 W2 z3 [) r
% h: L# f$ r: E/ @8 AMODULE_DESCRIPTION("Led platform driver");# v G# r( I% v+ c
MODULE_AUTHOR("Tronlong");/ I% P! J, B. k/ {' [/ p
MODULE_LICENSE("GPL");
8 V0 O" N* I+ L
+ I# c4 r x" u* |. b8 y |
|