|
|
求大神给下面的程序做注解,请稍详细些,谢谢。1 z. P& @0 m( S" e
#include <linux/init.h>
* n7 E. X8 e2 g* v( E5 l- v0 H' y#include <linux/module.h>
; a/ B/ C5 _1 V#include <linux/kernel.h>) [/ }- T+ r+ I) F! p
#include <linux/types.h>! @3 Q; `# X, a0 w6 t4 e
#include <linux/gpio.h>6 `6 x0 ~ Y p: N5 h0 I2 R
#include <linux/leds.h>2 d; i+ H2 i; t) Q
#include <linux/platform_device.h>
# X5 P3 C) }3 f" a3 S
* T4 w. m; D5 M, f; d1 t#include <asm/mach-types.h>
+ @3 t. u5 K& R& ^8 ~& \#include <asm/mach/arch.h>5 c" h: v% {9 N
#include <mach/da8xx.h>
/ E- m0 h) l$ \; G! Q#include <mach/mux.h>
4 H2 C9 d% M3 p/ _& A; B6 a; y- E$ `+ k/ x$ Y" t: T9 \) F9 m
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)8 A k" o1 T3 i/ v3 U1 A4 g1 z/ {
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
/ x* V2 [# F1 F) X1 A; L+ g#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
# Z7 z, O! i E7 x#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)) H, T7 N# T* Y6 H3 j. b6 m5 G
# d0 @0 ~6 S6 G/ m" v6 {/ H! O
/* assign the tl som board LED-GPIOs*/
7 y! z" K' [( ^- x, p- x2 m$ kstatic const short da850_evm_tl_user_led_pins[] = {
! K) A+ U# w( A2 V9 ?6 { /* These pins are definition at <mach/mux.h> file */
$ x+ }( q; t3 P+ n, U5 z DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,; O; A* z& n, P
-1
1 A7 Y0 L0 R2 V5 d; V};2 ^0 L" k7 M: S8 L8 Z9 c$ h
o) A; F1 M. p2 i mstatic struct gpio_led da850_evm_tl_leds[] = {
1 n; Z; R, |/ q/ H {
6 Y7 A4 T' w9 R2 _ .active_low = 0,' j; s0 E" O1 k) |/ }
.gpio = DA850_USER_LED0,2 N0 f, o+ @! J
.name = "user_led0",2 u) W; N& x& s U- q! s) n7 Z1 [
.default_trigger = "default-on",
3 Q5 }1 `" ~6 f6 O( Z5 N; T },
# o% b' G1 Y! y; f4 X, m {
. x' n9 o% ?4 C- }0 z( I8 o [ .active_low = 0,
4 E, P; ]% b/ J8 U7 q .gpio = DA850_USER_LED1,
2 s8 S3 I7 [2 o& Z2 O$ } .name = "user_led1",) S9 R. K: n5 r( o
.default_trigger = "default-on",
% r: U) U6 a6 ^- u3 D }," x) ~, N4 t, m+ Z! H5 J
{/ Q V/ p+ j; A" s$ ]8 z
.active_low = 0,8 |8 G/ O0 v8 g: {6 _! W
.gpio = DA850_USER_LED2,
' W: v8 @4 A! c, T2 b .name = "user_led2",
. G/ H$ m. I1 v( J5 t .default_trigger = "default-on",$ Z& K1 H( E K6 h8 v' k" q
},
; B1 p- |+ r4 u3 Z. u { @$ T0 r( ]9 X
.active_low = 0,+ P2 g* X& _; }' r1 v' B6 e
.gpio = DA850_USER_LED3,
6 o' h& k/ o! n. L3 S" [& z9 e# o4 ? .name = "user_led3",$ W" C0 G/ V6 A/ t
.default_trigger = "default-on",6 @7 \) Y# \& {; k7 [0 m
},7 d6 a* Y) ^+ ]/ {9 a
};
+ s2 T4 C. Z" O, O- u- D5 E& B- O$ ^9 c9 g: _( U( }& L7 Z* J
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {6 h! I: B- {6 X; ?- F! l" P
.leds = da850_evm_tl_leds,
5 e" g# k/ s' j. A/ | .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
5 O6 J1 A" m5 {6 V};; T6 F! a+ o+ I. Z2 ~( ~3 R. ~3 I( q
( M8 j% c, P, C: e3 F* P* b
static void led_dev_release(struct device *dev)" z) ?+ }7 m) a9 Q
{+ }* B$ Y: u( m# B
};
/ ]- d& v9 {4 A6 R- }
. Y5 n8 [: X& d- dstatic struct platform_device da850_evm_tl_leds_device = {
- z# {5 S; ~8 f9 R5 O/ L7 M/ U .name = "leds-gpio",
! Q5 S f1 L w& y1 D .id = 1,1 Z h' N+ C& T0 l/ c& D' g/ V3 o
.dev = {
$ Q! o; A0 R2 Q o; d. y .platform_data = &da850_evm_tl_leds_pdata,; ?( Q6 n, [& S% g$ A
.release = led_dev_release,
. g( R; Z9 q6 | M3 l" Q }
6 P6 o9 [9 i2 X! n};) p9 o" t3 j( k
) Q; n. S5 U, f% W8 }static int __init led_platform_init(void)
( G) k0 C5 E" ~0 u/ r; F{
' V3 [4 T* R1 s1 C5 ?( X5 x int ret;
7 ~. ^/ O& u7 n#if 0% M, V# i/ f! y1 \% |, a& T
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);3 v2 Q: l6 E9 J% D) G
if (ret)
. G- j- [* M- Z0 Z$ X pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
) O( N7 Q4 F" F1 A "%d\n", ret);- k) F, U/ P& y' ^# U1 _
#endif( U' u* C7 p$ |$ q1 ?' @2 d: F U
ret = platform_device_register(&da850_evm_tl_leds_device);$ Z. H3 ~: x) l/ p/ X, K# ], i
if (ret)
6 N; `9 s2 v# F. a1 o3 ~ pr_warning("Could not register som GPIO expander LEDS");
8 y4 M2 A9 C0 v& { else) E$ j7 ]. j1 L; l! m
printk(KERN_INFO "LED register sucessful!\n");
7 t8 t, e. Z4 w5 t
1 K+ u: a* c0 Q3 J; u return ret;% {. s$ `. P% b0 k3 a( O ]
}4 d2 Q# v& B: r$ n
) S W3 F" Z9 w# V
static void __exit led_platform_exit(void)( E( U# T( _ L. I' y
{& o4 J. I) } u
platform_device_unregister(&da850_evm_tl_leds_device);
+ \# _3 e8 f0 q6 A; X# F9 R* h, h4 J% y( @- d, Q" s' i
printk(KERN_INFO "LED unregister!\n");) M |2 r0 R* [ k
}, \- j |* ~5 M$ i2 J l# `8 w" Y
+ s/ a+ O( Q, j* w6 Kmodule_init(led_platform_init);4 l8 b* Q3 c m1 p! i: J
module_exit(led_platform_exit);8 u7 W9 m8 _ V2 I9 f6 R
5 s* E M5 }. x3 C6 Q1 A8 a
MODULE_DESCRIPTION("Led platform driver");4 b6 v( \( W% n$ W) e- O: B
MODULE_AUTHOR("Tronlong");( q B( R! }) p' H4 J/ |9 i& D
MODULE_LICENSE("GPL");
7 x+ u- C/ [1 H% F1 A: O% R4 ^! n* ~: O( L* x
|
|