|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, I# A/ ~0 X6 K, w#define PING_PONG_ACNT 1
; x2 ?! P. s" g+ e$ f" }#define PING_PONG_BCNT 8*32*40 2 h6 a- U5 O. M$ }7 C
//#define PING_PONG_BCNT 1 & k" v& u5 R* X: o3 ~6 Z! z
#define PING_PONG_CCNT 15 C. y" v) V; y* ]$ H
#define MCASP_BASEADDR 0x01D00000
; V. J" O5 X) y" s# A* i) j; {#define Mcasp_RXEVENTQUE (0u)) c, @4 [* T6 H- v
' h1 Q8 D" ^; N) j
/* OPT Field specific defines */
8 k* B6 F0 T7 h1 R0 M6 K#define OPT_SYNCDIM_SHIFT (0x00000002u)
* P% l7 Z+ T/ e% n* a# ]- O#define OPT_TCC_MASK (0x0003F000u)
5 }/ b: H9 E3 [5 g9 ?- l& B#define OPT_TCC_SHIFT (0x0000000Cu)5 ?1 Y6 O7 Q" D
#define OPT_ITCINTEN_SHIFT (0x00000015u)9 P' \& ~+ B* l2 u0 h0 |; c0 G
#define OPT_TCINTEN_SHIFT (0x00000014u)/ Q" T; S2 \. k' U
, J# ]5 F: v2 V& S- U5 W3 q H
char ping_buffer[PING_PONG_BCNT];
9 v' k, A1 v! k' n/ i( J! Nchar pong_buffer[PING_PONG_BCNT];
y) i2 _/ S% P% p: s: X8 l9 Q, z1 F) M: O8 x% I$ K* U
# Z0 ^( b4 e! q1 ~4 n6 F- A6 C' p
1 [6 y. {& L( p" u }3 j7 x* H
static void ys_edma3_init()1 C- h/ K% X4 s @
{
# f& ~$ h* G. n6 y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) h3 w% x: b' q: v& M% ? EDMA3_DRV_Result result = EDMA3_DRV_SOK;, ^: ]6 D3 ^9 Y: j
EDMA3_DRV_Handle hEdma;' C1 \4 \( b$ V; ]6 d' p
uint32_t chId = 0;4 ]- j& H* t: H0 | m I* c
uint32_t tcc = 0;
& ]! @" ^8 K4 o1 K7 {' j8 C7 L. M) P# e% H3 B8 |
print2arm("edma3 driver init...",0);
5 F3 M; h+ ?1 f R' G
2 O) q. X) {" ^3 v E hEdma = edma3init(0,&result);
+ `& T8 q7 o& _ if(hEdma)
& e6 e v8 X# M& C3 H8 {7 z( o6 r {
5 p8 m- w& k" @5 V6 p# X/ p- d print2arm("edma3init() Passed.",0);
+ M! O- u4 o. u2 A7 G* B: T }# v5 I2 O! n; _# \3 C4 O2 P5 {
else: n0 X( x- A. K. q3 z3 t+ `
{( G; h( v+ _; n) I: W7 a% |
print2arm("edma3init() Failed.",0);
: a. v7 @" K1 S" L! V y }" x6 A8 ^1 m7 a1 X8 I+ o! ]+ j
7 G4 o6 n+ f6 |0 d/ Q7 o; f if (result == EDMA3_DRV_SOK)
! n% C! S. y# M" @ {6 Q$ K! E. V/ a* x0 b% y" `! f$ v2 g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" s. W; v$ r' |6 J (EDMA3_RM_EventQueue)0,
( p* H3 q9 z( X8 Y" O7 z m1 c: K &edma3_isr, NULL);
5 {7 O* V: m& e4 |3 d+ l. f }
5 B2 A1 [1 C7 D# g8 E. j. I, W V % D3 W T# Q6 ~3 z4 L" _
if(result == EDMA3_DRV_SOK)
9 b* i3 |! K8 z X# Z1 A {
! o( s3 H/ r2 n( d paramSet.srcBIdx = 0;
/ W9 i$ o" j; \; m; p paramSet.destBIdx = 1;& N& d9 b, x5 l$ M& m/ d
paramSet.srcCIdx = 0;' J( p: a1 i& m @, w
paramSet.destCIdx = 0;
/ s) z% \! I3 L5 q: l" J. C paramSet.aCnt = PING_PONG_ACNT;+ a$ O# W$ ~. G1 g/ |1 |+ h2 h H
paramSet.bCnt = PING_PONG_BCNT;
7 _; ]& K/ k# ?2 R( p9 K- h paramSet.cCnt = PING_PONG_CCNT;
3 R1 ~" @# i# R( e - y5 T3 g* b5 [* T
/* For AB-synchronized transfers, BCNTRLD is not used. */! e) z7 g+ c4 y# @1 z
paramSet.bCntReload = PING_PONG_BCNT;- m: I- f5 v( A
3 i( K1 k8 h; P( o
/* Src in constant mode Dest in INCR modes */& b" Y) }1 O( r) s- v
paramSet.opt &= 0xFFFFFFFDu;$ ?1 O5 ~1 D- {6 } c
//paramSet.opt &= 0xFFFFFFFCu;
7 O b( Q6 _5 z$ Y - A2 T5 ?8 A! d5 N3 r8 i4 p n. Y
/* Program the TCC */8 ^5 y' I. }- j# b' j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 p7 ]! C. Y9 d" M8 g1 n% A% X) U3 N& k f# K0 r/ W3 g
/* Enable Intermediate & Final transfer completion interrupt */
5 D, d0 [9 v* M& U1 j) z h paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* G! g( J$ w2 }4 }! j: I2 K paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);2 b$ m/ O4 L" s1 R' u' ^
. H) Y3 v5 e5 a- B8 O4 \! d% a) [7 ]4 h
/* AB Sync Transfer Mode */; w* i8 O1 o* V; D, Q; G( [8 R
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 s# K1 O0 m/ m
3 _( ^9 e$ ?3 q$ I0 u /* Program the source and dest addresses for master DMA channel */! w4 S) ?& U3 \" k+ i
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);2 d9 T6 ?' e# h' t* s' A
paramSet.destAddr = (uint32_t)(ping_buffer);
' E4 C1 I+ Y0 s
1 v5 { l0 u2 l) o0 c /* Write to the master DMA channel first. */3 X k3 }' A# H) ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);; f4 p4 V) S! m b
}
* ]# q* s3 p) q3 }8 W8 A( a
z- P _7 R0 f% b, O result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 ^& `+ i! m. _4 u* S
7 R7 y4 p# r5 M- h; g0 Y, \ D
if(result == EDMA3_DRV_SOK) 1 Y1 z2 V$ X) z
{9 ]9 R. M; G3 t1 q5 [
print2arm("edma3 driver init success.",0);. n3 C) P. x- C$ K
} ) |$ c" z! b1 ~( f9 O
}
* l$ F7 D% f6 K p0 ?* s% w9 ~/ E8 K
! L3 S/ c9 e/ |0 Z3 C4 l$ MEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- Y' x+ t% e, {% G: d4 x$ W
; x) J U! F) T$ }* H- w5 ~+ c3 s8 U8 C) N% z U1 ^
|
|