|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 h- M" J! G" t0 S; F, @. U
#define PING_PONG_ACNT 1: G5 N; A7 Q. ]' |
#define PING_PONG_BCNT 8*32*40 + A, T. `# ` s. j* j
//#define PING_PONG_BCNT 1 5 o8 q8 E" i: l: y- {
#define PING_PONG_CCNT 1
/ r4 k( h4 L6 |" J2 P' t9 k, s! y. i#define MCASP_BASEADDR 0x01D00000
4 V1 t; h8 ~ q" u+ d0 o#define Mcasp_RXEVENTQUE (0u)
# I. K) B R7 ^+ G3 [* G* \5 i/ _3 G: e! x1 q% \. [
/* OPT Field specific defines */
2 n8 T# X1 g8 o- a4 x6 K: K( U#define OPT_SYNCDIM_SHIFT (0x00000002u)) K! K: \/ a, P; l& X6 w6 l- P$ P
#define OPT_TCC_MASK (0x0003F000u)
3 I- ?, y( F& q" W, F#define OPT_TCC_SHIFT (0x0000000Cu)
- @- y8 w/ x6 Y# G+ P0 E#define OPT_ITCINTEN_SHIFT (0x00000015u)6 |- D# Z; s3 \0 N
#define OPT_TCINTEN_SHIFT (0x00000014u)
! S( ?% ]& C0 W0 T+ J$ a
- H- k2 {! _$ F+ J5 z8 Q! Nchar ping_buffer[PING_PONG_BCNT];
* ?! [# H4 ^2 wchar pong_buffer[PING_PONG_BCNT];
# P5 j, L$ f9 ]; p, g+ {9 ^- o$ C; B. M
0 f( {( x h! @- W
_8 u/ `7 ?. n: z% b
0 p0 n5 x S' y% l6 Astatic void ys_edma3_init()
! w* K# B0 K! t. S{% L1 o/ L2 o; J
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
A6 i2 [ O2 W& a" c, Z. g EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! i, V8 f+ |+ Z$ c$ ]- ?1 S; @ EDMA3_DRV_Handle hEdma;. P5 k5 R( I* ]
uint32_t chId = 0;
, U: \7 Y [ X uint32_t tcc = 0;
1 I/ _) k/ k6 o2 E( O
3 b3 b: w. \/ I- j- u5 q7 J print2arm("edma3 driver init...",0);
2 ] v4 T- n! C6 x9 [& z9 l1 t
7 i9 |# T. i! B+ O* ] hEdma = edma3init(0,&result);
' Z6 U# K5 o0 X& y2 _5 m' r if(hEdma) Q) k2 N( ~" n- O' K* H
{+ V$ d# u" L# s$ L a+ ^8 b4 M+ [
print2arm("edma3init() Passed.",0);4 d( V8 l# E, r+ w) M1 S& M
}6 s3 V9 N2 O' l* u, d* z& e& s( u
else3 e* z0 D$ `; \' ]& n
{- r+ Z" L+ |, \& \, p, `: i/ S
print2arm("edma3init() Failed.",0);7 D. l7 ?1 ]) ]! W1 K4 ^) k
}( @. i& W$ o& o, F
* J- O y( M. j, C. a if (result == EDMA3_DRV_SOK)
# Y3 n- b8 H8 p9 y& m$ R {4 Z* X8 P( f) ~5 E
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; ^# j8 W: y K1 F
(EDMA3_RM_EventQueue)0,* }) Y% b+ J# n' C
&edma3_isr, NULL);3 Z) L! m: |* y! h2 J
}
, Z, M( M# C$ B' c" p& ]9 y . \7 Y* R: j# o9 r a9 r+ n* Z
if(result == EDMA3_DRV_SOK)( ?; i C: ^. p3 H9 I& G4 @
{
, ^) F7 L" x' t+ C! X paramSet.srcBIdx = 0;
( O9 F8 l0 h1 ?$ s paramSet.destBIdx = 1;
5 v8 F* N' K' i G# j1 h Q7 R paramSet.srcCIdx = 0;
) Z' \5 L2 I4 J3 a% n+ R% p paramSet.destCIdx = 0;' u1 |; N; T/ ~$ V9 ]; `+ d' m
paramSet.aCnt = PING_PONG_ACNT;
: V3 S8 b2 [( w: j paramSet.bCnt = PING_PONG_BCNT;
( S) v, _/ N5 W& h9 D paramSet.cCnt = PING_PONG_CCNT;! I$ S* U, I) v& Y) a9 |" _6 w
9 q% k) e: t7 W; l( J" Q, u
/* For AB-synchronized transfers, BCNTRLD is not used. */
) a; A: n2 c$ M; X7 y! I1 \ paramSet.bCntReload = PING_PONG_BCNT;+ @9 ~. ~3 }4 N. ?# k
9 a5 n+ W7 S2 j3 Z* P& R7 D5 `( h /* Src in constant mode Dest in INCR modes */
+ d' D3 T: v# m, P& [ paramSet.opt &= 0xFFFFFFFDu;" n& `4 X1 \3 k( w
//paramSet.opt &= 0xFFFFFFFCu;
! S( a7 v: S9 E- U# ]( p1 x 5 M$ ~# D4 L) }: p+ L4 _8 j
/* Program the TCC */
, z' b x0 p+ a( x. _8 y paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# `' B7 q; ]' ~) Z0 q0 h: C9 F0 {
T. Q \! s4 {# l
/* Enable Intermediate & Final transfer completion interrupt */+ T f$ i) e+ M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 R+ ~& J9 c+ R1 {3 T7 Q paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- E: z) c+ n# Q0 v: `
: k/ I9 U; \& n: j& p# D. ` /* AB Sync Transfer Mode */
0 y3 s1 o; D4 d2 H2 S" h paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ {: F& ~8 Q5 ^' H2 f
3 h9 k" @! k$ B, c /* Program the source and dest addresses for master DMA channel */
0 e) X2 X( r$ m/ f# _: n paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% b- Y$ x- L4 I) n5 u paramSet.destAddr = (uint32_t)(ping_buffer);; M. B" A# _- C' e
* b( L" P8 ?' J& i /* Write to the master DMA channel first. */& c4 }! o6 m. L; h0 }% \7 L* H
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" m- R7 g Q2 e7 q% m( \
} * @3 S" A* D$ r3 @6 o: ^& W
% E! s' u, b4 E' g# |6 W5 S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% i4 y2 O- Y# _" M9 b6 z j* F
, [: `0 p R \# s if(result == EDMA3_DRV_SOK)
2 C# C. x6 G' h- K3 q {
5 W, f; O. s. l print2arm("edma3 driver init success.",0);
9 s% j9 H! X/ O+ x, ?& | }
; Q" U* J( Q- Z, U. o- ?}/ S' x. I. j% t. l& o- J/ E# B
. T9 `* a# I/ J$ R) ~. B3 Z; `' k2 R$ Y2 H3 e! p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: Q5 j( w: T0 l7 h! l% s5 l! K3 q) F# e) U+ u; h0 e3 g
. C+ G& n ~9 i' V. x5 w/ _
|
|