|
|
求大神给下面的程序做注解,请稍详细些,谢谢。
6 m( h& k" x- z#include <linux/init.h>
: J0 G' B+ q/ H/ R1 S' Q p. N: D0 N! T#include <linux/module.h>
9 j. w( M! a. O- k9 M#include <linux/kernel.h>6 j6 [/ d* J1 v- w8 [) B5 R# P
#include <linux/types.h>5 x: O" Z6 v9 }+ c. X
#include <linux/gpio.h> U2 K5 K3 r2 H/ h6 I6 ?4 n
#include <linux/leds.h>
7 b7 j9 ]4 C, S7 K" W#include <linux/platform_device.h>
7 B( q, i2 b7 r7 ]! o0 H# c- u$ k3 i2 X( ]1 j% W7 q8 c+ u
#include <asm/mach-types.h>8 Q# J0 F# M; @* ? d
#include <asm/mach/arch.h>4 d% s4 I E9 Y, I" b
#include <mach/da8xx.h>1 `! p, `0 r4 r5 o2 L+ c8 O
#include <mach/mux.h>
4 u" q, J+ r- }% h2 o. x4 n) _) H& P4 l' D4 \8 n( J- T
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
3 V& v- Z) i& u# S- w#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)) C6 w3 f7 \' B/ @' R
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)! l% J5 a* M) ?
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)& L5 M5 a1 R1 Y9 k
+ }; ?; v: q% X: \% p" e9 _) z/* assign the tl som board LED-GPIOs*/# y; l. W; ~6 t* T7 g
static const short da850_evm_tl_user_led_pins[] = {
( F7 i/ H9 H( C, H* O /* These pins are definition at <mach/mux.h> file */" c) E; E6 ?) [. _9 o
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,+ |0 ]' @8 v0 V0 y/ _% w- Z
-12 S: n& H8 G6 F# x7 I
};2 ~' X( ?' z/ b1 d. U' P L
: Z! E( D$ Z a
static struct gpio_led da850_evm_tl_leds[] = {! Q5 ?5 ?5 ~* z" {/ N
{9 p' b! Y" S/ [4 m$ u. k
.active_low = 0,
% N3 t$ K6 i' j% X0 G6 Y. A .gpio = DA850_USER_LED0,& M+ w3 E3 _' M! C% v
.name = "user_led0",
* d! E2 Z0 I; n .default_trigger = "default-on",
9 S2 Z) n1 \+ q" j9 m) q },6 ?: X p7 C6 U: H6 d8 F# G
{
: t* r ~% G: L) X$ [& z, E .active_low = 0,
2 F; x$ ?$ g) I B( u .gpio = DA850_USER_LED1,' X( m( m6 ^4 r0 ~ e6 p/ N
.name = "user_led1",
6 i6 H9 ~! E, Z' f. E! A .default_trigger = "default-on",
9 y; n3 H. D: P+ r! d },
4 Z' I3 P$ M6 M( S$ n& ` {
5 ^) g0 P7 x) k# M- B3 U( L6 L9 Z4 R .active_low = 0,
3 I2 w/ _( @4 _8 @* H, z9 { .gpio = DA850_USER_LED2,! {9 q1 e" ^4 l" C, F% V
.name = "user_led2",' k" X6 f+ b' @
.default_trigger = "default-on",
1 k1 H" y2 t7 S7 _ },6 Y+ b0 \9 {' |# D% o9 b
{, J9 v- a7 T9 U
.active_low = 0,4 J |8 t8 e2 p
.gpio = DA850_USER_LED3,
t0 L0 [. |/ M) N! C5 T3 }) c5 K: X .name = "user_led3",
) o* {0 E- H; v0 h9 t' k# {4 B+ E6 e .default_trigger = "default-on",
8 v: S. F' e2 q, N/ ~& J( Q }," o" t' N% t, \9 }8 S: j+ Z t
};/ g% K5 f, g' e* D7 {
* z+ W# _- U7 \% _/ R' I2 s% E
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {- P( L! y# B/ {1 V5 L
.leds = da850_evm_tl_leds," S6 U$ t3 g; J" H: S
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
- J; T2 S/ e8 T2 L0 \3 d; O};" ~. x( Y* z: d5 v4 U4 N; B- S
5 `) D' S. q: A3 p1 B! U7 [
static void led_dev_release(struct device *dev)
, Z- j6 D" K: A* r! n$ e$ W; ^, W{& _' i) E/ O+ ^; r$ @' p3 T
};: q1 x" d4 y. i h4 D
( w0 C1 E/ E& o; l- F4 J
static struct platform_device da850_evm_tl_leds_device = {: }% v- ?8 F# z7 M3 h" Y8 l" I% U% X
.name = "leds-gpio",
5 B' z# B: R+ c! z5 l3 @ .id = 1,
' U/ _, i4 {0 W5 @) f/ g D2 i .dev = { G3 I$ V# ~7 E7 I) T: K3 k3 T6 A" t
.platform_data = &da850_evm_tl_leds_pdata,( @1 _( `# a( s w& z
.release = led_dev_release,
! x) n8 h7 h q; _ u }+ }9 h. @/ K9 u- H
};
/ n5 U9 Q8 m9 ?. l! Q; u7 S1 s# _' C$ e4 |
static int __init led_platform_init(void)- L3 s E4 X3 J1 k
{9 n0 z9 o2 [' B% q: u$ N$ w- \
int ret;
1 s; M0 b/ v _6 P0 k8 k& U#if 0
- a+ g! Q% B# N( B ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 R( {3 S" A1 [7 d& D4 C7 W
if (ret)6 C1 R0 a8 G1 e. Q
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
) P% Z) o+ m: O; ]5 n6 b "%d\n", ret);7 C+ W$ C. M9 O; Y' i! ^0 K( T- ~
#endif0 ~+ E7 v/ M6 c1 s( T3 T8 B
ret = platform_device_register(&da850_evm_tl_leds_device); L0 z9 R6 R4 D& e. ?) s
if (ret)( _# M9 E7 |% \, Z& k# T
pr_warning("Could not register som GPIO expander LEDS");
3 A0 d" [* F6 J% n8 [% H else2 e4 \" m' s1 }0 n( R
printk(KERN_INFO "LED register sucessful!\n");% W( g; ]- g5 }! N
7 Q* l3 U2 M8 e6 h return ret;
) k+ w/ c; {$ V E}4 d/ s! m# j9 J/ a, a/ Z
: E. k5 ]1 N1 G! O2 P
static void __exit led_platform_exit(void)' X4 x+ i2 e. R1 K w3 R2 [
{ g6 p) |/ q% Z( w
platform_device_unregister(&da850_evm_tl_leds_device);+ Y7 M- o! {, E3 _0 q4 C. |
; A t7 l M/ C printk(KERN_INFO "LED unregister!\n");
, F1 @+ k2 d7 O$ _2 B, m6 C- {( l/ r}
# Z8 k+ M5 w( u0 p( O/ u6 S+ N9 Z1 ^: V# E1 H b; Z" k1 Y
module_init(led_platform_init);- z% A5 S8 a# l; ~0 W
module_exit(led_platform_exit);$ f/ R# D$ c: K4 p( D3 _( k
7 s, i9 y. L1 w! g* D
MODULE_DESCRIPTION("Led platform driver");
+ g3 t6 W2 i: KMODULE_AUTHOR("Tronlong");
! e1 ^% L! W( O* Y% x, c6 QMODULE_LICENSE("GPL");
/ A9 s" Q* C( Y$ L. J
# w% U8 B$ @5 j" G |
|