|
|
求大神给下面的程序做注解,请稍详细些,谢谢。5 w& K4 \5 ^4 R" s" u1 k
#include <linux/init.h>* b' K; z4 c2 A9 R% a: O" k
#include <linux/module.h>
% B$ T8 q/ R6 j' n# X#include <linux/kernel.h>
' P4 w- M) o$ E. D5 b8 k# e#include <linux/types.h>- W9 P+ `9 Z, {# a
#include <linux/gpio.h>
( w& j: ~% L3 l$ q( M% _#include <linux/leds.h>5 J/ \0 @7 {+ e/ N9 r8 `# j0 p |
#include <linux/platform_device.h>4 o* F4 X; C6 ?! {) u0 {% G
i* r$ A( X% Q2 \#include <asm/mach-types.h>8 ^7 T& o" @8 W# k" d2 u
#include <asm/mach/arch.h>7 w- o5 h/ ?2 E8 e$ r$ z
#include <mach/da8xx.h>
# A4 N0 [1 p9 M! t3 U, M0 M#include <mach/mux.h>
! g7 c* @) L, K6 k8 S: k
/ n2 y2 ]3 y' z4 m. `4 X$ M#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
8 h, U! p/ K/ j0 E" h#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)2 r) \2 P' }' p5 O( ?! u
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
$ d& L |/ X: V' U- {* |#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
2 ?9 r; P1 ]5 H* U1 y; u
" N' N: {, a+ H/ E5 y/* assign the tl som board LED-GPIOs*/" i0 H% \7 B4 B3 z; a, N- o
static const short da850_evm_tl_user_led_pins[] = {# \' J) G% [5 u# ]# d7 f) B* A
/* These pins are definition at <mach/mux.h> file */* I5 z, n* {- F5 @. S
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
% S& y6 ~9 r% |8 L2 r -1
& I7 z6 l3 b. V9 {};5 q( t. E- w5 Q) n9 `/ q f9 G. N
! ^4 `8 H8 Q" Z: N. i) Q3 q
static struct gpio_led da850_evm_tl_leds[] = {2 q, J6 q7 [7 ]% h& x/ G+ R0 D- O
{0 D' H- v# d' G
.active_low = 0,
% n& x) x' X9 L$ R j8 x) _ .gpio = DA850_USER_LED0,/ {5 G; k1 Q: d) n* y
.name = "user_led0",( |" U9 w; I! D. g3 A: [! R
.default_trigger = "default-on",
! U7 f% N( N) l: ]; { }, R. o& ]3 ~( u4 t; T* q
{/ c: |! Y! n% Y
.active_low = 0,& \/ \ f4 W3 u6 y6 @# r4 h
.gpio = DA850_USER_LED1,! o. j3 e$ b) ~" o1 f
.name = "user_led1",
8 k: l$ w, ]) X# R5 W% Q .default_trigger = "default-on",
: x2 N q" y+ ^ },3 l* B4 t7 W5 ]8 H9 |
{4 v6 x. h9 E, z5 @5 U6 q. k1 s' F
.active_low = 0,
4 D1 T$ d! e8 @& F" V+ N% R0 ^ .gpio = DA850_USER_LED2,& x" c( |2 A% n; g# e
.name = "user_led2",
$ Z- a; V; a0 ]/ m i! o! | .default_trigger = "default-on",
- [, }# W5 ^0 [: W; W$ i' S },/ u4 B% ^& m0 K
{$ ]1 t ?! {& {' s) H; o* D, F
.active_low = 0,; d% W+ o! v. j2 g
.gpio = DA850_USER_LED3,- M5 c# V7 _4 w
.name = "user_led3",
2 M2 S* n+ b9 d( V. D .default_trigger = "default-on",# ^" c" s! T8 f7 h
},% X0 P7 t1 W6 S6 k6 J( y
};
& n7 m- J( d, U$ [* o% A1 C( |: [5 \
2 ^2 u+ @0 g3 @static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {/ n" ?2 @: C2 s# p; v. \
.leds = da850_evm_tl_leds,; N6 K* B4 N( G0 A1 M1 z; W0 g
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
/ }) s1 k, ]. w$ f};4 g( a% d7 D* x/ g8 R3 G7 ^
, W3 k3 o, n1 r) {- J; ~
static void led_dev_release(struct device *dev)' {7 \" O- ^, @- G3 y) J. w
{
/ D9 D! ]. v# T. ^6 l* `};
1 ?0 K- }* \. G S
2 F$ y7 e) Y& a& H8 z& qstatic struct platform_device da850_evm_tl_leds_device = {6 k# O3 k1 N. l& F8 ~
.name = "leds-gpio",
/ C+ g/ Y1 e! ^# V .id = 1,0 [/ U2 ~: G- [7 ~ T
.dev = {( {8 h* E+ a0 w8 `" z- E4 Q3 i% U& T+ q
.platform_data = &da850_evm_tl_leds_pdata,
8 G. P% I+ y8 T* w- u .release = led_dev_release,2 t' L! R/ G5 ?; S
}& U; y3 d3 m/ ~, J [3 {2 |. \
};; N! j4 `4 M( f7 t2 O5 m
# j+ @6 F; o+ ^% B/ M z5 }static int __init led_platform_init(void)
/ @8 S# o# l3 @1 |3 P{
9 |0 p/ ^0 w6 `4 G; m4 ~" h int ret;" l8 V1 E2 o; ^5 F9 a5 Z" A3 H+ a
#if 02 \8 t% g% T# g; m
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
7 U2 V) V8 J! H. I; t' b- e8 H if (ret)$ ?- r, s1 S' }( j
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
3 a0 W) V+ Y$ x. l$ t4 ]" ] "%d\n", ret);8 Z/ @$ @* v; T0 T7 |
#endif
, b7 x3 y- d0 E T ret = platform_device_register(&da850_evm_tl_leds_device);
. L/ q ^% H3 ^% l! y if (ret)8 D ]$ b. B& w R' `2 b3 z
pr_warning("Could not register som GPIO expander LEDS");
, I3 P% ?) E, ]: ^" V else, i L5 j4 c# @2 @% a& N, J4 J
printk(KERN_INFO "LED register sucessful!\n");* P8 t1 T1 Q# M/ n1 v6 Q" M0 w* u
) z" X: p/ i0 i. |4 }+ Y$ ?0 K; b return ret;
+ k/ D; f, i/ Z) q! k3 z: P/ r}, B8 M/ d* j# a* r
. ]/ E, v7 @/ m, C/ y& G4 ?static void __exit led_platform_exit(void)5 \! A& p$ Q# d4 O0 [
{
+ A. ~: @* M; d- p' J2 o% Z platform_device_unregister(&da850_evm_tl_leds_device);) T% c" F- H1 G2 O2 R) N/ j6 v9 Y% {
& j, d) }& Q/ W# U
printk(KERN_INFO "LED unregister!\n");) i: f, Z, P9 l( ^; `5 W
}
, J3 m6 Y& s3 o- ^# e) [/ N& k6 V) c$ x O! S
module_init(led_platform_init);* D8 Q4 }- ^3 ]) x* h# D
module_exit(led_platform_exit);( v) R2 N, |& B; b$ z
3 v% Q; t2 \% ]0 q9 _4 x! iMODULE_DESCRIPTION("Led platform driver");% ?3 N N' g0 z. Y9 A+ ~
MODULE_AUTHOR("Tronlong");
0 U% d) p8 R0 k: ]( OMODULE_LICENSE("GPL");/ \9 a2 ]9 I2 ?7 i0 m3 G
/ n: [* j& Z5 W2 l
|
|