|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" ^! q1 u6 i7 r; ^# n; a' k#define PING_PONG_ACNT 1
$ f* w% \5 t. v3 D. k9 Q#define PING_PONG_BCNT 8*32*40 3 O. u0 X6 X' @+ V& c' N
//#define PING_PONG_BCNT 1
' K! }9 ]0 V* F% B$ ~2 A#define PING_PONG_CCNT 1& @: {) ]- ?% b% E1 V. \+ g2 K
#define MCASP_BASEADDR 0x01D00000
, _) e" n5 G/ u" L( n$ Y3 L6 y* T#define Mcasp_RXEVENTQUE (0u)
; h' y0 O) q2 P0 `1 c/ v3 x6 g
5 h3 A) [# |. n8 _6 Y4 l/* OPT Field specific defines */
+ A0 U( z, Q4 J7 W- c$ [#define OPT_SYNCDIM_SHIFT (0x00000002u)
* S% l" u& m, b0 N) B#define OPT_TCC_MASK (0x0003F000u)
' U2 I" k8 N) g. N- k! Z& l8 D#define OPT_TCC_SHIFT (0x0000000Cu)3 g" R0 g$ T) i# B Q/ }
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! f: o* Z) ?: h! o0 t1 l#define OPT_TCINTEN_SHIFT (0x00000014u)
( h3 t- j, Y; e5 d, ^3 C! |+ k" K. z2 ~% J7 @. s4 G+ {5 U+ U9 ~$ C+ J
char ping_buffer[PING_PONG_BCNT];. r9 t& k+ o5 D4 d7 Z* }
char pong_buffer[PING_PONG_BCNT];' p# j$ O8 b4 x( j6 w$ H- r
; ^' C$ r' Z1 }8 H2 H/ C" @! x
: n; p2 W. I- C% ~2 z# i/ ^+ E$ g& K# s# h" C; t" s* _
) c) W* P; U8 R% n
static void ys_edma3_init()
* \- f5 r8 ~, y2 H0 r7 _{
7 s5 F+ l0 Q( n( B& R6 @0 n% d/ J EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, F8 l- r2 ^8 j1 T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 J: _; i9 q* _/ X- L5 | EDMA3_DRV_Handle hEdma;% u! p- C- w/ R! c
uint32_t chId = 0;
6 |5 s. F) p: w1 e# f uint32_t tcc = 0;2 X7 c7 x, g( p4 s" @
; ]+ r p0 h% C2 l7 n print2arm("edma3 driver init...",0);
, ~/ y. d+ g/ }4 _) \; `0 W1 u' m1 E' P/ L! Y r# J% @' R
hEdma = edma3init(0,&result);
0 V! F1 H% w" f* M if(hEdma)" V2 d" ? o7 S( o0 M) V7 K2 d
{
4 t6 q7 d: y y! X `( _. x+ X print2arm("edma3init() Passed.",0);
; N; Q2 j: w# M! V' a } B" e8 n6 S' C2 W+ C g
else6 i$ c2 ~! N6 h/ z1 _
{' ~1 v/ z: U+ e7 M8 S* F
print2arm("edma3init() Failed.",0);
, \9 ?, M1 {$ J$ } }
. j4 @6 o1 z1 g7 u. A% @$ U& u- [
- r. z( a5 }, `7 ]' _ if (result == EDMA3_DRV_SOK)
0 h- s2 I9 w) {) a# N6 O- S9 _( n {
0 P: v, p$ ^9 G4 z: c O( d+ ^) L result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* {+ L4 [5 ~1 c, a9 u+ u0 n
(EDMA3_RM_EventQueue)0,
* R- Z4 |$ O# L &edma3_isr, NULL);- S, X, h% S1 i) y! i9 \; V
}
- m3 W: u8 W) ^, Q
1 ]7 q: b& J' R: n if(result == EDMA3_DRV_SOK)* @6 P. u8 n( y. O1 X! b; D4 X i
{
* V5 y. E. W, C+ i0 y) p- b paramSet.srcBIdx = 0;( M1 V& Y1 f1 k$ d. [; L1 k1 ~
paramSet.destBIdx = 1;
) d1 ]0 s# i {& K7 q; | ? paramSet.srcCIdx = 0;: o& Q4 [* t& Q i2 v; r! U- J" T
paramSet.destCIdx = 0;
. w4 E5 u) o6 d5 { paramSet.aCnt = PING_PONG_ACNT;
3 r% ^0 q1 x) J2 E* @# g paramSet.bCnt = PING_PONG_BCNT;. L4 a/ A" j. f# [
paramSet.cCnt = PING_PONG_CCNT;" r- ~1 L# x; R7 [0 D) ]
% {2 L( O% n- }
/* For AB-synchronized transfers, BCNTRLD is not used. */ D* [# z* i# [0 C& @) l; p
paramSet.bCntReload = PING_PONG_BCNT;; [% I! |" w# G. {3 E
2 U+ M. f% p9 \( B
/* Src in constant mode Dest in INCR modes */% ~$ ~, O& |; n
paramSet.opt &= 0xFFFFFFFDu;
, A4 b* v: Q3 ^& ^ V/ T* |7 f9 r //paramSet.opt &= 0xFFFFFFFCu;
8 d" D0 b+ @- b. j
6 W6 S: _1 \7 H5 ~ /* Program the TCC */
) B% D% j: n! O, @ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 p4 M. e9 x( e: g, p/ L% H, \$ A4 F0 |2 G9 R* L! L% J
/* Enable Intermediate & Final transfer completion interrupt */) S4 ~- C) T& w' N( g8 ^9 }, J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& M p- L5 ~9 I9 o& `( w# w4 j paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 h: o# W* i2 E
8 z. K* I8 K$ X6 R2 V6 T
/* AB Sync Transfer Mode */
8 R( Z" A1 O% R W1 K9 ^ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 J7 R6 E# M6 E) ^( v0 ^
+ D3 H# Y! U& B; d6 D) p2 a5 F* m4 M /* Program the source and dest addresses for master DMA channel */
) F) j L" R( J J; J paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 V5 ~- W* {7 ~5 c: H: Y" b paramSet.destAddr = (uint32_t)(ping_buffer);
( v7 H0 f: H9 D! b, t+ I0 W3 R8 m, `2 r. U
/* Write to the master DMA channel first. */
7 m3 _% O1 F/ G/ N% [% [ result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 W" H/ A* i) g% Y1 H0 z4 b } & i( L$ K. `" @
' |6 F, S s0 |
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- d: b r& U& J& G, o
; F }; c' P+ R/ F% T, A if(result == EDMA3_DRV_SOK)
1 N0 P* y7 d8 h1 j8 ?, q {, H, n) y. R2 R! b9 K: h7 r
print2arm("edma3 driver init success.",0);
4 t6 J V3 U$ d } * p/ O( A& H5 M9 m$ }
}9 i1 \$ F" r: R1 ~- @
! d; j+ i: c* l; [
/ I" c9 Z7 l% @6 H$ X- z' `; sEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 d, |6 @" ~! c* F! ^8 b7 V- x
( A3 k/ C7 d0 S5 e; V+ a7 M+ r6 V. ^$ T% j% P0 ^- Z
|
|