|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- A- ^* ]% {6 w* H+ ^( C$ v
#define PING_PONG_ACNT 1% b& V' V0 N$ V7 B/ n# d; X$ d+ C* T
#define PING_PONG_BCNT 8*32*40 & l, i N. F0 P8 Q+ J% S4 `. q
//#define PING_PONG_BCNT 1
~) D( G1 ~" L. |" O9 d( O l( x#define PING_PONG_CCNT 1
9 U4 {6 r6 o8 U. ^$ |( t#define MCASP_BASEADDR 0x01D000009 c2 K0 a) U. H! H r
#define Mcasp_RXEVENTQUE (0u)
" l$ H. m' [- Q9 u9 u2 K/ q& D# {( q: w( \; U7 _1 w
/* OPT Field specific defines */
1 W6 J# g/ w: H: S! q#define OPT_SYNCDIM_SHIFT (0x00000002u)
' q9 q" S% V: N' X7 ^$ u#define OPT_TCC_MASK (0x0003F000u)
/ c7 `) p- D# k" y! {#define OPT_TCC_SHIFT (0x0000000Cu)1 Q5 C5 A5 f4 W2 z) E* J) Q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
c6 z2 g0 [+ |7 M# o+ z#define OPT_TCINTEN_SHIFT (0x00000014u)- L+ ~ p' R' O/ V2 J
: a: Y$ ?/ x) Xchar ping_buffer[PING_PONG_BCNT];1 V F) v, Q8 f
char pong_buffer[PING_PONG_BCNT];
6 N; \2 R& O2 X0 p; p; ^2 E, C
2 I$ X9 t3 s5 A$ [' r0 J) N% p; C2 @5 ^/ R o
1 }7 O5 \( w7 S. e+ {* }! R6 {, Y! ^9 Q3 z2 q
static void ys_edma3_init()) ?2 \/ {8 A: v% p% g$ m
{
$ h9 I& K' s P EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 l) r( X# I. G7 |7 \- K# e& _; E EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 `; I8 K! S: T7 y! M
EDMA3_DRV_Handle hEdma;, ~5 D6 O, o4 s$ N, J
uint32_t chId = 0;
) }0 E- f; | J, h' y, b uint32_t tcc = 0;* n. t# _& o- z4 j5 C
! E, j, i) k2 N/ I. p, N! l' Q& X) M
print2arm("edma3 driver init...",0);' B. V2 U6 Y7 f! Q7 A" ^
# n3 @5 G/ M+ {, u3 L2 y3 T4 Z9 k/ `- S
hEdma = edma3init(0,&result);
! o; i' \+ [# [& G% Q0 P if(hEdma)
3 {# c' K" w R* z {1 _. x- D l4 Q$ D
print2arm("edma3init() Passed.",0);4 P c+ F+ `. y d% T$ e
}) F& m; P( i1 N
else
$ v! u( l G' _0 g( v2 y8 b' C {
s# R3 _! t. E/ i9 |; E/ Z9 ^% M print2arm("edma3init() Failed.",0);* ]4 g1 N+ D' ?1 r/ ^0 L( X
}
0 R; T- b E( x8 X T, X M# ^- ?% u) E7 |. A8 C! i
if (result == EDMA3_DRV_SOK)
7 B8 h, m2 {/ w: A( Y! J5 _ {5 O2 Q! g/ |; ?, }1 q9 e( e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ c; H& j/ ]) r. E
(EDMA3_RM_EventQueue)0,' ], Y& e/ f: u7 K' U3 b
&edma3_isr, NULL);
) _% c) b Y7 F/ ` }
2 r# G" P% m9 H0 r& R$ v! l X
/ j8 T( O) P5 i, j% @8 G if(result == EDMA3_DRV_SOK)1 D. x, u% k/ X7 b8 a0 q+ n
{2 m8 ?: x" P/ d" r( z3 `
paramSet.srcBIdx = 0;
; X& g# {* T" `3 O: D7 x paramSet.destBIdx = 1;
. N3 a& h% W. p% y4 h' j paramSet.srcCIdx = 0;$ D( X1 {4 V3 i3 a' ?: U7 W; p
paramSet.destCIdx = 0;* B2 F/ w% A5 ^ W! L* q
paramSet.aCnt = PING_PONG_ACNT;8 W$ ?, n' W4 {1 V" m4 `8 ^
paramSet.bCnt = PING_PONG_BCNT;
% N- \( p& o1 S2 s! J paramSet.cCnt = PING_PONG_CCNT;' ?: k, N% l$ W: a" c
7 f3 U* |7 ?! Y/ J /* For AB-synchronized transfers, BCNTRLD is not used. */
- ]2 ^5 k- w' f' } paramSet.bCntReload = PING_PONG_BCNT;
5 |; F; I' O ?$ D* L h
, r: z% y1 ~: z! H$ K /* Src in constant mode Dest in INCR modes */1 B7 Y( s- I8 n+ H0 B7 M
paramSet.opt &= 0xFFFFFFFDu;
1 U/ D0 i& j. ^ //paramSet.opt &= 0xFFFFFFFCu;
' X! ?0 g8 h) o2 z* \: k% y: v % _/ r" A9 m5 |! l2 B; i, _. r8 t6 n
/* Program the TCC */: s; y" ^; `- C3 z$ V! s1 N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ i' @ c/ j4 A" R$ p4 b1 I( q3 C/ s& ~* o
/* Enable Intermediate & Final transfer completion interrupt */: a: y$ |4 Q6 Q! A: S( E0 b3 A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, C5 w8 W/ F- M, u# D3 S8 d" y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 A" ]2 K7 ]3 T5 w" F0 X8 U4 w9 m
1 |5 J7 N8 I) e( g4 ^ /* AB Sync Transfer Mode */
' g5 _6 V3 Z( A$ \$ R/ Y paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 d; Q' S/ N% [) h# {6 b
7 G; O% y7 R! l7 b /* Program the source and dest addresses for master DMA channel */
3 `( M) k# d, w6 [ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 u" J/ _2 G7 A1 I# o/ ~ paramSet.destAddr = (uint32_t)(ping_buffer);
2 H: P$ M( b, f2 l5 K
; k! _' Z0 h" T% p/ @; _/ n /* Write to the master DMA channel first. */, } O- E2 l ?2 W) ^4 |
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' J9 c% c3 u5 _3 ^# O! X
}
. I) |. B- G$ R [& g( Y, N6 l& J w; v! ^% S9 n! d
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, I+ K; i3 L- f
( N. ^: t8 _- f' u, Q/ o# h* | if(result == EDMA3_DRV_SOK) 7 O" W T# r6 Z1 \- Q
{
4 k4 R# r, p Y% ], ^ print2arm("edma3 driver init success.",0);4 ?/ V9 u( q0 p, [7 R4 M
}
7 z) X" ^ j3 n) H, K}
% L2 V" R# S4 n. T" c* H1 T! m q8 \$ V' z. B' E
/ }4 v9 ]8 K" H. k/ VEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 l6 X8 e8 K6 j/ x; g- s" p- x- d4 E. {1 V- c, C- N3 E
3 {( N7 _: \' P& m' @) i3 W
|
|