|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: K4 o" T7 R# _/ U7 v& b
#define PING_PONG_ACNT 1( b f/ x4 G) U) }7 ~* c3 T( e @9 j
#define PING_PONG_BCNT 8*32*40
$ v% S+ v! P6 z: c//#define PING_PONG_BCNT 1
) Y9 g$ m4 _1 Y$ } d7 ~#define PING_PONG_CCNT 1
0 a" k' j$ h1 e( C5 n#define MCASP_BASEADDR 0x01D00000' F v/ ^, H5 v2 w6 \# w
#define Mcasp_RXEVENTQUE (0u): l, E: U( c( \' \ l
* N+ z( E# v, \7 u2 P& E v, j
/* OPT Field specific defines */
. \' w. T1 L) L3 D; d9 w& U6 s#define OPT_SYNCDIM_SHIFT (0x00000002u)/ f& i6 l# B7 Y4 R
#define OPT_TCC_MASK (0x0003F000u)5 a! \. w' ~/ |8 b1 d
#define OPT_TCC_SHIFT (0x0000000Cu)
1 g* O3 ?' G6 p+ _3 a* G$ z#define OPT_ITCINTEN_SHIFT (0x00000015u)
: n6 f2 M, U) v9 X- L#define OPT_TCINTEN_SHIFT (0x00000014u), x( e# {, ]8 p, T \
4 [1 U% Q7 {3 zchar ping_buffer[PING_PONG_BCNT];
6 W; q% ]+ f5 ^6 H' s% E" _char pong_buffer[PING_PONG_BCNT];
' i' E/ X+ S7 ~. p
/ s" Q% v, S3 \6 e, e5 n
# G5 v! Z( u# f0 T8 i& ]$ A
$ M9 w$ ^6 v3 D7 }( H' U, I' [9 M$ c2 z
static void ys_edma3_init()
" C( ]0 ]! {: R" p% m5 ?3 R{+ p$ f2 s2 ?! N3 M! d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% Y4 E9 B4 B6 r) T& g1 }8 ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ z0 @5 V( r! r4 G% X$ `- Z EDMA3_DRV_Handle hEdma;7 W2 D& ~( d3 `0 J
uint32_t chId = 0;+ ^% ?7 m0 w1 C$ U
uint32_t tcc = 0;
# L/ E$ n1 C+ ]
& n. ~6 e* _8 ?- p+ I1 E9 H print2arm("edma3 driver init...",0);3 T/ l4 e8 w# J8 [* F8 Y0 p
2 B5 D3 K9 {9 d7 N" |* }% L- u
hEdma = edma3init(0,&result);8 F1 ^7 D; D9 m
if(hEdma)' k7 P' d5 M3 T- I( u# m7 z
{' S' N$ h1 E6 j. g. `
print2arm("edma3init() Passed.",0);
# Q) X* m9 W# k }8 k9 K! s+ Y1 e2 [2 d3 n) g
else; }* R$ A9 B7 J! e1 }
{
5 [+ c" H( O) V% z1 N( f K print2arm("edma3init() Failed.",0);
; _# Z8 `6 z5 f. R7 O, o$ l }1 j; k$ h+ N- Z3 Z% g- a' A
8 O, |7 |5 G$ |! [3 x& ^2 O" A if (result == EDMA3_DRV_SOK)/ F- X ~% {1 F% {4 R& t1 P
{
5 G, ^0 `- I$ v( u result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
# Z9 v: x; C: e8 b" y$ S P (EDMA3_RM_EventQueue)0,+ W( d, b1 q* ^; F0 b
&edma3_isr, NULL);
+ ]: i1 t4 S# J* X7 }0 T3 } }
2 [1 U( t. b7 A0 a( E 0 S/ r/ S9 b8 O+ B( N4 |5 ]' i, x6 ^
if(result == EDMA3_DRV_SOK)# q4 f: \" A g
{8 {' }+ x9 G }+ A
paramSet.srcBIdx = 0;
7 V/ {- _! V" s- a- k paramSet.destBIdx = 1;
, @% r k. J. i- |4 l* r/ E+ h& B paramSet.srcCIdx = 0;
/ i7 g% K8 N4 J* Q paramSet.destCIdx = 0;4 x5 `: z L& a' T8 j7 P2 a
paramSet.aCnt = PING_PONG_ACNT;
; h5 Q, v: A! z6 f. ~ paramSet.bCnt = PING_PONG_BCNT;7 d O- ?; S( P5 R$ m; U
paramSet.cCnt = PING_PONG_CCNT;+ u v7 w4 x; [8 s7 H( C8 |! n
. n! H9 i8 [9 q* Z
/* For AB-synchronized transfers, BCNTRLD is not used. */- u$ Q! P. |2 T0 A) b
paramSet.bCntReload = PING_PONG_BCNT;& t% \9 y; \3 B
+ B+ g3 Z% d) X4 [3 ~: | /* Src in constant mode Dest in INCR modes */: e' b$ ?/ W1 Z- S: x
paramSet.opt &= 0xFFFFFFFDu;
) K0 k1 Q6 f4 y3 `( |* P8 M: s //paramSet.opt &= 0xFFFFFFFCu;
5 ^1 R! z0 P" [# m( u7 P% J 8 X9 F0 f5 L5 p( h) N
/* Program the TCC */
6 d- Q: ~! ~: y3 u paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. K; H6 ^+ Z5 y3 Y. x7 h
5 o0 d7 S( U9 n
/* Enable Intermediate & Final transfer completion interrupt */ Y) ?2 u; J r- E
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! L- r2 Y7 I+ c! l4 i paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 Q7 D9 J5 ~& K3 H. k
6 E5 Y" e8 y0 f2 }: | /* AB Sync Transfer Mode */
, V+ A( o6 e/ e8 [) q paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 P0 i; W" y9 W r$ r) B, i) M : N+ j8 u/ j, u. M
/* Program the source and dest addresses for master DMA channel */. y8 m2 p ?: y% G
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, R5 V' M6 k2 \) B2 \: m3 ~ paramSet.destAddr = (uint32_t)(ping_buffer);9 j8 L* D, _8 f, Z. D3 f2 A
3 f9 x/ l" H- }, }/ N0 w4 | /* Write to the master DMA channel first. */
% S4 [9 Z% n8 w result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);1 U+ k1 b! b3 [2 I% q
}
$ l9 o/ N. {. a* o' a. Z3 q. k4 Z4 f. y3 d; B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# @3 R3 J7 z. R5 Y2 [! h; `
, D }8 Y7 U" ?+ z) {
if(result == EDMA3_DRV_SOK) 2 V/ @) @9 L0 ^- a+ y; l
{
. J2 R, s; N$ x0 l print2arm("edma3 driver init success.",0);
# q- q8 d3 ?3 p5 F/ ^9 t }
' w& ] J+ ]! v# T+ T I& `}7 |: B/ G! p" p# p9 R( _4 a9 A
; {, \" S4 n' ^4 ~, ~* h- Q, w# |
! }5 K* N$ Z. v- l7 N9 J- g6 o4 lEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 a! M& |" R* W( J5 ~7 d4 a% Y4 T0 l) i# p) ?7 ~* w+ X
* m' a/ q5 n2 L& [: k5 Z$ Q' ~
|
|