|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* O7 J5 o+ D9 y8 s- r) Z4 @#define PING_PONG_ACNT 1
8 }7 h, e3 A0 Q Y& w5 a' J#define PING_PONG_BCNT 8*32*40
. n9 ^+ H# d5 k5 m//#define PING_PONG_BCNT 1
X4 K: }4 L! o A#define PING_PONG_CCNT 1' k. A' a/ J5 F; E% Q& |
#define MCASP_BASEADDR 0x01D00000; v: h. d8 H. W, ^, h2 F. Y
#define Mcasp_RXEVENTQUE (0u)8 l8 |3 B$ s0 s1 k+ z" O7 D
0 F1 h5 e8 W+ I8 [4 C1 y7 m8 M$ h/* OPT Field specific defines */* ]; W ~0 l' v2 E) h
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% O8 e0 z* D6 A Z#define OPT_TCC_MASK (0x0003F000u)' \' `1 X, i1 H# T6 E' e) D
#define OPT_TCC_SHIFT (0x0000000Cu)6 ^: |! ~- w, H
#define OPT_ITCINTEN_SHIFT (0x00000015u)) b2 X' M2 Y, N/ o% D( P
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 v' o( R8 H! F. C
4 Y5 Q: c# h3 z9 y+ q( v, X @) ?char ping_buffer[PING_PONG_BCNT];+ y) A; r2 X! ^, c6 P- ?! @5 U0 k3 L8 W
char pong_buffer[PING_PONG_BCNT];
( Q X y3 f, d. }& p. V" b! k; X& s3 R7 ^" W& D
9 Z1 h, v6 K1 ?0 J
5 }: c9 B% Z9 }6 [8 r8 a
6 m: ^# Q! A+ z$ z5 B' S% fstatic void ys_edma3_init()
! W! o4 z/ P/ x' V) ]$ {9 n{" _1 X+ f$ l, D* U* I
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& d: H3 a+ x% D# N7 ~0 m4 L+ I EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ q9 Q. g4 i/ Q S% ]* j6 P
EDMA3_DRV_Handle hEdma;
% g8 _) C" n5 X G1 A" B uint32_t chId = 0;
! Y4 d% m+ v5 K6 b) U) _ uint32_t tcc = 0;8 [& w/ B9 P& \2 s) [
) ]- F- f1 q t print2arm("edma3 driver init...",0);
) G/ P7 Y6 T. m3 U3 [7 U3 Y- Q6 g* Z7 r
hEdma = edma3init(0,&result);
1 |& ^$ v. c, E) I$ ^! B8 O; b if(hEdma)
6 y6 i- Z, i0 |, B {
% A* o3 s& |9 I* x. I( m print2arm("edma3init() Passed.",0);) w0 j6 I# E( v1 r3 T' y
}
; Z Q8 b0 e" z. d; d1 ]% ^ else
, x( x& L) S. N* y9 s9 a) Z1 _ {
; s6 J! G) \5 C7 x, B6 H2 z# q print2arm("edma3init() Failed.",0);
/ t, v+ L% x, a7 l9 n }0 }/ Y* e) A2 E% b; z
2 V- r! M$ ?! f+ c$ @ if (result == EDMA3_DRV_SOK)
0 i& X* T; T- l; F* b' P {
6 J* K4 f4 t4 [( R9 x result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, Z. r# ^% P' _- V: S W' ]( Q
(EDMA3_RM_EventQueue)0,! p: o- w: f- e( V. m( c2 Z
&edma3_isr, NULL);
- N3 }9 J9 ]+ C2 J; w/ T0 e1 ` }
, H7 }2 {$ S8 s' W6 I! E( i Q! b# I( q) k) j, G
if(result == EDMA3_DRV_SOK)
2 [8 ]5 ]: Q$ u, Q6 t! A3 h {! ] t3 U4 m5 j C
paramSet.srcBIdx = 0;
: e9 x( f; Y# b- d paramSet.destBIdx = 1;
4 T3 q" y/ B/ v9 B6 Y' l7 s: K paramSet.srcCIdx = 0;7 f, Z& S7 l6 F5 e4 ]1 ^
paramSet.destCIdx = 0;, o3 N/ u) s. L+ v/ p+ U4 X9 o. s
paramSet.aCnt = PING_PONG_ACNT;
3 H/ s$ _' ~! q1 {& u5 F' _/ k paramSet.bCnt = PING_PONG_BCNT;4 z8 }% C) g) U& G" X: {
paramSet.cCnt = PING_PONG_CCNT;7 G2 g- v4 S9 E# ^) v; {4 y
0 O/ N" j1 }7 Z3 | /* For AB-synchronized transfers, BCNTRLD is not used. */
) g! [. a4 c u \/ W n! R paramSet.bCntReload = PING_PONG_BCNT;5 |$ m/ i, }- I$ n" P# ~, j4 {
2 ]/ R/ [" y) A" [$ _/ J5 { /* Src in constant mode Dest in INCR modes */
2 j' r( z' x, A ~) g paramSet.opt &= 0xFFFFFFFDu;
4 j! ^7 \7 I+ ?1 X6 A. |3 w //paramSet.opt &= 0xFFFFFFFCu;# z: H- f( i0 ^9 `+ m9 ]/ F
" [# Z- o6 t, ]- G' T /* Program the TCC */
! C! Z* \3 K+ @* |# B) \ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 s) H) b, p7 ?5 o" t1 D" K9 }7 ?7 a7 c. Z. n4 j, S0 Q
/* Enable Intermediate & Final transfer completion interrupt */ I h" F7 D, O+ E
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) j& P* d3 w. Z _ y* x2 Y( w X
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 _6 m' k/ E. T+ J
: d# M7 Y: `9 D# }% u) I
/* AB Sync Transfer Mode *// Q- \$ t# O( w+ B9 R' s4 @% Z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 F- ]5 W* f; K1 Y( Y& [. _
* G1 `% W9 T- h) Q; V0 n+ \
/* Program the source and dest addresses for master DMA channel */6 J" ^; }$ U# U) P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 I' `5 _; N+ h" n paramSet.destAddr = (uint32_t)(ping_buffer);; O' l8 b. Y* A4 j
6 N/ L& C0 w5 i, V# ]" b3 @
/* Write to the master DMA channel first. */
; O, H' E1 S4 y+ y* I( I# _0 F# a result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, j5 K$ t) K. i. ]& P0 j6 D
}
! B, U8 M5 r0 A d1 K, d- b7 q* C; t6 T+ a) H% d0 F( L
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 r6 P$ a$ w4 H1 t% Q) m : z1 ^, g" `# j: E1 y
if(result == EDMA3_DRV_SOK)
& L/ E. b+ q. Q3 x5 n0 S {6 a; G6 M: D. |9 d* f4 W
print2arm("edma3 driver init success.",0);$ i8 c( d& E3 n" J
} 1 x3 W. [8 D, J* e
}
4 P+ a# L9 S1 m5 g1 }1 k; a% O4 I6 E5 E
+ g" l7 J; q5 q# w; A0 xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* v+ @5 b1 @3 X- a( _# k# I+ A, M' A+ j! ?3 F `4 o5 g- s: l
3 [3 |% |% a7 u& y7 h# R4 p2 z6 ^6 |
|
|