|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( N. K8 b3 |$ I3 `
#define PING_PONG_ACNT 1; a5 U0 `6 U8 i, L+ z. c
#define PING_PONG_BCNT 8*32*40 % z2 ], C$ @# w) B0 y7 D' I
//#define PING_PONG_BCNT 1 & _. V3 V# b7 j5 @" S
#define PING_PONG_CCNT 1
9 G* o7 g; q1 u1 d#define MCASP_BASEADDR 0x01D00000& C! ?% W) l% _- i& ?& B( R' Y
#define Mcasp_RXEVENTQUE (0u)
$ _1 ?* o( p6 w1 p4 p; ]3 c8 O1 W2 o% ]' A$ n. {! j
/* OPT Field specific defines */; T- R& M m' K
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, k" r3 ~0 v" A7 j( r" i#define OPT_TCC_MASK (0x0003F000u)
2 ]& `3 Z, t) M$ S8 g7 n1 j4 ^#define OPT_TCC_SHIFT (0x0000000Cu)
K. W" W4 [+ t( b#define OPT_ITCINTEN_SHIFT (0x00000015u)
* `* \9 f) h" p2 ]#define OPT_TCINTEN_SHIFT (0x00000014u)- p N) b$ F/ X, {% P6 u+ [
+ L0 @# P4 T2 N# Vchar ping_buffer[PING_PONG_BCNT];
* X# R" z W6 P+ L- bchar pong_buffer[PING_PONG_BCNT];
" z2 K+ @' |' _( K
+ [, E/ H, X8 x9 Y5 b5 D, Z! y A$ S9 E# s
! L) x# s' |5 n2 u* u' y; V: e* c$ Z1 y' e
static void ys_edma3_init()! ^/ _9 c, Y2 K# g
{
0 o1 T) w8 O: `3 P" ?& t% \ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 D4 J; O" Z. V
EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 G, U) Q6 e% b6 u) x* o
EDMA3_DRV_Handle hEdma;
- u# b. q6 }& D1 H, ]: p8 T* z: z6 R uint32_t chId = 0;/ \' ]+ G' o7 M6 ^/ k# Q& O" a
uint32_t tcc = 0;/ }; z- p+ u; ?
$ R% E; L; q$ ?, g- W( s print2arm("edma3 driver init...",0);
0 O7 [* l6 X N" z" _% v8 l! `0 n4 s, q+ y2 n! ~
hEdma = edma3init(0,&result);
4 j. @) v. D) M' S$ n U m# p# g if(hEdma) J8 i6 q) r. Z o: B7 P8 }
{4 T7 \ K9 y- f
print2arm("edma3init() Passed.",0);8 X2 l1 s9 k# m5 d/ c) V
}
1 M. z* B: W8 k* h0 k. I9 ~1 P: e else6 Y( X. g' Y3 X6 l: z
{: {3 s1 q& X0 A' _; K4 {. N, `+ n
print2arm("edma3init() Failed.",0);
9 G5 N6 l& ^$ q) R' |3 m }
' h( K7 h J P) d, F
4 d! }$ m8 R2 y* h" C6 r if (result == EDMA3_DRV_SOK)
L. Y0 L. h- O/ A {
. I6 ^6 m* L) ]% U& b3 U6 \ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ E( g z( i+ U* c9 b. c (EDMA3_RM_EventQueue)0,0 B6 [' ?! `" a1 Q
&edma3_isr, NULL);
1 d# T* p1 ]6 B6 N% v- i, T) T2 u }
$ ^; k5 j) }! A ' z% i' M/ |+ @& I" u4 c$ A
if(result == EDMA3_DRV_SOK)
, w X. F- y3 N& f {) G/ r! a2 G) L
paramSet.srcBIdx = 0;" T5 A h$ |6 {9 G3 z
paramSet.destBIdx = 1;
4 B1 d( ^7 O3 e2 m1 } G2 R& J paramSet.srcCIdx = 0;4 c- X) R0 {$ G+ e4 s3 s
paramSet.destCIdx = 0;
) R* m- d' a& t3 t) S0 p5 F: } paramSet.aCnt = PING_PONG_ACNT;
0 q1 Q# `% `1 U paramSet.bCnt = PING_PONG_BCNT;
- ]- J& S6 Q, {3 g) c# C: r6 K paramSet.cCnt = PING_PONG_CCNT;
) x! z' ]) k$ @ U+ h' o
$ O' r- K4 u5 A- I X /* For AB-synchronized transfers, BCNTRLD is not used. */1 A: T$ a1 j6 Z, K8 T
paramSet.bCntReload = PING_PONG_BCNT;
e+ f$ T8 {$ t9 m" S. Y- R3 c6 ?
/* Src in constant mode Dest in INCR modes */9 |. U2 }+ R( Q1 e1 H7 T
paramSet.opt &= 0xFFFFFFFDu;
: E) ]3 G9 h. B6 H$ W1 Y- Q //paramSet.opt &= 0xFFFFFFFCu;
0 v9 b+ |; o$ c' \, o ; q% |2 e) J- w M, _
/* Program the TCC */4 w# d9 F' m- g/ ]3 D4 D# X
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ P1 G' J2 V& W
+ k" _4 }( t3 p. g /* Enable Intermediate & Final transfer completion interrupt */" w4 Q. `( f- c( v% C
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ \6 X) T% [' ^2 T6 O9 U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% a+ j f0 n1 K+ c: o9 y0 v5 p2 e3 X6 Z+ E/ R. _) v# X
/* AB Sync Transfer Mode */. W, s/ d; m, ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 p6 E) N( |' {1 Y" B8 o
8 u- A5 g ~; R" ~
/* Program the source and dest addresses for master DMA channel */
4 |0 e. ?& D" B a2 N paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);. X$ }2 Q9 S# _; s% ]5 j
paramSet.destAddr = (uint32_t)(ping_buffer);' }6 ]" ^8 b9 Q1 Z" ~8 D
* f) E O5 w8 P0 L9 z+ U: c /* Write to the master DMA channel first. */' w. r; e5 U' V5 r+ t* B* z' V! ]2 C
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 x3 D' s% m9 ?* i7 a/ [ } G. E6 t0 S2 h2 R/ F; d$ A! A$ {7 V
" V' m. X3 _+ ~* l% u result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 P# s- V* t O, Q) Z7 M
5 B* \+ B# J. u9 ~( C' |6 i9 ^ if(result == EDMA3_DRV_SOK) & g; f1 y/ n5 B
{5 N& J" h) [7 S1 P, R
print2arm("edma3 driver init success.",0);' N' s1 \2 H9 |4 q; E
} 6 G9 [2 z" U' v3 p {. ^: H
}. P8 U/ _" H+ r1 e1 {8 Q: M
( t, E6 O; ]( H# Z0 L7 H
; _; `; I# a5 GEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 @0 D/ ^; z5 m9 A: p
3 m4 G6 ]( ~( u/ q# y8 `' s/ y7 w/ y
|
|