|
|
求大神给下面的程序做注解,请稍详细些,谢谢。! j9 S# V5 J( t. D3 p, Z' E- V
#include <linux/init.h>) M! R+ T& D3 Z
#include <linux/module.h>
# @, [; ^+ u k- _: ^4 _+ T1 K#include <linux/kernel.h>
& `8 @1 K( b' | r/ j0 o6 f3 G#include <linux/types.h>3 M& \5 `* Q: z5 v+ O/ n B
#include <linux/gpio.h>
( D) {9 S9 P3 \/ e- l#include <linux/leds.h>1 |. N6 w1 Y9 ^2 k% `; n( y5 {
#include <linux/platform_device.h>' M9 B5 d- ?2 { n s
! t6 E: w# \' Y, o4 \
#include <asm/mach-types.h>
( x/ T4 A, M s \" V! w* t- O#include <asm/mach/arch.h>
: N$ Q7 ^; D2 _. A4 y# B7 a* T4 Q#include <mach/da8xx.h>. H9 ]0 T. l* k& b8 ~
#include <mach/mux.h>
/ h* _* W; O) I$ _2 M; J( C# l/ h8 y+ e3 H: A- h* o" t8 J
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" d, {: _+ H7 j& I, m
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)+ d; ~0 O3 U: Z3 Z- B
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)' u4 \$ |. R/ b. m
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)8 f% R1 D! [3 K# ?& E1 ]; S! c2 J
/ `( X6 ~7 @. R3 {/* assign the tl som board LED-GPIOs*/& F4 G6 g& q R3 y: o% l
static const short da850_evm_tl_user_led_pins[] = {- z. U( d u* w1 i9 ?
/* These pins are definition at <mach/mux.h> file */
1 M: F) B; j5 R% h$ \* P, x DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,$ X# W3 w4 I) \- N! b
-1: Z1 k) D: _# Z8 Q
};; }' X3 z' W! V5 O% b0 O5 P' w% m
5 C7 s/ N, E* D+ a9 P, n) Astatic struct gpio_led da850_evm_tl_leds[] = {2 ~) C9 e$ p" v
{
8 i5 y% s6 I2 ?4 f5 _- g4 c' X .active_low = 0,& ~4 t8 t& X Z: {! v
.gpio = DA850_USER_LED0,5 y' n0 T# l0 {6 G( @2 `4 Q
.name = "user_led0",
) V- z* |1 B! B' f7 @ .default_trigger = "default-on",
7 i/ F% v, B% L6 s1 y# C+ Z },
" x% f3 n" |8 u; c( b {
4 r# e, W5 ?) T! {$ \; ^5 l .active_low = 0,/ O. }+ p& r: |; K L: A; e) i
.gpio = DA850_USER_LED1,
5 k0 k& T# Y, H, \' l5 t4 X- Z .name = "user_led1",4 K, b) |) j& Z! l4 g2 V
.default_trigger = "default-on",% S! n+ ?& r$ s* Q9 ^& `- y+ T4 @0 p$ T. D
},* G4 J6 p1 `/ w* b
{
) f: `+ o) o$ q .active_low = 0,
/ A8 _4 g' s6 D4 A2 v7 I .gpio = DA850_USER_LED2,
6 f' d# _3 F; k .name = "user_led2",& B" m9 _ `+ Y3 K
.default_trigger = "default-on",8 W7 x& ], P& Y* i4 A
},' X% B! l5 ]* a7 R- D/ W
{
' @5 r' w( k/ o+ p: |. \+ V .active_low = 0,( R+ B B' S2 D$ q- L
.gpio = DA850_USER_LED3,0 t) n& h- a. {* k
.name = "user_led3", o1 y$ J5 Y. g, ^" R
.default_trigger = "default-on",- I$ ?$ e, s ]$ O# C
},, {+ i- U0 Z1 i% n, H. ^
};# C# B1 q& A& A k. {$ h# L6 j% z3 H
3 @2 e: t, [8 S- C3 c V) k
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {: J; I7 U; O5 j$ x6 |( m" k
.leds = da850_evm_tl_leds,4 v9 U. l7 T, e- T7 D* Y
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
. P* D! ]6 X: [8 E1 O) L, c};
+ ~4 ^: m( P; c: H) R# f# L( m* ^+ j
static void led_dev_release(struct device *dev)
8 H# f y1 {& M2 B; Z- V{
, K% O: q2 Q% {( L1 Y4 n @};2 b& u* G0 b2 a. j/ u) H) t) o
5 F- R1 Y+ r/ m3 y2 \6 f0 u
static struct platform_device da850_evm_tl_leds_device = {
0 @( P3 I. {* Z W1 U P, T .name = "leds-gpio",8 x- z, M# u# T+ ^9 M4 t! h
.id = 1,
, T; G Z' D, T' M, N) F .dev = {
~: l4 O1 i: v8 I: E! f% E* n9 l .platform_data = &da850_evm_tl_leds_pdata,: Z6 l; k6 D; x, e
.release = led_dev_release,5 D9 J; v8 J2 y9 n
}
8 p! D5 t) x+ m" E$ F};7 A5 o, {( j9 N( Z( F
1 }$ R. w& Z7 b; Y" J
static int __init led_platform_init(void)+ j& h6 z/ ?( s
{# m2 t7 b) T* @
int ret;
" ?! p$ F5 E0 r/ ^, `! {#if 0
" s! c" L" q2 S. P2 u ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);" h3 t4 ^) y: B
if (ret)& y6 W# t( w7 X3 w& l
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
& C, p4 n/ q! s; ?+ L "%d\n", ret);! o$ ^; o4 Q* ]% [
#endif/ D. X) w# G1 Z! e( K
ret = platform_device_register(&da850_evm_tl_leds_device);
9 h% h4 E0 g0 b% Q if (ret)1 a8 [% X6 G3 P) t# q
pr_warning("Could not register som GPIO expander LEDS");
0 f& y0 ~) b; {( R else# N; w& Z6 v; f0 p, U! k
printk(KERN_INFO "LED register sucessful!\n");
5 ?8 }0 i! z- | [5 X* t& }6 |. B E' k _7 U
return ret;
/ b5 g& P$ S9 \5 W- Y9 m( j}
7 e' r5 j# R. q+ m; O3 _$ @1 v: l0 X2 c" w$ g3 Z* S1 @) |/ {
static void __exit led_platform_exit(void)
! k7 |9 L Z# j; n# @0 i9 t# \: O2 x{ C7 L4 ~3 ]! A- I! t
platform_device_unregister(&da850_evm_tl_leds_device);
5 L5 l: Q4 |5 J0 a m" w/ [& L/ _) U
printk(KERN_INFO "LED unregister!\n");9 R, h' ]- C4 j- t+ J. H) m
}; _1 }! {8 e% c# @
$ p: g9 g, |$ d! _2 r9 q" qmodule_init(led_platform_init);
4 g9 f$ H6 V2 ?* E: ?7 J( J* Jmodule_exit(led_platform_exit);
! _; e# M! I5 ^' \
, C& w [$ E1 MMODULE_DESCRIPTION("Led platform driver");
1 N" ~9 R1 B P9 [8 b5 tMODULE_AUTHOR("Tronlong");
* J- p8 D8 E' u: [- {/ @3 G2 WMODULE_LICENSE("GPL");
0 }# C' z* U8 ?. M; V1 h3 `) y. e. ^- ~4 B! s
|
|