|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ { r0 z& ?3 B& F5 |
#define PING_PONG_ACNT 1
! \+ Z7 s" N1 s. o2 Q& m#define PING_PONG_BCNT 8*32*40 8 S1 D4 h. _' D/ k* F
//#define PING_PONG_BCNT 1
, o' a! N4 Q+ v! s/ |5 Z. ^#define PING_PONG_CCNT 1) D% M$ h+ _+ w' c6 S: `, [
#define MCASP_BASEADDR 0x01D00000, O- @1 L8 c! |
#define Mcasp_RXEVENTQUE (0u)
" K: O* f5 j5 N+ z9 U& y1 r& `* D, G' q$ ~& }6 }3 U
/* OPT Field specific defines */
1 o2 I9 `( C4 @/ N3 ]#define OPT_SYNCDIM_SHIFT (0x00000002u)
! z- f* Q2 }6 g6 ?#define OPT_TCC_MASK (0x0003F000u)& w" X) } Z* w5 q# n
#define OPT_TCC_SHIFT (0x0000000Cu)
/ y% O8 T; t. _#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 e0 C: D1 u) y" m4 I#define OPT_TCINTEN_SHIFT (0x00000014u)" I& x6 a9 H! ?3 {& W9 e
$ A: o% p4 ^7 p) ~# H6 }4 B
char ping_buffer[PING_PONG_BCNT];# F# Y# F( R" \0 N7 g
char pong_buffer[PING_PONG_BCNT];
0 X- ~3 S$ t( S) t) [# [: Y4 L1 U/ D
1 J2 ] D' @7 Y q% o7 ]. O8 O: z9 }8 H! j
+ |. @+ l8 C' ^( I
) f, F1 e) S6 B2 [/ _
static void ys_edma3_init()
3 d8 I- c+ C' U) e+ u{
6 k+ H: g8 @& j- t. u: Y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 o/ t; D4 `1 a/ y' B# h: d EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. h: {) T7 d3 W5 {6 D# T+ T$ r EDMA3_DRV_Handle hEdma;9 C& A% L r2 k
uint32_t chId = 0;
4 }+ T7 U6 j+ R; U( f uint32_t tcc = 0;
7 m7 z& X- H8 f0 {# k5 v0 X! W t/ M# t( ~4 s
print2arm("edma3 driver init...",0);
1 R* J# M' t! ^, j. ~5 X* f
% S! _) R$ A4 b hEdma = edma3init(0,&result);. J7 M, W5 Q, v$ M
if(hEdma)- d" a9 d; s9 v2 E6 _( P0 I% J
{
1 r; F* _- x* p# d& _( H print2arm("edma3init() Passed.",0);
; x0 K* g5 F; u }
$ Q+ b. N! d- K# B! X else3 W* d. Q# Y5 i9 i3 N# I" o
{
6 a: H6 W& A( ]5 M: u9 |8 r. Q- K print2arm("edma3init() Failed.",0);
( V' ]% ] S( X; U! U2 m# D }3 E* G/ v' P7 x" W
; S5 w% V0 w3 R+ r \
if (result == EDMA3_DRV_SOK)8 J/ m7 j# b8 L
{
4 v7 X/ B4 G. L Z1 p result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 F" b* s& o' z% a( y
(EDMA3_RM_EventQueue)0,, i+ N) ` ?, m I
&edma3_isr, NULL);) Y! I h' r" V' _8 {
}1 d8 V l% [1 {. O
# e( x) B- A$ a
if(result == EDMA3_DRV_SOK)
) d/ x+ g0 z0 Q. R {) H9 e: X; v, l! t4 z
paramSet.srcBIdx = 0;) ?" \6 Z& A) I" I; y% H2 x1 ~
paramSet.destBIdx = 1;3 g9 A1 R2 H P8 ^
paramSet.srcCIdx = 0;
. Q" s x2 |- R8 d paramSet.destCIdx = 0;7 h J) l. E1 b; e3 K
paramSet.aCnt = PING_PONG_ACNT;+ R$ S2 N# f: x J4 N/ S6 n
paramSet.bCnt = PING_PONG_BCNT;
% C8 @3 @3 p ]" r) b paramSet.cCnt = PING_PONG_CCNT;& B9 g3 |. s1 d; q3 l0 f; R
( h8 N! b8 o5 z! e, k
/* For AB-synchronized transfers, BCNTRLD is not used. */ L) y' j1 f& ]; c/ E
paramSet.bCntReload = PING_PONG_BCNT;
, U, z: t; L8 D# [. G; q6 z- ^1 a" l# _# [ {6 ]
/* Src in constant mode Dest in INCR modes */5 R, \- I/ ~$ l I4 a D. l4 j
paramSet.opt &= 0xFFFFFFFDu;1 V; w$ F( e" ^1 z) ]/ x$ t$ ^- D
//paramSet.opt &= 0xFFFFFFFCu;: B; H: }; L2 c& p5 y5 p
/ Z5 E$ z' ?0 ]& K/ |$ h* Z
/* Program the TCC */
$ }; Z+ O" f8 H! V6 Q( s paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! H: p. u$ p# W0 N) y
% C. }+ }( k* z; h6 u4 i5 e /* Enable Intermediate & Final transfer completion interrupt */
5 k- \6 K$ _: Y0 V1 Q paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 D- G2 s% E9 u3 J% m: p" P* D paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);: Q' G8 I3 [/ p5 T# [
: q( U, e$ Q5 _" w
/* AB Sync Transfer Mode */
9 z [' {; p9 D% M5 G: y paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* C9 M* q6 C7 X; {8 N: T
9 e5 S2 N. q: S3 c+ I+ C
/* Program the source and dest addresses for master DMA channel */
" X' k1 y$ v' x6 H; w& N paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 l: e. H; d, s& r( i3 N9 O paramSet.destAddr = (uint32_t)(ping_buffer);4 N5 \4 F3 [- l6 U# ?+ A* |- @
: c9 R( c3 W$ \; G* Q /* Write to the master DMA channel first. */
3 {5 e# N- _/ @& x3 f+ q result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; t4 J8 O, e7 {) q1 ~8 K) K }
3 e+ j9 h: r a" l- M+ t, b% F. C# ^6 n9 m+ h% E8 K
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: I5 U7 r/ G4 W & @1 x3 k2 s1 o# Y
if(result == EDMA3_DRV_SOK) 1 M* z- v* H# {/ j' [- \, E
{2 _5 \- a- l0 T5 `9 b6 H5 m
print2arm("edma3 driver init success.",0);2 e8 C# [1 u1 q+ M3 ?
} 5 ~% |( {9 k- @9 C$ B# g0 @! L
}
7 f) n; b& N c& U) H7 E. c8 X# {: T1 N4 m# v: V, k' A; P
& E% v& l6 s7 P( T# I7 s |, kEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# [6 L' o7 ]; G+ M5 T
7 t' T8 [8 A+ p# m0 M2 v$ i; Z' U& B9 v" V+ B: G& B# R5 J# d- P
|
|