|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 b" I" J7 j. \
#define PING_PONG_ACNT 1, F7 x7 x: T2 D P+ C( Q+ H. ]' J
#define PING_PONG_BCNT 8*32*40
5 ?- _8 ?* d4 e//#define PING_PONG_BCNT 1
. m X" d" R7 F( u. Y; H9 @2 K, f: w4 w#define PING_PONG_CCNT 1& C3 m0 U7 U9 B9 r7 |
#define MCASP_BASEADDR 0x01D00000
v, n2 B0 ~- R' S2 ~" |* l9 C#define Mcasp_RXEVENTQUE (0u)
% u `; q6 @7 m1 r' U0 L
1 W& m# }$ h! L B0 x" \/* OPT Field specific defines */1 O3 }2 }! K. Q
#define OPT_SYNCDIM_SHIFT (0x00000002u)* u0 { x9 {3 C& y2 S" z" x" D
#define OPT_TCC_MASK (0x0003F000u)6 p3 B2 ]8 v$ {) g1 i
#define OPT_TCC_SHIFT (0x0000000Cu)
/ }' s( E0 p# }) O* N, F: q1 M#define OPT_ITCINTEN_SHIFT (0x00000015u)
: s5 p7 ^6 `9 A O7 h4 S#define OPT_TCINTEN_SHIFT (0x00000014u)' j4 n" d' S, q% `; T. I
( j( Z) ~& r& ~9 d' k! h" j0 c! vchar ping_buffer[PING_PONG_BCNT];+ }; r4 P5 |/ P5 L
char pong_buffer[PING_PONG_BCNT];
# A. z" ~ k8 O2 C; O6 ^9 N( i. d4 J- D O; z1 ?
9 u, m* c+ E' s/ X9 H$ @
2 i% ? N6 G" v2 r, s" o) T; q# R' v8 Y: B. {7 U& j8 u7 p* \
static void ys_edma3_init()
4 V6 g' k5 O2 K2 E{: g% j; v# ~, b6 y/ a9 h
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};# b( F# i9 c' g( d
EDMA3_DRV_Result result = EDMA3_DRV_SOK;- n8 q: B, ?. C) ]% e) u5 Z
EDMA3_DRV_Handle hEdma;. ^4 `2 Y' Y, }- g0 f
uint32_t chId = 0;( x' D3 S8 Q& Q
uint32_t tcc = 0;9 {. T! h% O! H$ f0 c5 q
$ J3 c5 {8 x- j' \3 P$ Q
print2arm("edma3 driver init...",0);
: w' k3 K$ T* a
' a$ c N- z/ ?& K e- U3 @ hEdma = edma3init(0,&result);% p9 d* H9 s1 L% H
if(hEdma)" Y8 z; Y+ C; e' x' J$ k
{# e3 w+ b- t+ b# X Y& x0 r
print2arm("edma3init() Passed.",0);5 C) @& R% u0 a9 v, X8 h) A
}2 s/ b+ }( n9 T5 u& G
else
$ H% j2 N- W7 _" n& a3 T {8 i" V1 D4 z: r; x: S
print2arm("edma3init() Failed.",0);
5 ?* O5 f) x4 a( a }0 }$ h9 A8 l- C, b+ ~: d* v
! M; B0 o: L9 d- c+ R
if (result == EDMA3_DRV_SOK)0 }9 D# E% a4 E$ z3 O! F: U. ?" M; \6 ^
{( r& \# ~) p% ^' J5 ]3 Y; U
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. R5 {$ X- I9 Q# b (EDMA3_RM_EventQueue)0,9 _1 ~ v M8 z" s
&edma3_isr, NULL);
' a8 g l; @& s }
1 b, D- s; S- f 9 u/ q8 [2 M* L, Y
if(result == EDMA3_DRV_SOK)
5 f d0 t# ?0 `& h/ |2 [6 u {% S) @+ {! ~6 H/ y x# C" M$ m
paramSet.srcBIdx = 0;
; z: K$ A( R; y3 P- M$ t4 w6 t paramSet.destBIdx = 1;
+ p* {9 y* e- l8 O2 `+ P paramSet.srcCIdx = 0;
2 V3 m. I2 K r paramSet.destCIdx = 0;
% o. X; z, n p" ~6 Q paramSet.aCnt = PING_PONG_ACNT;& R) M: b2 W, w
paramSet.bCnt = PING_PONG_BCNT;
% {: N" s, q& ~$ [" O* A, J) ]4 i paramSet.cCnt = PING_PONG_CCNT;
" e R' H6 u5 c / Y- M' F& | p; w+ K3 @ ? u/ r
/* For AB-synchronized transfers, BCNTRLD is not used. */$ }' y3 V$ X, u
paramSet.bCntReload = PING_PONG_BCNT;7 T# I8 |# }- E
& ]4 Q- k. I* O6 m: g3 P' ? |5 G6 { /* Src in constant mode Dest in INCR modes */
% C; F/ C; O& W0 i" P paramSet.opt &= 0xFFFFFFFDu;: C4 u* s5 F, y- N, V- w
//paramSet.opt &= 0xFFFFFFFCu;3 k6 H4 T; Z) _- s' |+ E
. s, ], H* a5 |& `
/* Program the TCC */1 b/ y c( \/ R- x3 A9 _+ G" l; y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! i# _1 s2 n) q( Z7 T0 c0 _
( U( M0 {. u O! N8 k. v( n /* Enable Intermediate & Final transfer completion interrupt */% L; W1 [5 w1 `
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; }( ] Z3 U6 y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 I& G1 t8 a- e# C; z) B2 y# Y7 m% S) w
/* AB Sync Transfer Mode */( N4 p. c# \& B- B5 `" q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& x2 _7 D( w2 H: f- D* W
) H; S' @% z; U /* Program the source and dest addresses for master DMA channel */
* b9 g$ J9 h4 i3 O paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);8 \! J: O5 ~. v0 I. D
paramSet.destAddr = (uint32_t)(ping_buffer);
' q0 g2 ^' |& Y R O ~8 d
" Y5 T* @- S/ D) n7 B" k, P /* Write to the master DMA channel first. */) f3 [7 J8 O) M% t# Y' z6 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ J' K/ q( d5 G7 d }
2 C* u ]6 \2 h' y* K* t( K9 I* I% a2 y
1 x# [$ C. V1 g w result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 h8 Z" q, I1 |% \ ~% P
p2 X9 C) r2 ]- s if(result == EDMA3_DRV_SOK)
; O$ L6 Z1 @; T* d$ K1 W {
9 @# e8 t% D! H! k! T0 L print2arm("edma3 driver init success.",0);
+ d* D9 k$ ~" P } 5 T. |, \- r: f* K- ?
}% n% `* [' ?& J: q! I! I4 @
( v& ?: i! ~+ x( B' i% p) [- M
( I/ R. d( s4 G( C& U) i7 kEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* E, ?* r: K5 {
A% v2 s" g. h0 g; R% L
; x4 U/ l3 B5 e7 e; P; d8 W |
|