|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( l' L1 n/ v& }& {# J
#define PING_PONG_ACNT 1/ o4 N. t% S( f" f8 V
#define PING_PONG_BCNT 8*32*40 % E) T9 S& U0 \6 Z% Q7 }0 U
//#define PING_PONG_BCNT 1
8 T+ E7 T# q# j/ E/ M#define PING_PONG_CCNT 13 c' Q( q# T2 o; o) b
#define MCASP_BASEADDR 0x01D00000
% l4 {$ M- P8 x9 f#define Mcasp_RXEVENTQUE (0u)1 \! b, W1 O* F) k( m+ G6 [4 Y
5 D/ Q5 F4 @7 q( _+ Q, q9 f
/* OPT Field specific defines */
8 R1 Q' _( X1 @1 Q. b#define OPT_SYNCDIM_SHIFT (0x00000002u)
' a0 F& [! ]& c2 I#define OPT_TCC_MASK (0x0003F000u): J; b8 d& y! h5 @) q6 P
#define OPT_TCC_SHIFT (0x0000000Cu)
. _" {5 f) {8 K, T/ m/ g#define OPT_ITCINTEN_SHIFT (0x00000015u)0 M* W( [+ {9 ?% D, g) r
#define OPT_TCINTEN_SHIFT (0x00000014u). b; k+ q* F( [, S7 m: x, C
W7 H J( U8 ^9 V# z7 `5 G& Schar ping_buffer[PING_PONG_BCNT];
9 z8 v9 Z/ n$ y2 Q+ Fchar pong_buffer[PING_PONG_BCNT];+ c# t' w+ N* Z/ o& Z* j
; T% D2 U: M% \6 d
8 o) m( l6 h- B( Z% |6 L. X
7 @! p, B, q! R+ j: R' w
5 a# S) I3 w; S! i( }7 Vstatic void ys_edma3_init()
3 s. f$ W# C+ T! z& M! X/ ~{- [; x Y3 J* z- [. ?1 B8 n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( X |& F2 C H6 X( K5 [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 G; O( p5 ?1 \2 K. U" H" q$ f" W
EDMA3_DRV_Handle hEdma;
2 |2 t8 V# _' O) z. G uint32_t chId = 0;
7 m3 j F. P" ~4 c uint32_t tcc = 0;5 @+ ~2 U! s4 z, V0 H% y- g
1 ?3 D4 T( w$ j! h) A _7 A print2arm("edma3 driver init...",0);/ q+ O: m, |+ ]3 l. f
* F) a. U, H! K& y( }3 n0 z% Z3 O* r hEdma = edma3init(0,&result);
- z: L) Z$ D( ?# w+ R F" |: k3 I if(hEdma)
0 N+ d* \4 Y* ~6 k {1 w2 J/ y6 U {; U2 P* A
print2arm("edma3init() Passed.",0);
' m, F o& P& y, C6 s8 ^0 u }
9 z$ I0 ?' A: m5 F n else! O* y! ]$ |$ J4 K' k1 ^2 g
{
" \, v- \6 ~8 _: ~# |/ u print2arm("edma3init() Failed.",0);
) M; k5 ]8 ^$ N e }) j# r3 C$ q7 X* ^7 M
+ i( K9 s+ O' Z$ o3 i7 E; |5 A
if (result == EDMA3_DRV_SOK)7 Y- O7 \3 P3 w$ I# j; ?
{; z2 J9 c( P9 A5 h# F
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 ]1 s0 u0 ] T* p$ h! f
(EDMA3_RM_EventQueue)0,
& \" ^* D# u4 {" x3 t! d9 C" t &edma3_isr, NULL);
( |+ M1 z3 t7 L+ v) D. W }
: {- b$ R/ }& K) |$ ^" e7 ?
' H; m' H$ R% [ if(result == EDMA3_DRV_SOK): n$ K N3 b( f) y6 K- {
{1 o7 A, P" |, W. l2 X. v) U
paramSet.srcBIdx = 0;8 e. H! [4 ?! p7 d3 i* A
paramSet.destBIdx = 1;
6 o3 |/ G* A$ Y paramSet.srcCIdx = 0;
' U, Z2 \$ b. R$ Z paramSet.destCIdx = 0;% ~6 P9 h# U1 r x' U
paramSet.aCnt = PING_PONG_ACNT;: Y- |9 K" D/ H
paramSet.bCnt = PING_PONG_BCNT;$ w" D; ]4 W5 N0 \3 O1 B
paramSet.cCnt = PING_PONG_CCNT;
; G" c" X, Q( F4 E, }; p
W" M% }: ^" g/ h( [; g$ y /* For AB-synchronized transfers, BCNTRLD is not used. */
) C8 s8 B5 |+ K7 Z$ Q paramSet.bCntReload = PING_PONG_BCNT;0 O# S( M$ ^+ g
" a' ?7 H& ?, J# @: i0 p
/* Src in constant mode Dest in INCR modes */* {1 \ T4 ?6 D3 ~
paramSet.opt &= 0xFFFFFFFDu;* h& q' L z, G
//paramSet.opt &= 0xFFFFFFFCu;& Z3 |" C t! q% B" x6 R# x
3 D. v4 N$ }( M1 D. l* K; y. j! `* u
/* Program the TCC */
" r; [5 c. K) `/ f# x5 d paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
k7 J8 S- G" |1 ~4 d5 \8 ^3 w$ V# W
/* Enable Intermediate & Final transfer completion interrupt */# C" x0 S9 L6 _' B) C3 J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: P4 p9 }# a- H) [1 R paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, j+ a d, y% g% _
1 `5 ?" W6 k0 |) A+ S) I* D: Z /* AB Sync Transfer Mode */
0 v Z7 Z! @2 K% i- v3 o v% w paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% R A1 e$ `1 s
, c$ K. S3 V2 d$ P1 k /* Program the source and dest addresses for master DMA channel */; o6 \$ F4 h1 K7 ?, l/ T; P8 b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) T) V# B( C z% n% E5 m1 u paramSet.destAddr = (uint32_t)(ping_buffer);
" E+ t1 h) {2 s5 T; [4 @3 t1 |/ ]! ]
/* Write to the master DMA channel first. */7 N3 p. T) a, U5 ^
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);% e& v5 G! \" e) X
}
) X8 |: m0 ?5 B" L% t, I/ s% N3 M. c/ I/ u: O: ?+ r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; s- Q% m( e) ~" v) }# N6 U
( A2 k& T, C* Q) p7 I% a0 I# A if(result == EDMA3_DRV_SOK)
$ ]8 g4 f7 U! e8 Z( o1 B {
/ [$ U; |: Z: Q, l print2arm("edma3 driver init success.",0);
) }6 e1 a+ N I$ t; o }
2 p9 ]0 M) m' Z/ _8 |1 M}
2 l; {$ W2 J2 k$ m
& M4 z' S) B% @" C/ Z$ f
6 a! `6 l& E% P/ u6 xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 R/ _% Z( @7 E2 B
' a8 T0 R) }" `1 n& l, y0 J4 r
) {& r4 n6 @6 d1 K" h- x: V2 [
|
|