|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# k5 h7 j. e( x3 C3 l) p& W#define PING_PONG_ACNT 1
! R( r8 X7 S5 G* q" l#define PING_PONG_BCNT 8*32*40 : q" g7 n* ^9 m( j
//#define PING_PONG_BCNT 1 " Y. Z5 K3 x; R% M% |5 Z
#define PING_PONG_CCNT 17 ]3 l' \8 q5 U+ X
#define MCASP_BASEADDR 0x01D000001 m& G. ?& p$ I# Z3 Y+ e
#define Mcasp_RXEVENTQUE (0u). b3 i4 S2 W8 S. S, v5 |1 Y
( b, s, ?5 q" g
/* OPT Field specific defines */. X$ F. f4 }9 A0 k* ~9 Q2 ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)$ t+ j5 M0 k* y) b' V8 [" [9 S
#define OPT_TCC_MASK (0x0003F000u)' ]: o( V. @* C: R, }
#define OPT_TCC_SHIFT (0x0000000Cu)7 C5 O3 d+ K* h$ Y, p& y% W
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, c5 j( M; M1 T) N#define OPT_TCINTEN_SHIFT (0x00000014u)
/ r" d% {- f% _+ O: Q1 [3 Z T2 Z) ]- g9 M3 R v* {2 O8 o# k
char ping_buffer[PING_PONG_BCNT];( Z/ ?/ ~. C/ ^& _: B
char pong_buffer[PING_PONG_BCNT];6 o \* Z4 V# X) g1 D
% C3 f* R( D/ Q. i3 e
! t7 [: N3 w' J4 \+ @$ Z& M
9 o! t$ u, i* `
7 w9 V; X, J$ S) R0 \( @/ tstatic void ys_edma3_init()) q" I2 u' _ F u0 B
{
' `* c7 Z! D% O8 _! V- I EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 ]! n1 f$ V. N) g* Z EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 y8 ~ U8 A/ z, ?) j$ f
EDMA3_DRV_Handle hEdma;
8 D% ^6 \4 n3 M) X1 _; F uint32_t chId = 0;
( a1 J8 a; e4 |3 j* z, P uint32_t tcc = 0;
+ q" B, Y' m) s l9 P! i2 l# Y
2 k. M7 T- s& D) Q% Y* s5 d8 k, { print2arm("edma3 driver init...",0);
* `; c! r' i# e; U5 ?; m/ `! N7 a4 }$ q# c% @% d
hEdma = edma3init(0,&result);
: f' s- D; \8 D: i6 A" l if(hEdma)1 C1 N6 f: A2 z- i+ f; g8 b! S- ?
{
$ b$ _4 W& W$ ] print2arm("edma3init() Passed.",0);
& d. s E" s' d! @ }
/ j. y% ]* K( r9 F4 z( V else) ]& f# [1 E {+ o' D, X. C) }
{2 }9 O) S+ P: I) |2 s$ p9 @
print2arm("edma3init() Failed.",0);
1 C f* _* a2 t; t# \ }
( y/ o' o; ~8 E& U4 `& m ( n6 M3 {& a* l& ~! R, Y! ^
if (result == EDMA3_DRV_SOK), }( ]: o1 k) }" K. t, a
{
7 {! y/ n' @( s9 L3 }4 T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 }3 E+ k9 _' K+ m; \1 ^ (EDMA3_RM_EventQueue)0,
8 V; r" ]; A7 [( {- O+ o$ g &edma3_isr, NULL);% B; N/ H8 x O- R$ i- F
} _& E5 y- h" Z2 _1 H2 Y
" W. _' ~' e- o$ M; f if(result == EDMA3_DRV_SOK)
) y' r3 r& s/ G% Y {" \& p# M2 }) w, k
paramSet.srcBIdx = 0;
9 Y" V9 Y j9 d3 F: `1 x8 G5 n% X paramSet.destBIdx = 1;0 Q* R& W) I. h8 O3 n" g' }
paramSet.srcCIdx = 0;
/ E2 S, ^3 Z( ?( \ paramSet.destCIdx = 0; D2 k& b. O0 j
paramSet.aCnt = PING_PONG_ACNT;( w7 Y* k! ]' K! k
paramSet.bCnt = PING_PONG_BCNT;
9 z1 U! ?2 V; _' b8 }( }8 e+ v0 j paramSet.cCnt = PING_PONG_CCNT;
, t, e) r; Y. p6 q8 g; v5 k - C; Z) y9 m& O0 [0 ]( h9 Y
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ p5 F+ \2 \. {1 t- R paramSet.bCntReload = PING_PONG_BCNT;
& M* ]0 s9 H! V- x& ~' e( M& M$ |, L1 O
/* Src in constant mode Dest in INCR modes */
/ @0 W( I/ V: k! a" ~3 ^: D7 [+ | paramSet.opt &= 0xFFFFFFFDu;. c/ u2 F3 I. V6 i5 R/ i) H# h
//paramSet.opt &= 0xFFFFFFFCu;
6 |) j: q3 ^6 W9 ? : u+ _& G6 {/ w$ g P
/* Program the TCC */- X5 L! @7 {" p& z3 b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);, J7 v& Q, a& q- ~! o
# b `4 {/ b) F( `5 A4 ~! c
/* Enable Intermediate & Final transfer completion interrupt */7 U: ^6 v- H: i! I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 {+ L; E3 q) P8 U" _8 @" g3 n7 Q paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% w) a3 [+ X n* J
$ d; {9 a& |+ W
/* AB Sync Transfer Mode */
$ j- f. p" G+ w8 f, u9 P3 X paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ F) O/ }" J; \0 v6 r. a 8 d3 B: g' `) i+ s
/* Program the source and dest addresses for master DMA channel */
: v* z! P) l" N' } @1 x paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: K4 Y% s3 e! B9 ?) @% n6 \5 [ paramSet.destAddr = (uint32_t)(ping_buffer);
/ Y1 ~+ L" G2 l- W* j( F/ L) b, K9 K7 R0 U
/* Write to the master DMA channel first. */4 b4 @# c( C. {& R+ O
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
?5 r% Q2 v' `9 U }
1 F( g8 @& d6 U+ b. E
K6 g7 G% N1 f( @# i result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! a; }% {" y( _% e 8 j, o+ d3 a9 P
if(result == EDMA3_DRV_SOK)
$ K/ a) K ~: ^/ U7 R* D {% u$ ]. c; h2 Z) z1 ^ b
print2arm("edma3 driver init success.",0);& Y% N. Q) v7 Q0 y H' N
} & Q7 Q9 l, _! B4 G
}
* J8 X( |* O8 m. x6 n& P/ z
7 \" J$ V% L, I( b& w( k3 q+ [3 R& N& B3 [ A7 v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! j5 l6 l9 {. o7 v9 v
. {3 Y ^. E T, z
& `' P2 M6 G+ `2 R |
|