|
|
求大神给下面的程序做注解,请稍详细些,谢谢。1 n" I" G% G% T
#include <linux/init.h>4 q8 v8 B) {1 g2 M7 y
#include <linux/module.h>
, H. w+ @1 z6 }#include <linux/kernel.h>! w& i: ~7 \$ C6 t5 x0 O
#include <linux/types.h>4 R6 q% k: x4 B- d5 {
#include <linux/gpio.h>
! L r) O4 ?/ |5 J9 Q& ^#include <linux/leds.h>) s1 V7 Z/ J* |# ]& C( H- r* x" T
#include <linux/platform_device.h>
( X: K; Y+ C& M2 _9 H! A- Z, I) g m8 r8 S8 a
#include <asm/mach-types.h>
5 Y9 h8 S" Y0 B, C! @! S8 L#include <asm/mach/arch.h>) h" V; v0 c% S- e {. r
#include <mach/da8xx.h>" @1 `# B5 z+ K. f& w9 ]# T4 E/ k
#include <mach/mux.h>
; L8 E$ Z* V8 C- V
1 @3 w g* c8 z* [1 ^6 R0 ^#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
' k- S. v1 ~( T! {) b( ?#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)# q. W' S/ {1 i9 b9 ~: x% H
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)1 c$ _# g0 C) b; K+ ^
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2), {5 n5 b1 _0 e8 V0 _3 X
! ] d% e3 x G$ G
/* assign the tl som board LED-GPIOs*/
: k! R+ _6 o! ?& {$ Dstatic const short da850_evm_tl_user_led_pins[] = {
; c) y% j6 [$ ~4 Y) H1 i$ S# G /* These pins are definition at <mach/mux.h> file */
7 p; Y# k7 _0 }/ L DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
+ h- G- k8 N6 b5 _" o -1 d- w9 L# b& Z! f& L
};" j$ s1 M4 Y; S
; e; h2 w" N3 E9 m
static struct gpio_led da850_evm_tl_leds[] = {
, A# J; t; v6 F9 |) a {9 f+ ~5 k' p6 H% r# C
.active_low = 0,
7 W0 s0 `1 i& o+ I8 [ .gpio = DA850_USER_LED0,
4 ~! w9 O6 u7 [ .name = "user_led0",% A2 u1 k: Z9 f8 w7 n0 {# [5 {
.default_trigger = "default-on",
p* n9 V* D5 t/ n1 x" R/ A) m- [ },
/ S3 G4 R% @1 y {, |0 x5 m8 w+ X5 E) I- [: S% F4 Q, m
.active_low = 0,4 n8 h0 [( [- M3 |3 Q' C$ t
.gpio = DA850_USER_LED1,
. ~( y$ \# ?( d$ Q7 n: p .name = "user_led1",- A. h* N& S. j8 c6 Y! B! q
.default_trigger = "default-on",
3 n: L. t5 [! K },1 V6 v* Y( M! l1 V2 [# p
{" p7 L2 b1 H! I$ }' Z
.active_low = 0,
) M' M2 D" Q: S5 B1 ~. O0 c$ T6 K .gpio = DA850_USER_LED2,
1 K- w! {# v% I% u .name = "user_led2",* e9 u" P( _* _
.default_trigger = "default-on",
0 I" \: E( b$ b/ r z5 D },6 _: E) k; g& z d, T6 ?
{' A' [9 P7 g4 y' X2 [; x
.active_low = 0,
2 O D8 A3 ]$ O5 C0 i4 ^$ p8 ] .gpio = DA850_USER_LED3,
3 R* }6 p. j. x* Y3 ? .name = "user_led3",( d: p) g) R* k, D7 [' E, |4 u
.default_trigger = "default-on",
" \$ R4 O. B5 `1 f% |5 w+ l% v. l },
: }; c4 t: i. ]7 K};5 ]5 I" t2 d7 }3 w9 g# p
7 m2 b) c% F2 Lstatic struct gpio_led_platform_data da850_evm_tl_leds_pdata = {. ^! B; m1 u7 A% [+ C8 o
.leds = da850_evm_tl_leds,
& d Q H: Q4 q3 e .num_leds = ARRAY_SIZE(da850_evm_tl_leds),
# Q/ \7 f$ l& t+ r" V};% z7 r$ Z. P; }
+ S1 E: m \# P
static void led_dev_release(struct device *dev)
/ g$ S2 O; A; r" N- Z{6 i/ ?1 E1 F/ N
};+ O9 c2 x0 t: \, r. w2 P( W
( z! B7 r! I5 C" X
static struct platform_device da850_evm_tl_leds_device = {) a' s1 E7 X5 P
.name = "leds-gpio",
" n, Q! H) {. s' J .id = 1,
. y4 ?* H7 L' x0 U0 L8 _. p .dev = {2 V5 N5 ]% u- y
.platform_data = &da850_evm_tl_leds_pdata,) n! `0 O2 }5 {5 V0 B
.release = led_dev_release,
4 ^. G% [5 b9 @) i/ U k9 U* k a }
9 {0 l, w8 }( Y M};
. M2 O' R2 k3 M7 T
9 K H$ N2 e+ h A) s( |static int __init led_platform_init(void)
% [3 [" v) O( G" O8 I; a{
$ x8 G; `' p+ u4 L9 K* p int ret;
% V8 F! L) n4 Y9 B1 w#if 0
- H/ j- I, F6 w7 c6 O. k ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);$ }6 G- S4 t/ f5 ^" s- x
if (ret)
5 O* x. F* t& z+ U1 X' h pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
2 e; v% U! ?- \1 X "%d\n", ret);1 l+ u8 L0 k- Z# U
#endif
& Y v6 k, ^/ ?" Q8 Q3 q ret = platform_device_register(&da850_evm_tl_leds_device);
6 A: q; w7 k' ]/ [ f9 s if (ret)
+ ?0 v4 S5 e" P# Q8 R8 `* R/ @ pr_warning("Could not register som GPIO expander LEDS");
9 G! a y2 I/ j9 I3 v v* ]; d else
, e7 }+ W3 `" `% b. e$ J. F, D3 n printk(KERN_INFO "LED register sucessful!\n");
" ^. _9 a) i: D. @9 o6 Z/ ?' {$ m
return ret;
" a* n- N( ?$ Q' x}
2 O' `( E) q1 v2 l6 m8 y6 r/ _+ ?1 ?: D
static void __exit led_platform_exit(void)& A3 t( [7 M; g& ~3 t
{
' f( `% `, k, ~6 K( b5 x; V$ I F platform_device_unregister(&da850_evm_tl_leds_device);/ v: j3 x; r9 {" |
0 E, N4 o) c V3 e/ n
printk(KERN_INFO "LED unregister!\n");9 ^) U4 k! p4 d0 D
}# @/ r' ~. ~7 `' ]/ U0 {
2 |" }' U- m4 V+ S
module_init(led_platform_init);
/ `1 v" S) Y/ G" q/ q6 K5 kmodule_exit(led_platform_exit);+ G( y0 k% Q! l+ g- r: Y
7 X* g& B) |$ T
MODULE_DESCRIPTION("Led platform driver");
: e& d& y+ ~2 V9 iMODULE_AUTHOR("Tronlong");
; R( ^. B1 j" j( }: s) h7 J; T9 RMODULE_LICENSE("GPL");
9 G2 ^1 w& {: N8 M. S! v3 e, I
, m5 N( t! d4 x8 h) | |
|