|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
! H, g! q. l: m% |0 x#include <linux/init.h>8 @# p0 K. _8 Y4 p, }
#include <linux/module.h>- h, T- W" x7 w$ C) U
#include <linux/kernel.h>
- x' B+ |, G. S: h% l#include <linux/types.h>2 ?, U+ D( z% p; @9 J. M# w; G$ ~
#include <linux/gpio.h>
: A% i* ] N& z- E4 e# o#include <linux/leds.h>6 ^* s6 F# W! Y% P9 k6 l) X- s
#include <linux/platform_device.h> u6 E' A. j! y( [, y- w* k" m
# m; a. z4 T0 H7 M% \. f1 F% |+ W0 T
#include <asm/mach-types.h>- d/ K( f/ T/ M# U
#include <asm/mach/arch.h>' C* e( d: d4 [$ a9 C3 ^
#include <mach/da8xx.h>1 E- `6 d" m- t4 o3 m+ O9 ]. k
#include <mach/mux.h>
- A& I2 _- J4 c! M' v2 l4 b: E; c- Y! u* e0 E2 Z* h
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)1 z0 ?- y) g4 q8 @
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
) a; B H- G& Y4 x( ~% {) j# Q% x' [#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
0 c5 r/ c. T- |5 h#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)7 W& ?. @5 S7 G
! ^) s* ~1 u& o8 _" P8 ~& Q
/* assign the tl som board LED-GPIOs*/% v6 X4 i7 B! z# t& V! q- v
static const short da850_evm_tl_user_led_pins[] = {
2 }9 t) |' ~2 g /* These pins are definition at <mach/mux.h> file */4 t5 O( D+ N6 u
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,4 L6 [0 R# {$ z& c) U
-1
9 d6 e5 b9 B7 X};
R% U" n+ }* b5 q1 U# b, [+ V8 W3 l+ V0 u: b% f4 c
static struct gpio_led da850_evm_tl_leds[] = {
2 P: M6 s. k [0 U0 `( d {
2 ~. [, Z$ e5 ~: c) H .active_low = 0, b& X7 v/ Z5 Y- M) g
.gpio = DA850_USER_LED0,
% ^; R; f. I5 o- J2 I .name = "user_led0",5 s/ U/ j G6 g' o% v
.default_trigger = "default-on",
; H$ m2 E5 S( D9 N# \' r3 Q },
8 ~4 k) T) u" [& P {, ]8 J3 H4 t3 H3 u* p4 \
.active_low = 0,, ]& m* v, Z) x$ K( a& l0 E
.gpio = DA850_USER_LED1,
0 y/ W0 a' Q1 h j .name = "user_led1",
1 N" K1 _& W6 Z5 Y .default_trigger = "default-on",
& C4 \" A- ^1 q3 k: _) p" m },
8 ?" d* s$ c3 Q {
( F. n5 y! Y ^ .active_low = 0,
, a9 R2 f, A6 E" p3 } .gpio = DA850_USER_LED2,$ u/ l( d+ Q b! L7 }* G; b
.name = "user_led2",+ D! j% l! `+ s7 T& R
.default_trigger = "default-on",
/ l( n. E% f# |) J% K' o },9 v" l) R. y C* B
{
: P- W! ^$ f: L' i0 i .active_low = 0,! T; V1 j( G1 P+ q
.gpio = DA850_USER_LED3,
' g. x$ q X1 Z! v# ] .name = "user_led3",
1 }; K0 \! G0 I1 t .default_trigger = "default-on",
* y% K3 x/ |# i2 P$ i" d6 u },
; ^) n; c- d4 m};) \* q/ Z& P% q+ o( k
- N3 L o- j" M# e5 }static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {9 {* \8 L- M( f9 Q ], B
.leds = da850_evm_tl_leds,
9 q; E7 k; i P% o( V7 u1 O3 z .num_leds = ARRAY_SIZE(da850_evm_tl_leds),) [- I9 n3 n% g* T0 w
};" `+ Y {+ n: M. ]2 j9 [2 [
/ Z5 M, h% u% D/ S* S
static void led_dev_release(struct device *dev)" T* N k+ A$ n9 q# y: x
{
9 |) o! a0 B- H% c};: o L( _1 `9 N0 @( ~0 Y0 P( w6 ]
, }" b G1 H" [2 e) q" @) V7 ~static struct platform_device da850_evm_tl_leds_device = {4 F/ V9 @0 @# _4 L2 z `7 T8 X
.name = "leds-gpio",
, ^* P# V* p- m4 y: `1 t .id = 1,; U, N) l( R; k- T8 I
.dev = {
+ x4 |& F0 N* J$ R .platform_data = &da850_evm_tl_leds_pdata,6 F0 a+ v9 m T0 Y5 T; s. ]7 j! Y7 u
.release = led_dev_release,
5 P, P/ ~! d0 a( U }
! t% D. C. e, n/ ~ L) h! j. @};
( q( F5 s3 |0 o" Z* o
' h: ^: `/ v5 |2 z( B& ?static int __init led_platform_init(void)0 i0 V* l H `/ ^5 ~) ]" z: x
{
! m9 T' J' v! x- Z o S3 O; E int ret;" r$ S& U1 f' B/ u
#if 06 t8 X/ Y) M9 \( p: D1 b' b6 h
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);7 J7 r+ u* [: u- o4 m
if (ret)
# o: ~) P8 ~. e2 S pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
- Q4 f; @, ^5 ?7 k0 j3 K% V "%d\n", ret);2 V" w3 S% h* y
#endif" O7 t, C/ x- v8 w6 e/ T: f% C0 R) l
ret = platform_device_register(&da850_evm_tl_leds_device);& ]9 Q6 A% v" y& l5 p
if (ret); C {/ ~! j: l( H" O5 O+ v
pr_warning("Could not register som GPIO expander LEDS");7 `5 `7 e' D9 d: I5 C8 y
else3 b* I8 F8 n! ?7 |
printk(KERN_INFO "LED register sucessful!\n");
: h: E. @! M7 k! ^0 S
9 n" p* Y: p! o8 W, i7 G return ret;) A! L2 o# B4 K/ V& t4 ^" q
}2 C& T3 P& u& I% O9 P5 F( G" _) O
% j% J0 @; h, _) \5 [0 Q
static void __exit led_platform_exit(void)
% w/ ~0 }6 A, j1 b- c{
+ p) J" J2 P7 m& V& N$ F; ?2 \! `5 G% s platform_device_unregister(&da850_evm_tl_leds_device);
7 x% A( |* p5 r: L9 p; @( r0 p! @4 m- w4 a/ {
printk(KERN_INFO "LED unregister!\n");
* j* E! G9 G# v1 n* ^}% [; }- D" Y ?, k6 g
* ]' T* I. w( s) f& w2 m
module_init(led_platform_init);& ?1 z& A) T+ a+ E" x, {
module_exit(led_platform_exit);
7 J/ b7 T( H3 d2 T T/ N _% q d3 Z* s. D* t, R/ ~& p* j* p% M n
MODULE_DESCRIPTION("Led platform driver");2 {* B( ]4 q. z& p
MODULE_AUTHOR("Tronlong");1 e7 a$ |0 X! }
MODULE_LICENSE("GPL");
6 c* O: T/ o g4 d! i; Y1 C/ ]" B4 o! S$ w
|
|