|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:$ T( c+ Y* C+ l: T" ` P8 R% k3 f9 ~9 X
#define PING_PONG_ACNT 1
& U, J5 M \' l3 R5 y3 @! p#define PING_PONG_BCNT 8*32*40 p" ?! `+ a2 ^' [9 y8 \# @* h* k
//#define PING_PONG_BCNT 1
5 T! W6 T1 E* V& h5 H#define PING_PONG_CCNT 1
6 o9 x" {3 z" A6 s1 Z2 Y#define MCASP_BASEADDR 0x01D00000
! g ~( Z7 T$ `. A6 H$ D#define Mcasp_RXEVENTQUE (0u)$ Y, H5 s7 g; M% S' ?
) x. [) p# ^+ A5 E% R$ z* J/* OPT Field specific defines */
1 Q% F& ^! n- N7 I5 |#define OPT_SYNCDIM_SHIFT (0x00000002u)( P( W |: t$ X, a9 e1 W9 i
#define OPT_TCC_MASK (0x0003F000u)4 _' N2 `+ ?% `' @
#define OPT_TCC_SHIFT (0x0000000Cu) Y6 q1 d9 P! M
#define OPT_ITCINTEN_SHIFT (0x00000015u)- r8 C! ~- |7 S& y
#define OPT_TCINTEN_SHIFT (0x00000014u). s8 R: e8 ]. d1 E$ R O
$ N- B' _0 j% U1 rchar ping_buffer[PING_PONG_BCNT];
7 G; h0 ^" e' h1 K+ q0 j( |char pong_buffer[PING_PONG_BCNT];7 b" k' K+ m+ j. m- E
- H+ u6 }& |% h: y$ U
* _4 w9 g4 f8 G, @
0 l$ A, y0 y) q1 \5 E- v; w- M( ~* |2 |" A o% g" j" L* x d4 r9 S
static void ys_edma3_init()
8 e6 y+ w, j2 x E: N{
9 @8 y. n- j- m+ @! \0 }2 G' v8 C EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! {2 v5 C" E; ]* N: h# t3 c6 t EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 D" }' W- K' V; _$ @+ ?$ Y+ N: o EDMA3_DRV_Handle hEdma;
% i# i$ o5 U" q. v9 u uint32_t chId = 0;) T5 ?. u! K5 U! T: L% a
uint32_t tcc = 0;. R- }2 y3 ]* H( s, T
4 u9 @) m6 f2 q% I' R" q/ Q print2arm("edma3 driver init...",0);
* T7 j7 G" v7 j
1 p* t) I2 Y5 g9 F) j4 g hEdma = edma3init(0,&result);+ T. S6 ~ o0 V2 m, ^
if(hEdma)& z4 t! e* A; Q' N2 Y. Z. S
{
6 d6 o5 {( i! V; m6 ^1 i print2arm("edma3init() Passed.",0);* {& M w r9 Q T
} I( ^. E/ j* B2 }( d
else
' E- C4 a% H& P {( S+ ^0 t- Y, D9 D
print2arm("edma3init() Failed.",0);
9 v/ w* \; g2 v% U8 {9 u }) F. Q" n% _5 j$ m6 M1 N9 Y
8 y+ e4 C/ [) _! e& J$ h6 z( i5 P if (result == EDMA3_DRV_SOK)
( y% K$ ^3 A1 z: D {
) ^" B4 L4 ^0 S1 s8 W, D# I result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ t! q* g# X. F1 A; ~) X2 R6 }9 c0 @ (EDMA3_RM_EventQueue)0,
5 \0 ^( t: s: d, W &edma3_isr, NULL);6 H9 h& y! {1 d5 L7 H# Z, r, Q# S
}# _+ F9 S* S. ?6 z7 q# h
/ e7 f1 l! v+ k( f+ |
if(result == EDMA3_DRV_SOK)
8 |) ^; Q- I' R; d* W {
$ A0 ^1 W* j7 a0 U) m paramSet.srcBIdx = 0;' T* }" f7 T" y2 t) w* {: [' m9 G
paramSet.destBIdx = 1;
/ H3 W& l+ `3 r* \ paramSet.srcCIdx = 0;
; f' ?. i) G( q' T! ^; R paramSet.destCIdx = 0;
: y6 X3 f) @! E, O+ b paramSet.aCnt = PING_PONG_ACNT;
2 {* [" a% U% d/ r, _! c paramSet.bCnt = PING_PONG_BCNT;
# Z; t2 t4 v* I" c) I; }0 n paramSet.cCnt = PING_PONG_CCNT;) g D2 K& k9 l* r" W; O: m$ q
: v1 m" x0 `+ ]) _) s2 r0 _ /* For AB-synchronized transfers, BCNTRLD is not used. */( C- B- ]0 n: e ~/ f
paramSet.bCntReload = PING_PONG_BCNT;& b% X3 d% e5 N- H
6 s1 ]3 t0 f2 ~% L5 `2 J /* Src in constant mode Dest in INCR modes */
8 z; I- m2 I4 o. p0 p. g paramSet.opt &= 0xFFFFFFFDu;
# G5 [, y4 W% D' h9 }9 F. w //paramSet.opt &= 0xFFFFFFFCu;0 ^- l% u3 S0 `: v
, o$ C+ A* @' W- ]
/* Program the TCC */5 N% c* a- G |
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- b! q2 C" r9 T- S2 N* P! _7 [2 j8 L$ H g1 ?
/* Enable Intermediate & Final transfer completion interrupt */
' A/ o/ n! b9 W0 k3 |" r paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ j. r# J; a! Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) y9 B3 |8 e% e7 V2 O$ a! w7 y# Z* z+ u+ T& Y
/* AB Sync Transfer Mode */
! O" F4 u. b2 i paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# T3 K% ?) b1 q5 ]' S- }6 ^0 O
: H* Y4 b; K/ N; z# v) f /* Program the source and dest addresses for master DMA channel */) O8 N, V2 Y2 _% }8 l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);5 ?/ h4 X7 W3 o! ]
paramSet.destAddr = (uint32_t)(ping_buffer);/ P0 J/ o5 \$ p
( c% s; `" o( P /* Write to the master DMA channel first. */ G& H6 Y6 d- ~; L: g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);9 U4 s% Z! K) Z) z6 x7 }7 ]- w
} y8 r1 h- M, S4 ?# B! h0 j
7 u A8 s4 F5 w1 T$ \ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. Z9 E+ m* z, w) |& j9 _
( |) p% l; o( \' X( {! X. y if(result == EDMA3_DRV_SOK)
" q! S- F6 J3 a9 M2 u! @% v {
' E4 j. q3 P! T8 X3 E print2arm("edma3 driver init success.",0);9 {( n& | J- I0 U9 e5 G# b
} * Q0 W$ R. }: b5 u$ \' S9 N
}6 ?) H+ b+ z4 d" D0 g4 E
! w$ `* U( q3 S7 t3 U s0 l7 E
/ e5 r* `5 L# S ]( S. tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 J, J$ A; ]# _: v; S8 X* y/ J( G8 n; |
/ X) a% V( _5 {4 O p |
|