|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 }8 I. ?( H0 L( E B#define PING_PONG_ACNT 1( s3 Y9 A% ^. D8 S! g
#define PING_PONG_BCNT 8*32*40 * {7 G7 K7 [9 M
//#define PING_PONG_BCNT 1 0 |$ B3 R- P& I
#define PING_PONG_CCNT 1! D M6 w( J$ \3 ~% Z8 g" k' l
#define MCASP_BASEADDR 0x01D00000
& E5 c7 o0 w) p F#define Mcasp_RXEVENTQUE (0u)
7 y; C/ P3 Y+ _/ g: Y1 T; T/ S! X' r0 u/ |. ?, B( R3 \
/* OPT Field specific defines */
: {( U0 ~1 R& J8 }; q9 \: J#define OPT_SYNCDIM_SHIFT (0x00000002u)$ D! ]) G1 [' u8 N+ L
#define OPT_TCC_MASK (0x0003F000u)
! ^) U2 N( G9 x% _. @#define OPT_TCC_SHIFT (0x0000000Cu)- E' `- l) a7 n% P. ?3 s# V" x! E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* A7 g+ O9 |. t+ V5 t$ _# x#define OPT_TCINTEN_SHIFT (0x00000014u)
7 l; @" X! B, c: J; N
3 w$ E4 W8 P e+ u3 ~char ping_buffer[PING_PONG_BCNT];
" k/ v- t# m0 h* Mchar pong_buffer[PING_PONG_BCNT];+ H' n; M, I# ?
: e* q1 V; [& L* h1 O5 h* [( T! G4 \1 f
3 x- I5 U- t0 P6 O. F z/ O
# F7 }5 Q% s4 L9 Y- L5 h8 estatic void ys_edma3_init()
4 n ^0 z6 N) j{. P) {2 c( r( `9 h
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; ?( C4 I4 u6 g ~+ y s s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 ?3 u4 H3 ~: [, W+ j, F' s EDMA3_DRV_Handle hEdma;
! n4 P* n0 P' [7 a8 @" O uint32_t chId = 0;7 o* S. _" V4 q3 u& j- @
uint32_t tcc = 0;2 ?6 V2 w. i: _; A7 A% O* A
" J! m1 c( j* ]: s4 q# ~ print2arm("edma3 driver init...",0);
* h5 l3 T7 j: B+ P$ Q! C) R
# |! ?" @9 c1 L* N, X, k' l4 E2 x. u hEdma = edma3init(0,&result);
# r$ t" {( j# V' z- | if(hEdma)
3 c+ B4 L- A5 F0 L {
% `# t, y0 W9 y7 D" Z' R print2arm("edma3init() Passed.",0);
1 {$ f; s$ D* u" p+ C) l }" ?, U! ]+ [0 X0 g0 g) F
else$ y# H$ N& n4 g
{7 F+ h L3 T5 |/ |
print2arm("edma3init() Failed.",0);
! `8 t/ A( X# x }
( [ R6 a& e6 L A# p6 s* v V3 ]4 d # R) _* k( _ G7 [
if (result == EDMA3_DRV_SOK)
4 `( L' P; N2 }& J/ } {+ M3 p: C: h) s, X& W( R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" q3 [( B& ]# p (EDMA3_RM_EventQueue)0,
* F1 M) X' ]( A/ c3 u7 f0 s3 S& I &edma3_isr, NULL);8 V8 [4 w% n/ H& l" |; b' D C# C) _
}
/ Z8 g$ Z+ k% m8 L" T% K6 X) c3 R2 c 9 Y* ?) g2 }! \3 I
if(result == EDMA3_DRV_SOK) }: T/ o4 q5 N
{
/ u- D( r1 i! F paramSet.srcBIdx = 0;
" l, G: n, B/ C+ E$ c paramSet.destBIdx = 1;
8 S, E, y/ Y. Q/ |( t paramSet.srcCIdx = 0;/ \; B! [( j) B/ F* g5 q$ O
paramSet.destCIdx = 0;
9 ^. P3 _3 @# R5 ` paramSet.aCnt = PING_PONG_ACNT;, r# v7 u, p6 t6 N
paramSet.bCnt = PING_PONG_BCNT;, `! S, y' l4 F
paramSet.cCnt = PING_PONG_CCNT;9 h6 D! e( ]/ e
- O2 f& E' \+ c q% |3 h: H /* For AB-synchronized transfers, BCNTRLD is not used. */
3 ]; _# @2 A& p" l: k6 I6 F paramSet.bCntReload = PING_PONG_BCNT;
" b: y0 H$ _% x' |0 x1 I
+ N7 b- G! X4 G /* Src in constant mode Dest in INCR modes */
5 f% q% C4 Y6 `2 S. ]) T paramSet.opt &= 0xFFFFFFFDu;" i o( a$ ]% u7 F/ l3 K8 Z
//paramSet.opt &= 0xFFFFFFFCu;3 g5 V! T" a$ u8 D% N" k5 A7 C1 J9 O0 o6 Q
# C! X! U2 W* [; ~% Y
/* Program the TCC */
2 y/ {" m W) S' U1 q7 [ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" |! r+ Y1 m' r
/ e2 F% I; y' W. z# i9 E
/* Enable Intermediate & Final transfer completion interrupt */
0 h; e" B0 m9 s! s: _- q) L paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% _, K) Q; I. I6 `1 c* F7 D& S
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 E R8 z+ E; U- L* g5 C7 G% `* \ l, S# E
/* AB Sync Transfer Mode */
; _3 ?' A8 G) A4 W: \ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 A- S! ^8 X& @$ \# s. q: y ; v9 @9 S5 _4 }) y" W
/* Program the source and dest addresses for master DMA channel */2 }' L$ y- j5 H. L4 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);3 O; a$ j- @4 F3 j5 |. C
paramSet.destAddr = (uint32_t)(ping_buffer);
7 ]; p6 ^/ p! Y `6 }2 b: t
3 A m) d9 }' V: r8 ] /* Write to the master DMA channel first. */
3 J+ [' @5 d0 K& ] result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);0 j) I9 T v* H% e; |
}
N% b9 {6 b, {" c$ ?% c/ k z7 z. L& Y. _. H; A
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! b, M& [8 P' e: g
6 c) p& ^6 o$ i- R: q. N if(result == EDMA3_DRV_SOK)
. D/ F! \! h# c- K! n4 f+ {, J {
$ C) a9 o& g% ` print2arm("edma3 driver init success.",0);
/ s" s0 }+ n4 r3 @7 L P C+ s }
' u- k1 H8 u& N! u- c}& @5 t6 L, C; F! R& L2 U& E# e
7 O# ~3 o7 I" g) r7 V
6 _. i8 C" c4 f3 A( T, @( v% G+ `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: j3 V( V! E6 }; g, w
3 N, b( f3 Q! V3 P# _" z
7 h+ F0 H7 U; X t* L* m3 L |
|