|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' P7 s0 {7 }2 V- A& [2 e
#define PING_PONG_ACNT 11 ?+ |' q1 d N: H1 G- _* t; D
#define PING_PONG_BCNT 8*32*40
4 t3 Z0 \9 Q& L. y5 G//#define PING_PONG_BCNT 1
6 v0 r0 y8 Q( Z! ~: x" G#define PING_PONG_CCNT 1, E0 h( o$ u, }: S7 o
#define MCASP_BASEADDR 0x01D00000/ S( O# u* w# A m
#define Mcasp_RXEVENTQUE (0u)
) s: x! G9 t( o, x! \$ h4 W" T( z/ R2 M6 _, o U! N$ i
/* OPT Field specific defines */
* h+ B' A' Q* t! Y g8 H9 ]#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 G7 o9 ~& N8 z+ s#define OPT_TCC_MASK (0x0003F000u)
' \" h0 l" k) i7 n. }#define OPT_TCC_SHIFT (0x0000000Cu)
0 F" m+ p$ C* f#define OPT_ITCINTEN_SHIFT (0x00000015u)- T8 D6 X' U- X, a* G
#define OPT_TCINTEN_SHIFT (0x00000014u)
2 I2 S# ^4 Q2 k3 E7 B1 C O8 c$ V7 t3 T; q
char ping_buffer[PING_PONG_BCNT];+ x- k- u: y& K+ R
char pong_buffer[PING_PONG_BCNT];: g( e1 b5 \, n; t O$ N
: Z" A. u" `* j! t, f7 }6 J$ ?
0 m7 Z& v1 y9 J4 m0 A; W6 r
7 k$ m# z/ o( r# W6 g3 h; c
5 M8 O/ k: g, ]( p7 X8 t* ]+ m( K* lstatic void ys_edma3_init()7 j& W4 S' \' o( d. p& @" n
{
* O1 v+ ~& }# Q; q! n' J EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- \! B* m+ q3 g/ G W0 V5 z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ x* J/ Q8 w$ y8 t+ y: f
EDMA3_DRV_Handle hEdma;5 H7 V) m) O2 X, z7 i2 k, L
uint32_t chId = 0;- E" ]$ p0 ^& Z: f
uint32_t tcc = 0;
+ Y8 @6 N) d# n0 |$ }# i* R7 E) @& o4 L3 j9 s% ]% v
print2arm("edma3 driver init...",0);
4 C: |1 Q q- b
0 Q" J& i# N: |- V hEdma = edma3init(0,&result);
! U6 @* ?$ F6 z# p if(hEdma)
. _6 s" M7 v& K7 w% z {
; x" T2 J7 v* k& t$ P print2arm("edma3init() Passed.",0);9 B5 K0 e9 G+ f
}
0 Q2 _4 t" R8 d0 F5 n else
1 h4 G! e" j6 _! W$ f) `+ M {; O) ] i* D, r: O; p4 X0 {
print2arm("edma3init() Failed.",0);5 z" Y' M. g+ L: f% `; H3 z
}
4 L7 ?% E$ r* e7 v* t4 c; p. D , Q) Z V- j! W; ^. v
if (result == EDMA3_DRV_SOK)
% @# p# f! i2 l& g+ s {* f/ S' I% z( v
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 M6 l6 u0 Z: |7 J7 O (EDMA3_RM_EventQueue)0,
7 n4 y4 W) J: d# d* j; E. T1 B6 @7 n &edma3_isr, NULL);& P6 t: H: w1 I) _; f1 ~ h6 ?
}
{& w7 v" t. g& R0 f( ?# Q* B
! X3 c8 u- G+ Y if(result == EDMA3_DRV_SOK)7 Y- e& ~, t, Z. A5 h- Y. l5 `( A
{) \0 u) D4 _& B9 D3 Y% v: O
paramSet.srcBIdx = 0;/ H. B r! f: t2 b) G8 J! g. o. t7 @( z
paramSet.destBIdx = 1;
; K, q1 U# n) z2 W' w. O; a paramSet.srcCIdx = 0;
. W* h. p8 ~1 ?; B+ l' b' i$ f paramSet.destCIdx = 0;" s* O8 r: O1 U- A: B7 p' |1 t
paramSet.aCnt = PING_PONG_ACNT;( ]7 q+ `* U( R9 U5 D5 o
paramSet.bCnt = PING_PONG_BCNT;- o' O, z, `1 U! @$ l' i
paramSet.cCnt = PING_PONG_CCNT;+ O* R% t+ k& I# p; Q; N
) j& w5 c* O1 L- n2 V
/* For AB-synchronized transfers, BCNTRLD is not used. */2 S& y5 W- ~9 u4 N
paramSet.bCntReload = PING_PONG_BCNT;
5 U+ ^+ g9 u+ k" g. y9 S4 b5 ^+ J* E# o) ^& n7 z/ L0 x0 _
/* Src in constant mode Dest in INCR modes */
5 g: Y" V5 z! D! `- ^2 \ paramSet.opt &= 0xFFFFFFFDu;
1 T5 j( c/ p% @2 P+ h //paramSet.opt &= 0xFFFFFFFCu;
# \4 }9 Q3 H5 `3 s& M5 Q7 {) B# S- A - I0 l6 Y" \, Y6 A% B- U( a
/* Program the TCC */. H6 W9 k. N3 g
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
X5 o& d" G0 a, B* w/ u5 p. I7 M$ X6 J0 |4 N# K' P% ?
/* Enable Intermediate & Final transfer completion interrupt */
- P; y- V/ A; p6 k! N paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 \7 Z6 P c2 ~0 a7 s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# N% W% w/ ]4 ~( u4 S% D4 [7 S* `6 V/ S `
/* AB Sync Transfer Mode */' K2 E, v9 X& W& y; u
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) H; s" ^9 ~+ j1 I' q- a3 [
! m5 S& |2 g) s$ |
/* Program the source and dest addresses for master DMA channel */! i+ w! q- y1 L7 P2 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( E9 S" y1 J2 E8 N/ ?: z paramSet.destAddr = (uint32_t)(ping_buffer);4 f! J* c6 k* g3 ?. b3 c
, R8 q0 L0 |( b( K9 ?4 c7 G /* Write to the master DMA channel first. */
$ K9 k- @, J; j$ I/ [ result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);4 f: H) d, @6 \+ y( P B
}
; i3 t& ~: \: I/ ^. e5 x
3 u2 S+ y0 F. S5 P9 O result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 u& K _3 p' m1 w" P
. M0 b. X7 E T3 L" Y, X
if(result == EDMA3_DRV_SOK) $ W6 p3 E6 V( j" B& w2 L+ z
{7 j( O/ q: w! l; ~
print2arm("edma3 driver init success.",0);
) ?1 v* ^. n5 m: H' u2 Z) r- `$ d: N }
: m {6 Q9 Z+ p9 v}
" X1 B) W( K4 F* j, d7 o6 X1 J$ _+ S: f# G4 a
1 ~0 o" \4 w7 P8 L2 SEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& R$ E3 U1 P. k0 h, V( }! |
6 ^! U4 L, i I- c2 V! @6 |" q: X; C3 ]) j4 t O5 J
|
|