|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 `) A/ F2 j y( }( P4 j4 I; z#define PING_PONG_ACNT 1" a8 a6 i& @, e T- a/ h1 q
#define PING_PONG_BCNT 8*32*40
% J8 P3 u6 p% N4 z3 \6 r6 a//#define PING_PONG_BCNT 1
$ _$ J- Q0 {- k+ j. T/ M: R0 }$ O& u#define PING_PONG_CCNT 1 I' x/ b* c, K4 f& }: z" i6 v
#define MCASP_BASEADDR 0x01D00000# U2 G! [! S3 M6 p8 y! S
#define Mcasp_RXEVENTQUE (0u)
: C* c: g0 I- U; q. I. R3 X) f0 J- T3 g5 e* d) v+ ^
/* OPT Field specific defines */
8 ?$ `$ d/ g' I- \#define OPT_SYNCDIM_SHIFT (0x00000002u)
v6 R6 c0 j. |1 X1 X% j#define OPT_TCC_MASK (0x0003F000u)
# X$ K- m/ n5 z; Q* ]#define OPT_TCC_SHIFT (0x0000000Cu). N% y$ s1 A8 w8 x4 \: h
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% B) G1 x+ A: y& A2 N8 Z#define OPT_TCINTEN_SHIFT (0x00000014u)! ^4 L* B1 H3 n5 i3 V4 G9 x
$ ~/ N+ r# u; P) o! M6 nchar ping_buffer[PING_PONG_BCNT];
* w* f" Q1 F% w) ?char pong_buffer[PING_PONG_BCNT];
; F( ?; Y: z! h/ l" Z n: s6 i) }, K" l) t% F) P1 w7 p3 B
7 m) Q1 u- I6 f! H$ e" k1 e* m7 C* R. Z
9 U g6 p7 R! O1 i- Dstatic void ys_edma3_init()
& G4 b) Q, p2 j# @& w8 X# A{
0 w# f; `' D$ e. D4 o EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 R; [7 T7 O& L- J! q5 U8 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 |( e2 j: k$ N1 e3 { EDMA3_DRV_Handle hEdma;
4 m; \; B! D5 F3 g4 t uint32_t chId = 0;5 G7 r# y6 p: d
uint32_t tcc = 0;
* Y! v- e) O) O5 \
( _$ o7 B& k' F8 o4 g print2arm("edma3 driver init...",0);( T% k6 s" U' D9 I
5 l' n# P( [! {7 Z8 ?' l
hEdma = edma3init(0,&result);
9 S0 g+ C7 P; ^! i B if(hEdma)5 M: V1 L; U6 g: Y
{
( X5 \7 ]' F4 T y% [ print2arm("edma3init() Passed.",0);8 o# C! z4 \: T/ S7 A8 |# F
}+ I& @* p C" O+ D- S, ^8 U
else( k7 l( @/ F1 x- L* [
{* b- x1 q; X( h, [
print2arm("edma3init() Failed.",0);
" F9 \' [5 ?( n6 L }
" c- G6 F7 A5 b/ P
6 ^$ M& g; q8 n0 l, f7 D9 @ if (result == EDMA3_DRV_SOK)9 E7 M1 @8 w' B% d6 Z. z6 ]
{$ G- t4 y+ @5 w( O/ o* p
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, `3 Y7 Q- V8 V" c$ o
(EDMA3_RM_EventQueue)0,3 n1 N6 u; J/ l* k
&edma3_isr, NULL);
# Z4 ?$ \2 S" R& l0 I4 z$ J7 X }5 v7 K& K e, E
T0 m; a/ `- }2 f
if(result == EDMA3_DRV_SOK)1 L' R8 g& M. a( B
{- S% x% z8 Y6 ^4 P5 n: ]9 G
paramSet.srcBIdx = 0;
1 a, W" I) N# x1 S: ^ O5 ~0 F6 ^ paramSet.destBIdx = 1;
1 V# Q$ y4 T( X | paramSet.srcCIdx = 0;3 _( r, U, { K3 C
paramSet.destCIdx = 0;
+ L) M* P# f- O& \ paramSet.aCnt = PING_PONG_ACNT;5 {- r9 f Y3 n0 w& e7 K0 U% I, B9 G
paramSet.bCnt = PING_PONG_BCNT;
1 m& m/ n9 N/ l0 {/ E+ u paramSet.cCnt = PING_PONG_CCNT;
9 P, _! j% F0 \+ } % ~& J, c, i; p. ?. ?
/* For AB-synchronized transfers, BCNTRLD is not used. */: l1 w. E) N4 j
paramSet.bCntReload = PING_PONG_BCNT;
% H3 c- Q4 D" q7 r
; ~$ n6 C# M. z6 r( V7 a- S /* Src in constant mode Dest in INCR modes */2 @& M |8 e% F `) G7 a
paramSet.opt &= 0xFFFFFFFDu;
% C' r& v5 j$ ^ //paramSet.opt &= 0xFFFFFFFCu;- Z/ E, ] n# \5 @2 x+ c
" g2 @( t) E* O- c# h' ? /* Program the TCC */
. P5 _$ y1 \' u+ D- k+ k1 N* ` paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ V9 _9 v4 \4 B$ ]* w# p5 P. A
7 L/ ^& l. u& X3 H% \ /* Enable Intermediate & Final transfer completion interrupt */
& i* q& ?( P1 Z6 L$ t paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! a- ` b5 x/ P+ _9 w ` paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# P; }& j$ @- u
[) B" R0 [: w& ?& ~
/* AB Sync Transfer Mode */
+ u* j; @) X/ i, [ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( f& P d5 A; `" E& n
+ k8 J( Q* @# M W* }% ?- P /* Program the source and dest addresses for master DMA channel */
' @+ H0 b: P) v, [- v paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% c' h# F7 P! G- s R1 x paramSet.destAddr = (uint32_t)(ping_buffer);! a; m" E( z( C
$ D6 @* ^! A. f" H. ~( ? /* Write to the master DMA channel first. */& M' Z/ ^( G& v' x6 T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);. s' e! d7 g% }5 A
} 9 y9 Q, \" U4 i' _
5 C, x& g8 [9 Z! l result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& n; U0 y& H$ I$ n0 v: Z. d) X
1 Y# c" m1 L% s* K4 g, q& x+ K if(result == EDMA3_DRV_SOK) 1 n+ o% Z7 H" o4 h! ^
{$ n: g0 D/ H( j5 h! p3 L
print2arm("edma3 driver init success.",0);" m$ K! o/ N! U- v
}
/ |6 v1 z4 z. l6 V$ X1 r2 ]}& w& u; _5 s1 n( }
! f# R \' D; D/ f0 R! t5 }+ K
7 ?' g5 H$ U) {( ?8 a" B: n
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。5 {' z7 k; L. u) x2 Y, |5 V
+ l- _: q" F7 O# w* e0 ^
: R7 ^0 q, o/ ?) n# ^0 r3 s |
|