|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; c$ p/ u8 R# P5 I4 S- I
#define PING_PONG_ACNT 1
* W6 n: `/ N; l$ `( y4 b u#define PING_PONG_BCNT 8*32*40 1 I) Y2 ~6 Y6 L5 m% ]7 L9 J/ t
//#define PING_PONG_BCNT 1 b& H% s! a/ ~1 U- l
#define PING_PONG_CCNT 1
, F* d: }1 O5 N' Q2 y#define MCASP_BASEADDR 0x01D00000+ ~5 z; M. \ S' h! p8 h
#define Mcasp_RXEVENTQUE (0u)- s: A, \' R6 H; `0 \1 X2 I$ @
" Y [ N5 W/ R9 N, \7 k/ c4 J/* OPT Field specific defines */
: y+ D! ~) D8 x0 E/ m9 @* T l/ R#define OPT_SYNCDIM_SHIFT (0x00000002u)
, ?9 n( I5 \6 O% a, `#define OPT_TCC_MASK (0x0003F000u)$ U" _4 f! i4 o% L! T8 @ n" h
#define OPT_TCC_SHIFT (0x0000000Cu)- ?' l0 J% p& _$ _3 T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 k4 k4 \1 V* }& Z* t#define OPT_TCINTEN_SHIFT (0x00000014u)3 C/ `2 J& u* U2 Q# s
' T0 F i# \, i$ a% C
char ping_buffer[PING_PONG_BCNT];
4 e5 @; [% A3 x" m; Kchar pong_buffer[PING_PONG_BCNT];( V c- {0 f1 H" Q9 i
( c( t6 T3 t* | Y1 r, m" D& T; U
: I Q7 O7 W2 ^4 N" B H- h5 l3 o2 n) G
, ^4 I: }" B# \$ w& d
static void ys_edma3_init()
* t/ c# r+ J- s( X" d{
' W- O1 n. O- o, }+ s EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 B; A0 g3 z( k
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 v' D( o R5 e1 W& w EDMA3_DRV_Handle hEdma;2 O; Q3 w; w3 q$ b# O4 m; w
uint32_t chId = 0;
5 ]" c V" Q, l uint32_t tcc = 0;
5 F7 c! {9 M0 }2 I4 m/ D9 z
7 |# [6 K; N; z! [( t, Y print2arm("edma3 driver init...",0);/ T8 u8 z- _3 v \1 ?
; }; k9 n* u- [4 Z# x* }5 ^# l hEdma = edma3init(0,&result);
, P: G9 ]. Z9 B" d5 P6 D if(hEdma)
% L! t9 z8 G/ ~. q2 S {
$ A0 c7 a/ `- I% f F/ R: Q print2arm("edma3init() Passed.",0);
* X. o7 g* d- L$ L3 Q% I1 e }6 F$ i/ R& f) V0 F! P
else/ |4 \: _; s' ^+ P% F, y4 b% {
{
7 u- _. C6 `0 K- Y( @0 n+ r print2arm("edma3init() Failed.",0);
) z* E* S3 P& e0 x- S. n5 p* \ }
. t. }+ v9 r- F& n3 y7 J ) G$ i5 N0 h5 A( ?6 D/ p, t
if (result == EDMA3_DRV_SOK)
?4 J/ |4 I6 E' p4 d# M+ W {$ h& o5 T$ G' R0 \0 q. O1 B% ]
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 c+ B6 Z1 t. u5 a& P (EDMA3_RM_EventQueue)0,
# C: T$ v( \2 S &edma3_isr, NULL);
* |% }/ c; J a* F8 |# g; c }0 P# d4 W8 n& K3 L9 p
5 X" K+ ]5 M6 K if(result == EDMA3_DRV_SOK)7 }- X' G7 }% j
{
7 ?5 Y& v# s& ?$ [- c paramSet.srcBIdx = 0;7 O; s$ b/ {) m
paramSet.destBIdx = 1;, _, t k& i7 |% Z" C9 J) j0 C
paramSet.srcCIdx = 0;7 C- y, \1 |" T" }1 |" H3 N
paramSet.destCIdx = 0;. ]& c; I$ u- N4 w2 E
paramSet.aCnt = PING_PONG_ACNT;: o9 Z, M- P- z. ~
paramSet.bCnt = PING_PONG_BCNT;# Y6 `4 `4 v1 t" w$ ?0 \, E
paramSet.cCnt = PING_PONG_CCNT;
' J7 A) E1 e0 W8 o; w' u 9 s/ {% b* M5 V3 F
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 o8 [# s' S) Y! N$ b% P" n paramSet.bCntReload = PING_PONG_BCNT;
; e9 \! f+ f# f8 ?
2 ^5 _* e6 U; D2 i /* Src in constant mode Dest in INCR modes */8 L6 E5 B5 o' f" C2 Y; _5 @
paramSet.opt &= 0xFFFFFFFDu;( K) y7 |% }, w8 u, ?( U
//paramSet.opt &= 0xFFFFFFFCu;$ A. L7 v+ r1 v
; y. T0 Q9 w: L& o6 Q /* Program the TCC */% d* C8 o2 d/ d2 W6 }% z, L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& D4 O \* x2 _: |( ~6 F. |, T" s
1 H! r) Z: W' D /* Enable Intermediate & Final transfer completion interrupt */
! Z7 j* n! J; l4 Z8 y4 e6 R paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- A: c6 B9 l" t& g" z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 L8 G; C R/ }
' y. ?, C, ?1 C! w/ o- S /* AB Sync Transfer Mode */
9 x6 U# r5 L ]5 e paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 c6 ^# z7 J7 \( }( k0 C+ V3 ~
, W6 l c8 O% i1 L" \* u /* Program the source and dest addresses for master DMA channel */
3 G {' ?' j6 g1 ^6 h' i: ] paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);+ v2 @' \+ Z0 X4 d. ^2 V
paramSet.destAddr = (uint32_t)(ping_buffer);3 N' @9 Z, r' u9 G9 p
1 ]8 I* Z% c( [" m, @9 Q6 S! n# i) h
/* Write to the master DMA channel first. */* M/ @6 p) M! p& M
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 M) L& e7 x- V1 w1 ~+ O } 6 w8 O2 ~! V b
7 U# L% [! F! {9 D- M3 b0 _ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, z( X. N9 p. K5 }! J
0 e! k8 f2 t0 ~) k2 l4 v
if(result == EDMA3_DRV_SOK)
: e3 e; z# `& p7 [) i0 P$ [ {. g' F# _" G, V+ c2 A# m/ j. n
print2arm("edma3 driver init success.",0);
0 N- {; v6 m% l6 L4 R6 e" w+ d; L }
4 Z; G2 ?4 h! g0 ]3 [; q}1 b2 G, L: E/ n4 @8 C9 f7 K
* t; J1 a7 P0 H5 j( K+ E' |" N$ ?: P8 b" r' W" B. L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 j/ n6 s0 s, N+ d% _
0 i# N; h$ W# S/ \- C" d1 t* y9 I6 e5 _8 F
|
|