|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% y% D7 [' P9 G) N3 a5 [#define PING_PONG_ACNT 1$ Q/ X$ o8 Q7 A9 h+ i
#define PING_PONG_BCNT 8*32*40 z4 s. ?" a* Q
//#define PING_PONG_BCNT 1 ! l3 q& E2 H. L9 S, ^
#define PING_PONG_CCNT 1# c1 M( I: [$ l) s, G Y) e5 g4 Q
#define MCASP_BASEADDR 0x01D00000' ^/ H, O' }4 X: G- [# i9 t: H8 K
#define Mcasp_RXEVENTQUE (0u)
( z5 Z8 B5 G5 B X4 `8 a
4 a/ q# P% M/ R5 F) i1 ~# o: A/* OPT Field specific defines */: _+ ?! m8 x3 h, B" f
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 H: K$ c% H/ y7 x- r: h, A#define OPT_TCC_MASK (0x0003F000u)
" t+ @. H3 ]2 s# \" g: }#define OPT_TCC_SHIFT (0x0000000Cu)& a- H* K; B# p1 Q7 X% Q
#define OPT_ITCINTEN_SHIFT (0x00000015u)) T x# E- G) T5 x s
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 o8 J; @7 k" S% ]% `! Q8 ~; K+ P# v* T5 C# z. E" |- H
char ping_buffer[PING_PONG_BCNT];) n- K$ x# R: r- a9 m+ s
char pong_buffer[PING_PONG_BCNT];
# { d: g9 D1 e' l/ Q3 K" l4 W1 ~* B
4 _- @, _/ u/ X x Y
( a* p- A, _$ A U& {9 c
4 H3 J/ A+ y, U7 W* J4 {static void ys_edma3_init()* P# C8 Q. `, u: L0 P) p& F4 C1 I: [
{/ E" ]4 f/ J# n) i+ t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 Q) z; n$ k) t+ p* f EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 Y" W6 }+ A6 [* u0 K- a9 M ~, u EDMA3_DRV_Handle hEdma;
2 m- K+ J. E# Y uint32_t chId = 0;
0 S( x' J6 v) l* N- w uint32_t tcc = 0;
% c1 b! f O9 N, M2 U, p1 {9 A6 s' H+ |
print2arm("edma3 driver init...",0);
1 M( E3 T0 \3 ?/ Q3 V% Z2 G. p+ B6 d& v
hEdma = edma3init(0,&result);3 I6 G7 y, `+ N& a( a# T
if(hEdma)
+ w' u |7 U T9 } {* Q2 {; C, s$ v; M- p6 f9 p
print2arm("edma3init() Passed.",0);: s3 v9 F+ X/ |0 q$ e
}
2 [4 T9 K5 |1 l, I* D; P8 o else
8 [1 a5 u. l# w' K1 o {
: v G l3 ]3 q+ C# [( \3 s print2arm("edma3init() Failed.",0);* m) o$ p; V- f2 p0 Q7 k
}
' }( N8 L/ E& h
: {, v. G- E+ H: O" W if (result == EDMA3_DRV_SOK)' a* J! K& m! i" R; u
{
7 w( h) ]9 A9 W2 N0 Y) ~/ A1 A result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 {" w: B5 F; ^& E% m9 C6 `; } (EDMA3_RM_EventQueue)0,
; Q: r5 }0 P2 S5 ]/ m &edma3_isr, NULL);( ], o$ Z. w$ N- |# y T6 T$ t
}
) j, n& n( C" `! @4 k! d , V- C; q( r; p: `5 g
if(result == EDMA3_DRV_SOK)
4 }" ~9 o3 O8 J$ {! I {' v4 B- L! h Q7 w+ U7 ~6 y" R/ z
paramSet.srcBIdx = 0;; b; k0 r( M8 L; K6 S
paramSet.destBIdx = 1;
" X# ^ H+ K. ~" t; C4 K paramSet.srcCIdx = 0;' f: A* c# Y& `3 ]; @+ W% o
paramSet.destCIdx = 0;
8 t' }/ }" E$ l3 r3 m5 x paramSet.aCnt = PING_PONG_ACNT;3 z% h2 u% a ~8 ]6 O
paramSet.bCnt = PING_PONG_BCNT;
5 U4 j, K; P1 H# \% } paramSet.cCnt = PING_PONG_CCNT;
; \) V0 g; f, A$ v. I) Z/ d ) y9 W5 k, h- R% M( I: w4 k* l! f1 I( A( o
/* For AB-synchronized transfers, BCNTRLD is not used. */% l& R% a/ K0 L' d3 ~
paramSet.bCntReload = PING_PONG_BCNT;0 B' F# B2 O7 F
R7 E& s8 T, i, x /* Src in constant mode Dest in INCR modes */* @2 l8 ?0 h1 [8 ~: Y1 @' Q: y' `
paramSet.opt &= 0xFFFFFFFDu;
, ?6 c& O! j. K3 a9 k) n D //paramSet.opt &= 0xFFFFFFFCu;* N# Q& I) m& J$ R7 ^; r! F
0 Y% K3 v+ c4 I: J* e% j Z$ J /* Program the TCC */
4 m: \- [3 d4 A paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- l7 X3 `7 Q( K0 T$ T c
% I! d3 E; d* n$ T+ W /* Enable Intermediate & Final transfer completion interrupt */
' J- |7 {* m1 ] paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; U# g4 L) U! B# F$ Y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 M4 X6 B; Q: _" m. K5 s; V* W, _& X9 r9 h$ K
/* AB Sync Transfer Mode */
8 f! X+ y" e; H paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( v; I; b4 N7 d0 ?
* v1 D' v" f# ~: O. e" V8 c9 y3 q /* Program the source and dest addresses for master DMA channel */8 {. v. ` {' j, v( y$ |4 Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);3 j- h0 e3 _+ y$ T/ g: G8 b/ { N
paramSet.destAddr = (uint32_t)(ping_buffer);1 J" {$ {6 Y8 E0 w& @- c" l4 ]* D- E/ T
* O: J4 z) f/ b2 p& Y3 n /* Write to the master DMA channel first. */
9 P2 I4 C- k! H4 W% z. u result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- `0 e8 s. K4 B p2 ]3 Q } ( T7 S4 g. B/ w
' R! ] E9 z7 Q3 R result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* I4 D+ S6 E: D! i5 G1 d9 s: U
; s8 R+ K( Z, }& D& h7 M if(result == EDMA3_DRV_SOK) # U( [$ y2 N4 Q: }& M" u9 x/ s
{
* Q, J0 b" H! A' o* B' o print2arm("edma3 driver init success.",0);
9 [& H e& q$ Q! J: o } 7 M$ o9 ~, O9 F2 q _
}
" v9 W, @( J8 v8 Y. f
6 p! n+ V. i! e6 l. C0 }# M6 _* K8 L8 K3 |3 [. h3 l. ~, J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 t; U. ^) f$ {/ C
( I r" Y2 B: Q4 C+ v6 ?+ @/ O
$ V1 ~5 x+ G7 i1 G- J7 U- U |
|