|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. U2 W. Z! D4 v3 L1 \* Y
#define PING_PONG_ACNT 1# o1 Z G; u7 d. b
#define PING_PONG_BCNT 8*32*40 ; e" [1 u3 e9 o y7 r4 N4 _
//#define PING_PONG_BCNT 1
' E7 o$ B( G; A8 v8 B#define PING_PONG_CCNT 1! q+ a w4 W4 g( N5 H* h" ^( f' q
#define MCASP_BASEADDR 0x01D00000
, d7 D) {6 t- _- _. L( F% s#define Mcasp_RXEVENTQUE (0u)- @( Q: \! X' k2 j7 M+ ]# C
- y6 v3 w' q+ q p
/* OPT Field specific defines */
0 l- X/ I( `8 ^" d: o#define OPT_SYNCDIM_SHIFT (0x00000002u)- O) ?: j8 Q- f) N$ H$ p& j. F
#define OPT_TCC_MASK (0x0003F000u)- I# B. `+ B7 p+ N( k7 z: a
#define OPT_TCC_SHIFT (0x0000000Cu)+ }* S; m9 T$ q: ]; E' V! u
#define OPT_ITCINTEN_SHIFT (0x00000015u)" t Q- G% ]7 L
#define OPT_TCINTEN_SHIFT (0x00000014u)' s; v H: J- e' l3 Q
" ?, ?6 M% G) Y# L, \3 V( s; V$ h
char ping_buffer[PING_PONG_BCNT];
: X v/ P9 W P) L& tchar pong_buffer[PING_PONG_BCNT];
- q9 G m/ ^5 R1 }5 A
5 q. K: X7 g: D
6 t; S. K. d9 f/ }$ R9 |3 N0 W9 \% N# a2 s( o
" U. X: t0 W, J" Q
static void ys_edma3_init()' A; J$ U* g7 i: X
{
- Z1 c& N/ y6 ~ d4 g EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, G$ v$ q2 f$ J; W1 V- l
EDMA3_DRV_Result result = EDMA3_DRV_SOK;) d8 L3 n' \* A. n! Y+ k, y0 b
EDMA3_DRV_Handle hEdma;
$ [( y# D2 H$ [ B) m% p uint32_t chId = 0;6 |# R% K4 y: n3 L0 X5 c
uint32_t tcc = 0;5 W! u: z Z2 o( W& ]$ i: b/ h
5 I; D$ B; [' X
print2arm("edma3 driver init...",0);
/ n6 P- Z N# e! J7 G
% f3 X/ `% }; g0 [0 @ hEdma = edma3init(0,&result);
4 u7 F) A0 h, S% P& m9 k- p; @+ W if(hEdma)
0 i2 z! _ o [% V' W- x( \* \* F {* a8 A8 Y: R1 g( y) _
print2arm("edma3init() Passed.",0);& Z, Q; B% x( S$ k
}) t* r4 N4 N8 x: _ o
else8 H# y/ v% H, C" S9 I
{$ i" E! L& l7 J& t3 ~
print2arm("edma3init() Failed.",0);
! l( a; Y4 F5 C* v$ l; G8 R" m }& R0 X8 s" m8 X/ y
" _' a2 J. K8 [, h+ |* P. f if (result == EDMA3_DRV_SOK)
. _ C2 W* J- e! e9 m {
( u0 X+ R- W( Z8 r7 w( f+ P0 U: T7 u result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ _, Z+ L) g; `
(EDMA3_RM_EventQueue)0,7 e# H4 A7 t3 z! S- Z3 B/ ~
&edma3_isr, NULL);5 C$ x% R8 S$ c) O* t1 s9 P; u/ F- _
}
1 a+ E; \' f$ R3 W
) Q! L% D) {7 [$ Q7 q if(result == EDMA3_DRV_SOK), F6 M: k) B' T! Z2 y/ z
{# m @) X; P/ U' f6 p# u: |4 Y) Y- l
paramSet.srcBIdx = 0;3 `2 q# l) p+ G# x5 g; K" p/ t
paramSet.destBIdx = 1;
7 E o( i0 v* G J' ]( y0 K3 P* z paramSet.srcCIdx = 0;( Z; V( `4 v1 i" s# m+ {
paramSet.destCIdx = 0; ^( `' S7 w. p, i! t4 B' N
paramSet.aCnt = PING_PONG_ACNT;' d b8 D2 S$ B2 K9 o9 R4 ]" q
paramSet.bCnt = PING_PONG_BCNT;
( e& w6 q4 @/ |' v, a4 N paramSet.cCnt = PING_PONG_CCNT;& T7 g; i+ R6 B1 f
1 K/ [ f9 X* \' Q6 Q
/* For AB-synchronized transfers, BCNTRLD is not used. */4 T$ J# u2 t, ^) R8 f y
paramSet.bCntReload = PING_PONG_BCNT;5 e0 `$ \' I. P# U! r4 L6 z
1 F+ f6 G, j+ ~
/* Src in constant mode Dest in INCR modes *// `+ I4 M0 m) H
paramSet.opt &= 0xFFFFFFFDu;
) F/ N$ P/ s3 w //paramSet.opt &= 0xFFFFFFFCu;
% f X0 K# q3 N( W0 D [$ s* e- E8 f 3 c5 `& T( _0 K* d
/* Program the TCC */5 h6 g4 q3 k1 i
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) t' e% X+ f# b
+ T3 b; U: ^! G/ s" c- n% ^/ x /* Enable Intermediate & Final transfer completion interrupt */
3 V' p% Z% t0 E$ b3 A9 Z! S paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 U9 F4 C8 y3 [" B6 K" C# J+ n paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. G9 f# w6 z ~9 `
: }) s0 m( l4 M6 X /* AB Sync Transfer Mode */0 V# E& @- S* |& F j: p, ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) u4 B6 D8 S( Q# w" o; A
* G0 F& Y) _2 @9 q /* Program the source and dest addresses for master DMA channel */5 b; |/ A, ^5 K9 _" [7 v4 T8 ^- v, J
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; k% q8 f S9 a paramSet.destAddr = (uint32_t)(ping_buffer);2 G* S; p7 Q: D# x$ w$ R) d
. `, V. q* |7 u- R4 E
/* Write to the master DMA channel first. */3 U" b6 |# \+ C% s: F8 e- N5 V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);& B6 z5 ~% t: Y, `) Y8 X* R1 R
}
* `% w5 v- }6 n0 T/ U, V1 E, ~5 v+ o! Z# [4 r3 N% ~2 a4 O
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: o8 Y |& m* `1 d
/ k' x" r0 ^9 l4 I' H if(result == EDMA3_DRV_SOK)
) a! D$ L) z5 X& \) T$ [ {
0 x2 g( i# [0 b8 L print2arm("edma3 driver init success.",0);
# O% ^- w1 o' I) _# k }
2 I% G( M3 o$ R3 d& H}
$ P9 f3 V, K, @; |, o' U
2 g% G) e; x! m& o9 X
+ @5 Y/ h+ H9 W8 ^0 R: vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% g; j# v/ X7 r! i8 `7 D& p, y: @1 J% S
5 `+ h5 o) |9 I8 V
|
|