|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 J: O# V6 U7 D6 |5 t" y8 H& f4 e
#define PING_PONG_ACNT 12 E6 L+ K- x" E$ {) N* B& l% H
#define PING_PONG_BCNT 8*32*40
2 _9 z+ h$ U- n; e- s( p$ C4 _//#define PING_PONG_BCNT 1
5 i% \ o. K" u1 L3 m#define PING_PONG_CCNT 15 t8 ]3 o, ^" i- Y8 q6 s
#define MCASP_BASEADDR 0x01D00000
$ [1 F: i8 H! M7 U! X3 |#define Mcasp_RXEVENTQUE (0u)9 K3 D- p/ P7 v. o8 {8 S1 Y
) h& s9 x) ?: C& `2 |9 t
/* OPT Field specific defines */- r% `7 S# x) i- X9 T# c1 Y& m
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" ~* k* J2 o1 O( X# t8 u2 I#define OPT_TCC_MASK (0x0003F000u)9 m% d" c6 @# \- Y& i
#define OPT_TCC_SHIFT (0x0000000Cu)$ c* y( i; ]. [: g
#define OPT_ITCINTEN_SHIFT (0x00000015u)4 g/ \9 p& w9 \6 a; c% U2 ~
#define OPT_TCINTEN_SHIFT (0x00000014u) S0 S% z% k4 D9 y
& p( l. g0 r/ B( Q
char ping_buffer[PING_PONG_BCNT];# p5 X5 G j$ {5 {/ Z, s9 a
char pong_buffer[PING_PONG_BCNT];# B/ m& Z" q& o( K8 B0 t
; i" A4 }! p, w7 u7 c% L
8 Y1 ~7 C' [- ]$ {+ l: B: x
8 L( N$ {+ N: a' a) p d
+ O) C2 _3 ?0 u* R, \$ L/ _' Qstatic void ys_edma3_init()
: _) r! ]9 ?! t. s. |2 S0 O{
' A& K" \0 e2 ~2 q4 Y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 _5 }9 X$ l+ M: l8 g! _0 \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( w% Z4 ~ v7 E& P EDMA3_DRV_Handle hEdma;
7 I0 V0 t4 l6 V" u8 i2 M8 a uint32_t chId = 0;
3 s! h+ i3 J7 A uint32_t tcc = 0;
9 {6 C! y, W5 d- M7 m, K) s4 Q! I( E- `, w( w! y4 s5 }
print2arm("edma3 driver init...",0);
( a D& E! V5 U# |
: x% Q* J1 |- d) f$ T6 a5 { hEdma = edma3init(0,&result);
. D9 ]& {: {4 `1 d" ?* x3 Q if(hEdma)
3 K: N' m& w0 y) c {- F. B8 A% f8 H% G
print2arm("edma3init() Passed.",0);$ F( m% v/ t& `4 m, h
}
; U4 d5 g8 |: C& L w P else. ~6 d2 e3 S5 x
{) n$ L9 H- d% S# q# Z& S* [: m
print2arm("edma3init() Failed.",0);
|7 J |, q# ]6 k- q8 F9 E }) K1 K! ?; V5 f! Q( b
0 b; ^) ]: o2 {7 M
if (result == EDMA3_DRV_SOK)1 v% [( {) z( L( K* y, l2 B
{% A& A7 l6 Q& x! a% D; j" t& d+ }! f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," I/ H6 ~0 `; u
(EDMA3_RM_EventQueue)0,: L! O$ t4 g6 F+ F1 t" }6 d) z
&edma3_isr, NULL);
1 \' ?1 U" v& T2 [3 ] }
, Y- t: u$ Q% J0 ?# k5 x. b 9 T" z4 u! v8 [
if(result == EDMA3_DRV_SOK)7 ~* u# {8 ~5 d! X# V( g
{: C% M' x% z# d( X8 V* I/ M
paramSet.srcBIdx = 0;
( x5 p: K9 H/ H. C paramSet.destBIdx = 1;! y6 U0 ~ e/ R' h y1 k& |
paramSet.srcCIdx = 0;0 M0 X5 Z' Z ^9 W' a# T
paramSet.destCIdx = 0;
& f) y/ f- w7 R) k" V! S* } paramSet.aCnt = PING_PONG_ACNT;
5 E, c( r1 y' R/ |4 ^! A- e paramSet.bCnt = PING_PONG_BCNT;
, U6 S+ n/ t' M }, c! Y9 x# o& i7 C- e paramSet.cCnt = PING_PONG_CCNT;" ]9 A) J1 ^1 c5 I+ t5 |7 ^' D3 `. i
7 Y, U8 y' w0 i
/* For AB-synchronized transfers, BCNTRLD is not used. */0 O. u+ B7 L9 t8 N; U9 n+ ]
paramSet.bCntReload = PING_PONG_BCNT;
6 S9 r, w6 P8 r' s, l! a. y
/ C. Q% O% t5 P$ T5 x; ]3 H: x, b3 { /* Src in constant mode Dest in INCR modes */
& r! T+ r+ c1 i# q paramSet.opt &= 0xFFFFFFFDu;' f' A1 i: }% C& A* Q1 @* ]# N
//paramSet.opt &= 0xFFFFFFFCu;
0 N H5 l0 Q6 P
% L9 l7 Y0 J7 }' Q2 r; | /* Program the TCC */
# I8 x7 h2 m! u8 |. N paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ T) r6 f, ?$ ]- w; b9 }% p
8 C+ h1 f0 `! y( f/ H /* Enable Intermediate & Final transfer completion interrupt */
8 S% N. c, c/ F5 L4 \& }% @# C j paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 P6 U$ @$ v) f9 W( |7 k8 Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. ~0 P3 Q9 o0 k
4 D0 c9 ]; q% A* @0 N I! N /* AB Sync Transfer Mode */
' j, E7 j% Z! X" Z paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 y, {8 M" n( h/ z1 @, v
; Y2 J) l* U2 X. t/ `. o /* Program the source and dest addresses for master DMA channel */
; E- U/ o& u+ x* X9 G paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);1 e, A1 Z+ ?% y: }) J
paramSet.destAddr = (uint32_t)(ping_buffer);
, @ z% f: @( w/ e9 t }5 [6 x. [3 N* z# w K/ n2 H5 j; A3 `/ j
/* Write to the master DMA channel first. */
5 F; t& Z/ j0 W( t result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ \' m* W5 ^$ p! T. v7 Y/ ^ } " l1 Q9 k5 M+ Q6 K u
4 `# F) u9 n' T& L) |% E result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% N. y* p4 E- O+ ?
, w: C2 i8 F4 K if(result == EDMA3_DRV_SOK)
, A( j0 D! a/ O/ c5 P6 @ W {
e8 K7 I; e7 g print2arm("edma3 driver init success.",0);
. [! o! _ d+ S6 H2 ` } 1 j/ ^$ @& h* `
}
$ E' Y, c( U0 Y0 L7 l, Y+ o2 d4 e' n6 S6 R/ Z
; Q/ T, b1 a! ]0 Y( Q/ x) gEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 W3 C/ M2 r9 I: j! [4 I. C+ l
% D- R: ^! c" G9 j, e3 Q7 S" I7 c3 r( R+ r; K
|
|