|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. Q) B8 J% f* N _9 d#define PING_PONG_ACNT 1+ o2 _0 h9 \6 ?6 A
#define PING_PONG_BCNT 8*32*40 , c% Q* g) N+ t9 |+ ?. w
//#define PING_PONG_BCNT 1 - D, O( O& T$ W
#define PING_PONG_CCNT 1
; B/ S8 A3 N. a' w8 s#define MCASP_BASEADDR 0x01D00000
- q9 ~6 J) Q* u W5 K% `#define Mcasp_RXEVENTQUE (0u)
* s, E( W! E' W1 m& r5 h7 i9 u4 G5 I% u1 o0 X# y3 c9 G+ p
/* OPT Field specific defines */% ~- s( y4 Q ~- `0 j P9 K: q6 L
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& v0 ?- L. C* C! T5 o6 e#define OPT_TCC_MASK (0x0003F000u)
( N' [# X4 X6 e& G3 u) W#define OPT_TCC_SHIFT (0x0000000Cu)4 S: y6 Y8 z6 R% U- b5 N- H, r% y/ C# k
#define OPT_ITCINTEN_SHIFT (0x00000015u)( ~. w! J# T! N8 q
#define OPT_TCINTEN_SHIFT (0x00000014u)
: z2 t. `; E8 f6 b* D' U& S) S0 p9 Z. T1 e5 \5 o
char ping_buffer[PING_PONG_BCNT];
7 M. e0 \/ ?5 L; u; J ?# dchar pong_buffer[PING_PONG_BCNT];
7 D* v0 I; w, `# m: L0 E0 W$ g
, W2 V) u9 B, \7 H% x; j) j/ v3 g3 ~/ z& t% q b
* Q3 o: H, a U( e/ t
5 b9 ]. n7 d t, C9 c# P7 fstatic void ys_edma3_init()2 [+ [. s+ N9 U2 u; L: C& C5 Q5 e( }
{7 P8 h; e5 u: U9 _2 [9 _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ v3 ~8 p! X4 r" x EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 Z, H0 Q: ?! j
EDMA3_DRV_Handle hEdma;
* S. L2 _1 A8 D+ H5 O: ?3 G$ o uint32_t chId = 0; B+ I! o2 t1 M& v, }2 l1 v
uint32_t tcc = 0;: ]0 Q( B2 d. ]) ~/ q
" H2 ^6 }- F3 x- u; K3 x: A7 j" q% Q1 a
print2arm("edma3 driver init...",0);
* P0 h& d7 j, z$ a" k% n# [( S+ O4 I) E# o& W- l4 m3 X
hEdma = edma3init(0,&result);
: l0 w( l0 @# e. i& ^/ c: e if(hEdma)
" v0 Q# a, }/ W% }% r( F" M6 n: O$ g {
5 O) r5 ^: V+ ]0 }0 r print2arm("edma3init() Passed.",0);
& b' E! P+ M/ D2 k: { }
: N' `/ I' k! I: b else6 L6 s" p' @0 R; C# M6 k0 Z
{
, ]; r9 h6 s$ f" m8 w; U( n# y print2arm("edma3init() Failed.",0);
2 r6 m, i7 h0 } E }
1 F) j3 |) t6 p+ d8 F# Y
' D# D) ?) J6 `4 G4 V8 c if (result == EDMA3_DRV_SOK)
3 z; O! C* i* A I {
d; b* u7 P: [' f2 E: w3 k! i result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 w) q" b& P0 I (EDMA3_RM_EventQueue)0,+ l$ }$ z8 u( l
&edma3_isr, NULL);- k! e2 L F* @
} L- Z0 E; b: r% N" c
$ ^, W; J' g+ S% c( D" Z M/ Z* {; N if(result == EDMA3_DRV_SOK)# R# Q( R+ o0 X$ N
{: i3 B7 y) Q6 R$ G: L7 F. e( n
paramSet.srcBIdx = 0;
! i. g1 V; w: c4 ] paramSet.destBIdx = 1;5 r5 ~* P1 y/ `! Y: o/ U2 Y
paramSet.srcCIdx = 0;! o# e2 M+ M* M S, ^( m# G
paramSet.destCIdx = 0;7 E' P F8 i; \5 }) J& y
paramSet.aCnt = PING_PONG_ACNT;4 p3 o! Q( e6 @ b1 `1 B [
paramSet.bCnt = PING_PONG_BCNT;8 U ?9 d# d8 A
paramSet.cCnt = PING_PONG_CCNT; Y6 N) T; Z6 q) d0 w
( } ?( S# C2 K8 {$ B /* For AB-synchronized transfers, BCNTRLD is not used. */
. c+ f e9 ~. ^" p# d paramSet.bCntReload = PING_PONG_BCNT;
/ w& V7 v4 P) l1 ], z% i! j8 b( E$ Z$ Q6 y
/* Src in constant mode Dest in INCR modes */3 Q, L" e1 E3 Q2 r+ Z4 j
paramSet.opt &= 0xFFFFFFFDu;
( y0 K6 N3 _& g T/ o0 y1 n //paramSet.opt &= 0xFFFFFFFCu;
6 z$ Z5 m. A8 o# ~
$ U& E# u6 G0 | z5 U2 M /* Program the TCC */
7 X9 s E1 y9 } paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* y" W- H" G7 j9 n" h1 r( [' }/ L
# v) x' ~/ R+ o' o /* Enable Intermediate & Final transfer completion interrupt */ Y& u! @' R4 B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 J' N. u7 X% `2 w; J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- b1 A% c/ B: o) l# p% M7 B) t! i' V* r
/* AB Sync Transfer Mode */" }" [) u" y$ a% _. D0 i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; }/ j/ ]" f' H8 i) A5 ^" M$ K
7 d6 n8 I2 p& U9 S5 a; I. K
/* Program the source and dest addresses for master DMA channel */# z" B! i0 q L1 r2 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ @0 _1 y6 P4 q" r, [ paramSet.destAddr = (uint32_t)(ping_buffer);/ D4 s# q/ c) d- n d: M$ U3 A% W! U
3 V# P- V) g8 {3 W
/* Write to the master DMA channel first. */
& W- G, H( K# |/ y/ Q# p9 n5 k0 W result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 _4 [: W& E+ d- V }
; x$ R6 ^8 g% Q$ `1 j; _6 X3 R: d# o- I& n1 W( p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 c/ }; a4 I+ l9 k7 p* V 8 u# `; M0 C- L8 m, U8 O3 N& ~
if(result == EDMA3_DRV_SOK)
% l* f$ O" D7 J {
m7 k5 y3 A9 {. P6 B, v% |, ?* u print2arm("edma3 driver init success.",0);
: G6 j& d0 p3 J' v6 Q4 N9 p' U } $ N1 ^2 s0 Y: h
}2 F5 Q2 d, {6 |+ c% T/ o
2 Q. ]+ b1 W1 B$ a) G0 ^9 k
1 K a( [% K. ^& h6 k3 t7 q# ]EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% G) N% A& T u: W* i6 A; ]
8 T+ Q+ \6 X4 E# Q5 A: e1 n8 h( j' }2 g; H" M
|
|