|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
4 `( r/ U! `. C. |* H4 x#include <linux/init.h>
- E$ h' ?0 R# n- r- k#include <linux/module.h>
" r0 a" w1 O& A9 @#include <linux/kernel.h>$ @8 R$ v* g7 p& }% Y
#include <linux/types.h>( [: j! L- C. f1 P; N
#include <linux/gpio.h>) Y- O; s# T# B3 s- b2 @+ }
#include <linux/leds.h>7 b3 R! H& S, u- i ~: ~: p" i; G
#include <linux/platform_device.h>
9 z" s" c& h' L. k; i& b6 Y
7 B6 y" q4 {4 @% L; U#include <asm/mach-types.h>
, }( D r9 O2 b x#include <asm/mach/arch.h>
' L2 V) H* ?! V ~0 F. g3 N h#include <mach/da8xx.h>
# i6 K& R7 u8 |, L2 f2 g#include <mach/mux.h>
2 K6 N- Q1 }8 P E, i! ?* f9 v6 ~! z
, n0 v" q; f8 s- } P#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
0 `( O w3 M1 T/ p8 y+ e#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
4 j, e! B {" k( s _$ e( v#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)$ }% Q$ r' W: l5 o/ `9 V
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)+ y+ X8 }* _& \
+ y6 W; u3 N! V9 M* E% q
/* assign the tl som board LED-GPIOs*/
$ \8 [( X1 W3 @2 A/ }9 j- sstatic const short da850_evm_tl_user_led_pins[] = {
8 ?$ C* M& y6 y% o7 i /* These pins are definition at <mach/mux.h> file */+ @( M; w8 _7 G
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
! g. y7 x" w7 _# x -1
4 P$ E0 A2 Q4 `2 k! j' }) Q};. c, l. e6 P5 F/ e
9 D: N" |$ |7 J! Q& L- sstatic struct gpio_led da850_evm_tl_leds[] = {+ W8 x8 y7 |; ^) c8 B5 f% Z
{( k; F- K2 E6 x/ l1 w. y9 G% a
.active_low = 0,! L- ]+ o) P7 E. v; G
.gpio = DA850_USER_LED0,: v4 X" o- V; ]$ m4 }6 E q) i
.name = "user_led0",
* @4 K. |2 u# y+ y! ?3 ] .default_trigger = "default-on",
# E9 W4 d4 N6 J },
: W4 C% P% i" B {" D, L6 W+ c8 p" c
.active_low = 0,( Y p( C- Z. H7 ^# v
.gpio = DA850_USER_LED1,, u" _ M. d1 C; m1 y7 M
.name = "user_led1",3 k! e5 v0 i# G ^
.default_trigger = "default-on",
: g. `0 ~* D5 y9 Z8 H; P* [ },5 L ~ X5 m+ j( W! D$ T
{
# s6 E4 f; {# Q% o- P( U3 M4 e .active_low = 0,
L$ P$ n5 a8 }) o0 }0 Y% x1 ~ .gpio = DA850_USER_LED2,: l1 X5 R- z, v4 w
.name = "user_led2",2 Q/ @- M( _$ W' { }6 m* n
.default_trigger = "default-on",2 s; ]& I6 D& r) c
},7 |. r! R5 F* F
{, M, Z9 T7 {' N3 ?: J
.active_low = 0,
: H; N* r, o4 [# F. H .gpio = DA850_USER_LED3,9 ~& E/ W+ ?" |/ V" e, e% t
.name = "user_led3",
1 H" \; n: p3 v: s" p3 M9 ] .default_trigger = "default-on",! }. v/ d! T8 V% ^ f# a: Y
},* M& t. I( k' u8 v. x4 `$ O8 f
};- p: v: M' H6 N8 e5 a& b
' I' ]2 N" W( r9 k3 J" a' M
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {1 q2 e! A. u4 l* D! g( U7 z( W
.leds = da850_evm_tl_leds,# w4 i l! x7 N6 s6 E
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
; ?) c& Y; g, J$ J1 S( S e( v};# k" X% m! W8 q* p" q3 D, C
$ Z- H& Q" i; Z3 s+ I9 b* {
static void led_dev_release(struct device *dev)1 g* n1 [9 c$ y" H
{" D( G K/ h7 t
};0 c5 |$ ~5 O) w- Q4 ]$ A& \; g
$ b( ]9 M' O& _& i! O! f
static struct platform_device da850_evm_tl_leds_device = {! A2 }6 `5 g8 v! W. o! z
.name = "leds-gpio",: g0 K! x# k( U
.id = 1,& X+ O1 x1 [4 h; Q4 q" _
.dev = {9 n( m& m, O% E Z5 u, \
.platform_data = &da850_evm_tl_leds_pdata,/ y& ~' T5 M$ m3 A c$ p
.release = led_dev_release,
* i) [. |/ m1 X5 D: ?6 j9 v }
! ?% f# R$ [2 ]& c}; |4 l; l5 }; L' d& ?. {/ y
/ h$ V9 a8 B( k$ d. Rstatic int __init led_platform_init(void): H: C+ R8 k8 h+ e0 p
{
1 X x, U6 d- q3 b8 [' c int ret;5 u) b5 {! D* H8 Y
#if 0
$ j$ M. _' U5 Z" U' }" T ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
/ t+ p- `7 x7 f if (ret)
; @3 Z- H" H/ G* S: @ pr_warning("da850_evm_tl_leds_init : User LED mux failed :"( }& a+ e. F+ q5 z7 t
"%d\n", ret);; K8 |1 ]1 `2 v3 o( T; G3 w7 S
#endif
, [; K [4 ^$ k0 j ret = platform_device_register(&da850_evm_tl_leds_device);
9 G$ {/ _) s& J6 V* L& M if (ret)
5 o$ @7 g6 U/ r; y& t pr_warning("Could not register som GPIO expander LEDS");
! J5 L4 V1 h: Z else
* O2 C( [ ?5 q- p printk(KERN_INFO "LED register sucessful!\n");* B1 |7 D; N; D; H
5 w8 e' d: c9 W! D return ret;6 N. w6 a1 M- \$ Q1 E
}
' ^4 z1 {# N u2 @! W( C" R
3 ~, V$ s: D2 Y5 Q T( xstatic void __exit led_platform_exit(void)% p" R( m) k3 J$ W* Z3 h/ O0 _/ o& F
{
* d3 k# [8 P2 Y platform_device_unregister(&da850_evm_tl_leds_device);) a& A. ~( S4 e
/ ^: O8 u. ^) k+ C/ @( g printk(KERN_INFO "LED unregister!\n");, b% O# i; i7 t
} E" F1 H: [ A% Y$ w' e6 v
: `- U# o! V, ?
module_init(led_platform_init);
2 k2 w% b/ S7 P# e: o: B7 n! O; Amodule_exit(led_platform_exit);* P' `6 X1 T1 s, g! o; Z
1 W+ w, _7 L: N) P/ @8 Z
MODULE_DESCRIPTION("Led platform driver");# U8 m/ ?7 B( W1 \
MODULE_AUTHOR("Tronlong");
5 q+ ^( n/ h- e/ z1 p: nMODULE_LICENSE("GPL");
0 U5 p- w" N& u5 H" ]$ N7 g; A2 {3 J$ T
|
|