|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
' _8 B! n. ~9 Z#include <linux/init.h>
& \# y* T) }. w% G#include <linux/module.h>( Q8 S1 D8 J- d5 ~$ j+ j
#include <linux/kernel.h>
" C. x! K# `" M4 B#include <linux/types.h># |1 J7 J3 B# D' B
#include <linux/gpio.h>
# _3 z' H7 _! u9 P7 v#include <linux/leds.h>3 R8 s* M% d5 T
#include <linux/platform_device.h>) T/ F6 R% ]- Y. Y7 [
; }$ r6 x3 ] ^; v
#include <asm/mach-types.h>! A! e0 J( j/ T9 x
#include <asm/mach/arch.h>
0 \- {/ W" Z. F1 J" J( i5 O6 R#include <mach/da8xx.h>
) y4 k6 s8 H! _' Y6 n# f#include <mach/mux.h>+ a" j4 u2 E0 @( U& [$ D7 Q+ ?3 V2 H
% K- F; `9 D' g d7 z2 I0 d
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)" m" A9 k' n, M
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5); o p2 i/ w( P
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)+ {. w' j2 t9 h( E5 e
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)- q) Y) s5 i& M6 P# t1 T% u
9 Q4 t! r, C* F6 a4 H; d$ D, S/* assign the tl som board LED-GPIOs*/5 a H1 W+ C* L& t6 `
static const short da850_evm_tl_user_led_pins[] = {
: Y' I+ x) p- C, O1 E /* These pins are definition at <mach/mux.h> file */
# x' S1 F8 m( V* x6 b: c DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,7 \; X, C% d2 n+ u- R4 Z$ i# x4 d
-14 B0 p. a! [% t1 Y+ w
};7 e- I/ x% j7 _: y& E
& H( L1 w0 k/ y- l" Y
static struct gpio_led da850_evm_tl_leds[] = {; u* R) n4 O& S3 t* u0 c6 X+ o
{
! s' L M$ d4 q% Z( L .active_low = 0,
8 u L# F8 i# X* g .gpio = DA850_USER_LED0,/ y1 T' Z! m0 `1 T$ T3 b' A
.name = "user_led0",
2 i' Z( q t" g2 b$ W6 Q9 K .default_trigger = "default-on",
+ e3 f$ T" l4 }/ S' T% m6 C },* } E, R8 G- ]4 g" d U5 {
{+ f6 Z& D+ z3 s* u1 @, F
.active_low = 0,
F3 K5 a# r2 j2 E8 F, O$ g) Y .gpio = DA850_USER_LED1,
5 [- G- s% d0 ]) G. W/ o .name = "user_led1",/ W6 i4 Q' D4 Y6 v1 a- m; r
.default_trigger = "default-on",
0 Y3 d* g6 k! D8 a" R },9 \: T; d/ L6 e t1 U
{' Z( F: ^3 u: g- p7 Y: l
.active_low = 0,( x" l9 ]) [7 b+ i2 M
.gpio = DA850_USER_LED2,0 \; {7 W8 P, }# u( m
.name = "user_led2",/ w. \; P T" ~ a: Z
.default_trigger = "default-on",, w# t: B3 a& a- l5 h, t- f" g
},
. }1 a- | N+ \) P, Y* a. y {4 {6 R: n) z. c* e( h' m
.active_low = 0,& ~0 f7 Y+ V# L" ~ O( _( N- [
.gpio = DA850_USER_LED3,. z" W! \9 q6 L- Y4 c. G
.name = "user_led3"," g. J1 }! e4 E3 t8 B% K; N5 w
.default_trigger = "default-on",
. `: p5 I: h1 t. R },0 i: L- k% _+ ~. |3 g5 J' g
};
; z4 z ~6 W/ }4 A7 m* v% q
; u- F- _% W( K' k1 ostatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {$ @& U+ L+ M9 u% l z
.leds = da850_evm_tl_leds,
; g. r8 m6 c9 `4 {' e$ r .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
" i; @3 g3 w+ U2 ]6 ?: v6 m3 O};; `! w* A* _/ O B( X6 P/ C
O9 w& {* U5 T$ c+ `9 istatic void led_dev_release(struct device *dev)0 S- o" E+ E# L8 V3 K
{
: G) `) a8 G* l};4 s1 G6 V8 r ~ w- a+ v
; K1 s; n+ g) X, U4 e3 L; c- X
static struct platform_device da850_evm_tl_leds_device = {
9 N7 `2 v4 z6 W9 d* d" U6 Z .name = "leds-gpio",% P2 }9 v8 z6 q; d& g5 G3 X
.id = 1,$ X/ t. \7 Q- m) s
.dev = {
8 ]3 g6 \" ]* u. b- m$ | .platform_data = &da850_evm_tl_leds_pdata,
6 g0 p% [! y$ ` .release = led_dev_release,
H% \# J1 o L$ Z }- k1 w& f7 f+ X s" ^
};6 |. V. `. J' v
5 Z; g$ e5 ?3 M3 |static int __init led_platform_init(void)
' O, L# R* C. W& K{* `6 ]# Z5 G" ^5 o3 F
int ret;* \+ `4 b. | Y6 C# `7 T
#if 0 m$ W( [4 @' q/ k
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
6 W+ |% d# [% F( e6 x. ]* u4 O: D4 @ if (ret)8 @2 e% g, E) U1 a6 A. c
pr_warning("da850_evm_tl_leds_init : User LED mux failed :") ]+ }$ V0 I: j a- j8 t( P
"%d\n", ret); n% ^1 J0 y) k. g! J
#endif- a- X$ F) G$ H5 E
ret = platform_device_register(&da850_evm_tl_leds_device);: v9 }4 Y1 s2 s1 C# O( z1 @. r
if (ret)
5 E$ W$ A& K+ B+ A1 r( n pr_warning("Could not register som GPIO expander LEDS");
. }: z4 k0 m1 l+ R4 R4 I else4 H: E# Z! w: F; J
printk(KERN_INFO "LED register sucessful!\n");) \7 i; k0 w1 s% Z$ J v
$ g6 t7 k# i$ g u4 _; E0 Z return ret;
; X: Q5 @$ ?* ^7 L: b0 I}+ W$ p* e6 y( R
/ x* K) G8 \! \, @1 E" t, f& D2 B3 i
static void __exit led_platform_exit(void)
, S" s9 B0 V! G1 q{
: C; g' r4 c" p( n$ F5 a platform_device_unregister(&da850_evm_tl_leds_device);
6 O- ^. l9 V1 |0 N
8 m2 a8 U6 T0 j' L* {1 I8 H- _9 J printk(KERN_INFO "LED unregister!\n");
2 Q" G: N7 ]7 h2 x0 J}* q4 ~0 U& f4 n7 `! b5 {( y9 x7 D
7 S. w9 _' J% L3 y* K( ?7 l5 Nmodule_init(led_platform_init);
/ R b2 M% z. X0 j' t1 L& Rmodule_exit(led_platform_exit);
2 h2 Q0 Q5 `2 i2 ^* ^9 Z$ W
2 l- P* A: l3 e- ~+ e$ Z# DMODULE_DESCRIPTION("Led platform driver");0 z0 I" `4 v- d& `4 G. F4 C
MODULE_AUTHOR("Tronlong");0 e$ s* a' U$ r6 U% l
MODULE_LICENSE("GPL");1 G; U0 C# R, J' k. B: p7 b
- [; N. k% h6 M7 a, m7 [) }1 z
|
|