|
|
求大神给下面的程序做注解,请稍详细些,谢谢。$ o+ u8 u4 B R N' m. b$ b
#include <linux/init.h># y1 P* F7 `* V# y; {" F
#include <linux/module.h>9 D) \' N8 D4 f }3 Y
#include <linux/kernel.h>
! m' Y( P6 R+ E#include <linux/types.h>4 Q& c. g$ a; L Q' [
#include <linux/gpio.h>. F* [3 o* r: D) E
#include <linux/leds.h>3 j) ~* O/ k- B% A4 R2 p
#include <linux/platform_device.h>4 f/ \3 p6 T! f5 Q: I' m f2 t4 q
" O0 C8 {2 E( _ s3 `9 e7 p& b#include <asm/mach-types.h>
- A/ l& \$ a$ \ S; {1 w) X" ]#include <asm/mach/arch.h>
! f( x" Q7 N/ m% Y' S#include <mach/da8xx.h>5 Q' _0 a1 T% j( v; c3 D
#include <mach/mux.h>: a5 b, w1 L" l% }1 W
6 F# P3 N! s! C# O
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
( V8 f7 Y& z5 x. y#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)5 ^ S& ~6 w6 ~2 C H
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
' j( i' `" x P; \3 e3 d* _#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
5 ~" u% H/ s3 }4 G# G5 f }& h, V: g& \' r, @+ F# t+ m( _
/* assign the tl som board LED-GPIOs*/$ p8 ]/ P# r8 E( E2 r
static const short da850_evm_tl_user_led_pins[] = {2 P0 @6 ~6 V" a0 U$ c6 ^; _
/* These pins are definition at <mach/mux.h> file */% U& }* X: ^1 _5 c2 h6 B
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,: e. v* E1 k* c
-1
$ O( n# M5 R& _+ I};2 N7 t. ]# i, o' L- T
9 w5 @% C" R8 S$ s. x$ C0 C4 a) tstatic struct gpio_led da850_evm_tl_leds[] = {4 ]/ k, w& J' K t" ?( j, {% ]
{3 G" H$ Q5 Y; j' }# P$ Z
.active_low = 0,) t6 Q9 N+ f& k% M7 o
.gpio = DA850_USER_LED0,
! T. N% G5 }. X' O .name = "user_led0",$ i* T7 K$ h( B2 x/ h3 r# ^
.default_trigger = "default-on",9 \6 m: p4 j& B: M2 B) o5 _
},, ]( v+ C( T* Z
{5 ^# ~/ r% d b3 |- n
.active_low = 0,* r7 x9 p* q4 r
.gpio = DA850_USER_LED1,$ W) {- I) G0 A l% T/ N2 u
.name = "user_led1",
6 f: z( U9 j- f: U .default_trigger = "default-on",! t7 O' Y! y' ?6 R; X) p# T
},
5 N: R* `6 z* H- [. p; ^5 \: {0 E {
7 |' G y9 k1 k5 |# u .active_low = 0,4 r/ z* z% `/ X( U' j; L0 C) i( \5 d
.gpio = DA850_USER_LED2,% E2 C3 I7 V, g% Z* t. A
.name = "user_led2",
+ d/ g( K2 ~' C9 j% Z7 N& W- p .default_trigger = "default-on",
4 [2 o+ d q) G" h& w },1 i7 y+ b, n3 I' Y+ m& Y" b- i. r
{
% E1 V9 T# A3 q: q8 }4 s3 \ .active_low = 0,/ X! X1 A) F! J( m! g
.gpio = DA850_USER_LED3,
5 k& I5 V* s6 d .name = "user_led3",
' W- p3 d8 R* @8 ^/ W* t. D$ w .default_trigger = "default-on",
* [. }2 I( B7 W# `2 J },9 m8 P' @( V: b- l B. c& ?
};
% ^6 |: W# g3 B4 o. y& N
- d# W$ T1 g8 C: S7 ~% ~& d. Fstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {0 t* M( b e. u# V
.leds = da850_evm_tl_leds,& m/ Z8 g& @8 {% a
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ C+ {( C: G% P: e9 c6 _};
- t% L' w) }! y- t& B1 G; ], e, R3 C c& B) F7 t
static void led_dev_release(struct device *dev)
$ C6 ?2 E$ F! F2 N4 i{
3 X0 I6 I' x+ W1 i+ F; v};, E9 E3 t. [( }( {
% S3 ^ l9 v% E9 Istatic struct platform_device da850_evm_tl_leds_device = {
* K4 Q3 t# z' p: Y3 _ .name = "leds-gpio",
" c! E+ R+ C$ ~) K& e .id = 1,( O2 h7 b" a) u8 Y& @. h: R" U' O
.dev = {5 C( P3 r- G1 a# S9 k
.platform_data = &da850_evm_tl_leds_pdata,
' o; u4 t9 ?/ n .release = led_dev_release,
# T3 t5 o1 l8 a$ ^ }
. [3 p* |- O- m0 P};
% k) X* N3 [0 n1 D
8 y: l* d" k5 q8 Dstatic int __init led_platform_init(void)% i! o. C3 t6 f
{
2 e( s' Q4 n8 G int ret;
* |% {# V- Q, e1 g$ O#if 07 U( h2 B X. l
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);6 E/ M( c' W4 o
if (ret)) u& w) s1 K- m+ }9 R
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"# y" B, F& N# K/ P
"%d\n", ret);- L9 O& r D$ n; |: |5 ?
#endif
( z! R* {9 W( T3 I0 U ret = platform_device_register(&da850_evm_tl_leds_device);
L" I5 F3 n8 U5 G0 F1 P if (ret). ?; B' o4 ]1 J
pr_warning("Could not register som GPIO expander LEDS");$ @) r8 S. J$ ^ q
else3 D/ F% y# q5 n
printk(KERN_INFO "LED register sucessful!\n");
; I5 ?) [& a8 p# L
' W7 {6 G- o9 m: M: f9 [ return ret;
! K9 d+ y5 J3 \) q}
% m3 s3 V/ X) T$ U; S
6 S$ v5 b: z C1 M0 estatic void __exit led_platform_exit(void), a3 s4 b3 @ \% y
{" L' Q- u& _; p% h9 U1 L* m
platform_device_unregister(&da850_evm_tl_leds_device);4 y& |% X! h0 @4 }+ [
6 L5 ?, g$ y3 E printk(KERN_INFO "LED unregister!\n");
( G+ h# y* b% J3 A m}) e/ L+ L* } g6 s9 H
7 m5 e+ S% i: j( |
module_init(led_platform_init);
2 B y' m6 _. d( b% f; {module_exit(led_platform_exit);
0 [7 G7 M5 k* d, p2 X% X, p' [$ u" s. ]" D* K$ z
MODULE_DESCRIPTION("Led platform driver");
0 ~& P7 T( M& C) ~$ zMODULE_AUTHOR("Tronlong");
; Y N. V* A* Q$ R1 ~5 Q0 eMODULE_LICENSE("GPL");/ O3 a* u" O! I6 W# e! A
6 b. B) i, v6 R9 ~3 L. ]' ]; J |
|