|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 D4 A6 q' q9 D/ n# z% f
#define PING_PONG_ACNT 1
6 x' y3 G, `& L0 Z#define PING_PONG_BCNT 8*32*40 $ n! t* K" {) H F/ }( x/ E
//#define PING_PONG_BCNT 1 8 P$ U' n* G( a. p% M& O! `/ S: H) q
#define PING_PONG_CCNT 1% j* s0 ]) ?* t* H; l
#define MCASP_BASEADDR 0x01D00000& i `. p6 D( e- m0 `
#define Mcasp_RXEVENTQUE (0u)
& Q6 {8 {0 S( ~9 Y5 b( S
) c1 f3 c1 h1 K/* OPT Field specific defines */
. W) _" G: u" c/ J! \" K#define OPT_SYNCDIM_SHIFT (0x00000002u)9 D* i2 Z# G0 n: [) a" n+ ?+ M/ l
#define OPT_TCC_MASK (0x0003F000u)4 D( Q( f5 X, @( E
#define OPT_TCC_SHIFT (0x0000000Cu), d* x8 \# K. K: K3 T+ L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
4 k- ?' N4 t9 Z1 {#define OPT_TCINTEN_SHIFT (0x00000014u)
; B! e' |9 ^7 \0 g; ~2 u- j8 Y" e) L/ @# E/ i7 l9 M: L* |
char ping_buffer[PING_PONG_BCNT];
1 j5 m6 J5 h, ]: S2 ]' wchar pong_buffer[PING_PONG_BCNT];
: R1 B. D( d% ^6 W1 K- o7 A9 \
+ q( M6 L' _8 f; a; U/ |7 d. G3 O' @/ {! W+ \
7 r5 A; u- d$ @- o8 zstatic void ys_edma3_init()
9 J, F+ G7 m: g0 ~ X1 W{9 T$ b, C, ~! M! o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 m" p1 y ?9 M. \ EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ Z g, C) J% ]6 D5 N
EDMA3_DRV_Handle hEdma;
2 n7 X6 Z* K# e/ e6 q' r+ A Z, L i uint32_t chId = 0;
- l/ Z J2 n, ^5 N- o0 ? uint32_t tcc = 0;
# Y4 p( R) u0 \6 H2 Q
2 ~2 A& M& U8 R4 A. v8 d print2arm("edma3 driver init...",0);& M; q1 r; M3 P, s
% a8 g$ E/ Z7 b4 k I3 O# l
hEdma = edma3init(0,&result);4 T/ E" g3 N, B' a0 `5 I
if(hEdma). Y, L( o8 Y/ `# a4 U7 Y% v
{
8 a. L9 J% j" i' D2 _ d print2arm("edma3init() Passed.",0);; `6 ]0 | |! g3 d" j
}3 Z* L2 V- a! i6 X+ V2 q
else/ P5 g; |* R8 M& f) |
{
Q- }* M1 z+ m5 t: } print2arm("edma3init() Failed.",0);
8 Y9 w- e `* l4 T0 P8 g }7 H4 f: h8 \+ d) h3 j: \
! _' E. B8 T% J* K$ j1 {( W
if (result == EDMA3_DRV_SOK)
% B! T6 ?% W5 L {
% n* {" A3 a& E8 U2 ?4 j5 @. ~ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 m5 J; V5 s u% @0 o1 d- B (EDMA3_RM_EventQueue)0,( j9 [0 |1 Z' n9 D
&edma3_isr, NULL);
' Q1 ]( g. M0 n& j; K! L; ` }
( h4 Y( C5 N# \* W. N" c. K $ `, F& Q/ ~3 \' g! i% {. _7 A' t
if(result == EDMA3_DRV_SOK)7 A9 P0 R3 L+ k2 i1 x
{5 Z7 s! h: ~2 P7 C+ s9 `$ i. |
paramSet.srcBIdx = 0;
. v3 z' Q* w3 R9 l) ^, d paramSet.destBIdx = 1; n5 D3 X5 c0 Q0 I
paramSet.srcCIdx = 0;0 e& Y, s& k4 q* R' p
paramSet.destCIdx = 0;
2 _. C9 u3 y1 M9 K+ M. x% G' F w paramSet.aCnt = PING_PONG_ACNT;
% s. F, p" E) E' g paramSet.bCnt = PING_PONG_BCNT;
5 e' @( V" X# ]5 N' Q paramSet.cCnt = PING_PONG_CCNT;7 u8 \/ K/ M" I. I$ U, [
. S$ x8 j/ O }2 E7 `0 M4 f' `, z
/* For AB-synchronized transfers, BCNTRLD is not used. */
! \! E; ^1 F" b9 N: B/ f0 q( o paramSet.bCntReload = PING_PONG_BCNT;. R( s4 ]$ X: |5 O) N4 K
0 g9 ^/ m- t6 }+ [# A$ K* a
/* Src in constant mode Dest in INCR modes */; @* B) u# q; N' ^
paramSet.opt &= 0xFFFFFFFDu;
1 g# x) ]4 A. p/ r, T //paramSet.opt &= 0xFFFFFFFCu;
0 T9 S6 D8 M& x; c* Q1 b1 P: ? J# U; \" n( Y" z2 O( w
/* Program the TCC */ l) q( P. @3 Z2 D# O
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% x. w) h* t8 N& R- L
9 Q, o6 f/ \4 s Y( I" S8 w' u /* Enable Intermediate & Final transfer completion interrupt */
( ^' u( ~# h( `/ q3 D- i3 _8 B paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 ^( R' B0 ]) X1 M6 c* z' U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 ~# m5 p5 u6 u/ V
; G- }) L$ P# D# E4 O; E /* AB Sync Transfer Mode */7 D) U- J' ]7 a+ k( q1 k3 L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ ^# x! u1 Y: T9 ~( D/ p
/ t' A8 X; |1 Q
/* Program the source and dest addresses for master DMA channel */0 |! l3 H3 B6 E7 x+ x8 N
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ H1 [& |1 l( J$ f1 R O
paramSet.destAddr = (uint32_t)(ping_buffer);
5 w3 S+ W9 R* _' {" [! v1 Z* [0 x/ W x/ n7 \) D! [
/* Write to the master DMA channel first. */( q/ R2 O& `' s t( c1 h q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- V M$ r5 t; ]! ~" F
}
$ k5 r( a% e6 i) S) T! C0 ^* X5 d, h- q- m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ j( ]) K! N9 L# d0 S9 m5 v; e/ Q; v
) n( m- b# U( G) O9 X6 [+ P' Q2 J if(result == EDMA3_DRV_SOK) ( F3 B8 a$ L; I( o% b
{! q8 m# K$ V: R; E$ j3 @+ C5 L$ h; l
print2arm("edma3 driver init success.",0);
2 f5 l3 z$ P% z4 z2 E( _6 i } 5 _( W. ~1 J7 B7 b2 [5 G* L! |
}2 K$ h; V; p# u& w1 e& d/ _: t
+ T2 d1 n( p0 s9 Y! ]
- y' ]6 h% u2 G0 C% HEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: F" G$ e. |0 A) m% Y2 o+ `
; f! r$ ^/ n0 y' x8 G b) A
- {% E; U7 z1 e3 m9 h% ]' W& A |
|