|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! `. {5 v; @4 V4 G( c1 a#include <linux/init.h>
& ?3 x# [# |9 v2 S' g0 F#include <linux/module.h>
& m+ o# ^% S; M, S; R#include <linux/kernel.h>6 b4 Q, d: O4 V1 |% v
#include <linux/types.h>
2 [0 r/ k) P f4 t. g#include <linux/gpio.h>( o# N$ T- c# [% M% ~) `& o
#include <linux/leds.h>. C+ S, H3 D+ B1 M
#include <linux/platform_device.h>
* S8 v% j0 f: {7 U
- \$ `5 r( X/ E#include <asm/mach-types.h>/ {( u$ O2 r- ]7 _
#include <asm/mach/arch.h>) p1 X- [% Y" e* C8 r* ]: {
#include <mach/da8xx.h>
, t' ^( Q& R2 j* U* x#include <mach/mux.h>
) u. s* O: N l+ \; V& ?, a9 c0 P
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)1 y: a* U9 ]2 I
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)' `& V5 T% D+ N6 x+ `% e/ X
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
\7 c2 g( [* F#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)6 S1 m$ j# C$ l2 w; j0 Z. ?1 c" P. \
$ Z; Q- R! r! f4 @9 f
/* assign the tl som board LED-GPIOs*/
* p' a2 |9 ?* z* e/ N3 K/ gstatic const short da850_evm_tl_user_led_pins[] = {
; D5 t) N! \! X6 c /* These pins are definition at <mach/mux.h> file */
0 d5 O! k( R: S% \ j- J+ A DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,9 @* G, H9 n9 D4 ~
-16 t0 S& g9 {, h3 ]
};
' D. O/ P2 a6 y' ^% V" P: m4 ~8 l2 I. [ V" x
static struct gpio_led da850_evm_tl_leds[] = {9 p5 r7 X3 ?! ~ j/ z0 J
{
, R+ }3 A; C2 L5 E: P9 K% P .active_low = 0,
' Y( \! P" ?, z/ B$ M/ H7 G .gpio = DA850_USER_LED0," a8 L8 }$ m, W
.name = "user_led0",
! y9 p! W% j4 H0 e8 K .default_trigger = "default-on",
& g$ S) _% {5 [/ J },
# ]* Y( }! ? y3 o$ j {
5 A* Z6 m# A/ E8 M& A3 s8 v" n .active_low = 0,: z: a5 k; }/ }3 K0 @; h/ }: m* u
.gpio = DA850_USER_LED1,' t4 }' b1 b( T+ r+ a5 Z
.name = "user_led1",' \/ u0 Q7 S( _9 W# o9 w
.default_trigger = "default-on",
6 T1 J6 V# c) a$ s },8 I$ ~8 z8 @7 ]
{
- Y; ?/ X8 v/ D7 Q" |; y2 P3 Q .active_low = 0,0 ~3 b8 H! Y6 h; q7 K7 d0 }8 q
.gpio = DA850_USER_LED2,
* p+ f# R( w4 I7 r9 [ .name = "user_led2",
* K4 D# J% v: L .default_trigger = "default-on",' K$ g" Q5 Y3 s/ Y4 r) Y; d
},( K# f$ U& z) h
{
% O: u8 m: T! d .active_low = 0,
6 J k7 e, U$ O7 V .gpio = DA850_USER_LED3,
( u4 Z- Z7 ]9 {( ?# s! o( K .name = "user_led3",6 B' \/ H) r/ i+ h' b& x
.default_trigger = "default-on",! g& U0 r- ~4 o7 h. b+ j6 h
},
+ L7 j- P, T# ]$ e};
& c1 Z$ A& Q+ l' q2 q: P$ \ C) x. M# @) D( K h# e
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {6 Q- K2 u7 \* {. f6 u' Y
.leds = da850_evm_tl_leds,6 \9 d+ m o( |) t
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
' `* E5 q q) f, |* |2 a' z};
! i& i% Y% r: }# _4 T( _5 D; d) r6 [! b
static void led_dev_release(struct device *dev)9 d3 d9 N+ y! d* z8 o( t
{4 \. t) ]2 Q0 c2 s- V' {
};
6 d' U/ l! {( X) d+ I& I, r/ ^7 r. u! f( C) Y. K
static struct platform_device da850_evm_tl_leds_device = {
' R: Y* \# C7 n2 ^ .name = "leds-gpio",) P8 [; K; V: ]5 K( U/ C5 n+ l5 W' [
.id = 1,8 ?' \: q& O8 n( G' X
.dev = {
) f" |3 _' w& r6 { .platform_data = &da850_evm_tl_leds_pdata,4 T5 t; P; a. _7 J$ j3 b
.release = led_dev_release,9 Y5 i0 G+ P. h+ s7 g
}
6 U1 P% d* E. ]' a0 d; U' G};
" O0 b8 P* q" O- ~) F$ V% D9 S% }' {6 z0 I
static int __init led_platform_init(void)$ ?( R+ L& g9 M* I- V
{7 F: x8 n& b8 j' e( g: A
int ret;% _$ y7 W) i; t
#if 0
5 Q+ f6 _$ a$ A% E/ q$ [9 A8 e/ K ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);4 f, R- w8 [% I
if (ret)2 O% a) |1 x0 {) t) Y
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
* U( z# i1 u# a5 p8 ^. Z! d: Z "%d\n", ret);# N H# {* M# k1 ?* l5 z, k
#endif, |6 R7 |7 E" b! y; F
ret = platform_device_register(&da850_evm_tl_leds_device);
& R# E6 K$ l) O$ X9 [, u5 O if (ret)
1 m& L. J4 r: N" O: [# r1 u1 L pr_warning("Could not register som GPIO expander LEDS");% J! {9 M5 A5 _6 }) O# O S) H
else( H2 s3 v' {' p
printk(KERN_INFO "LED register sucessful!\n");% e+ A6 ~+ ?$ a
; s: l# p+ i8 P9 ~ return ret;
6 L# ?8 x/ \4 \& d}* ? s3 Y3 h8 | R5 A/ p- p
9 O; k- u6 I0 E& _ ~& i& Y, h
static void __exit led_platform_exit(void)
( d) i$ A& T! d& G/ q* x' A; w{" c9 F T$ y& e8 @, l9 K
platform_device_unregister(&da850_evm_tl_leds_device);
# i" U) v2 x; M& j) F# _! y* J; R' Y( n' S$ _; _
printk(KERN_INFO "LED unregister!\n");
: V4 d) c R9 g4 n}) v* F \" x, S: I7 f( a4 d
; o4 o: `6 A, \- E3 M, A$ |module_init(led_platform_init);
, [# n L9 t# `! z, f% {4 dmodule_exit(led_platform_exit);& d1 N- g* r. S) `0 n9 ~
( ^: T( b) e' s" ?$ r3 L0 b
MODULE_DESCRIPTION("Led platform driver");2 I9 k4 Q0 t: e3 y" t
MODULE_AUTHOR("Tronlong");
" P) A& L2 [* T; TMODULE_LICENSE("GPL");
9 t. W' `4 Y: K: r* g- F* k) Z! ?, o. [
|
|