|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* y, o, D' d; h5 t#define PING_PONG_ACNT 1
- X1 \$ T7 c8 M) {( m5 t4 e* \7 s#define PING_PONG_BCNT 8*32*40
( e- o2 [' @" C. r7 n: k//#define PING_PONG_BCNT 1 6 [5 Y) Z Q* [
#define PING_PONG_CCNT 10 S$ m5 W, A; }) P4 q4 a: E
#define MCASP_BASEADDR 0x01D00000
: U. ]4 i8 v0 E# }#define Mcasp_RXEVENTQUE (0u), c# T" X+ z; u* w; I
& v& X0 `5 {2 b* e
/* OPT Field specific defines */
0 Q$ p! c3 q9 L/ F#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 t' \- l4 f) d) G. o' Y6 H6 K2 V1 X#define OPT_TCC_MASK (0x0003F000u), O" q" |) x# M( C
#define OPT_TCC_SHIFT (0x0000000Cu)
4 L2 s `. g- Y! C4 o#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 O6 T: i& |0 V1 b |1 J. x' j#define OPT_TCINTEN_SHIFT (0x00000014u)% s7 H2 k' ]/ p
: _8 G$ q# J# ?2 Jchar ping_buffer[PING_PONG_BCNT];7 y! L: m5 }: j
char pong_buffer[PING_PONG_BCNT];! e8 S* C. ]( Q( C7 ~) V
# u5 ^, p; {2 b/ Z5 I% t
0 o# M5 n9 ^" p8 C2 f- S& H4 T3 T l7 p/ `3 B( t" ^5 o, y
# E) P( E( B7 C6 X H$ ^
static void ys_edma3_init()) A( } F9 X1 @% E
{8 E9 |% W- G% s5 L: e8 h
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 [" Z% ^9 D" I/ @ EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- g- w8 F! J* f# z EDMA3_DRV_Handle hEdma;+ C8 s9 G" w1 ^' X5 h# m
uint32_t chId = 0;' O# ^: o5 i. C3 l% }9 J, R( m
uint32_t tcc = 0;1 I9 z$ {* _ }7 @0 i
/ |" {- Z: r* ~) ~
print2arm("edma3 driver init...",0);! K% S6 {7 z- _& j
. T1 {" R2 E% D* A' J. m& W6 u
hEdma = edma3init(0,&result);
' f! K! d c7 n1 b7 B) V a if(hEdma)
0 m& B# s: _* s! d% k {
3 o2 F& }- P, P# u0 S0 T7 E9 Y print2arm("edma3init() Passed.",0);
$ t9 p; s# Y) t! J* H. ]6 ]) ~. q }" p. m& @4 y E+ M5 q! x$ p U# L7 e: Y
else c9 l. u* W" M4 D/ s" k
{6 ~7 _+ ^& f( C/ I6 U& e
print2arm("edma3init() Failed.",0);0 @+ k# V, e& r( X7 k
}
) r! x2 J3 L; C4 p, [/ X0 R4 T 0 I d2 [! Y/ d5 A8 E
if (result == EDMA3_DRV_SOK)/ V+ }( h& M% k" c# i; U
{4 W- t3 V* [; p, m% p; A) V
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* f% D/ m" a! G9 n+ V
(EDMA3_RM_EventQueue)0,
: X" V9 r p2 I. y+ R8 P &edma3_isr, NULL);- n3 U8 |* H2 g2 l# U9 v" ~3 L
}
8 w. w& n& i7 s# a - a( r6 h/ W# L! R) ?
if(result == EDMA3_DRV_SOK)% Q; B2 O0 }, _3 E- B
{/ r. _( @7 e2 Q0 j0 } \
paramSet.srcBIdx = 0;
. k3 a. b u: u# s6 B' ?; l) N5 Y paramSet.destBIdx = 1;
% ?5 K- t+ x% r1 T; H paramSet.srcCIdx = 0;
' U) X; A" p/ N7 R7 [& X/ C paramSet.destCIdx = 0;: J9 g: `. M5 B# u( A5 `
paramSet.aCnt = PING_PONG_ACNT;$ s( t+ B6 X; z, y3 m( U6 r
paramSet.bCnt = PING_PONG_BCNT;% Y- ^& k" r- b2 u( k" q
paramSet.cCnt = PING_PONG_CCNT;
5 f9 }/ s' {( A3 z$ V8 |
: t; H* @* g. _# y0 m3 X O$ M /* For AB-synchronized transfers, BCNTRLD is not used. */
4 M) C7 w* X* M% S1 X7 O paramSet.bCntReload = PING_PONG_BCNT;
z) z' i5 f" ?+ |1 R/ F, i# _ k& T9 F& m- ]: E$ w1 {& w
/* Src in constant mode Dest in INCR modes *// M- \2 u; ]( r! L
paramSet.opt &= 0xFFFFFFFDu;3 e) T9 z: f' x1 I/ x5 F/ |
//paramSet.opt &= 0xFFFFFFFCu;: _* y; g% \0 m; |# ?/ O
) \5 ~' i9 A' c, M0 d5 O /* Program the TCC */$ I9 W% |1 v6 c% a
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( l0 G. n4 |4 f3 h$ w: J2 D4 D% e6 \, Z0 q8 K
/* Enable Intermediate & Final transfer completion interrupt */
( R* }' G' D; |- ] paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 ~$ P$ E, m9 T* J paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' _* ~' r% |2 b: A8 N9 X1 r3 D
- l6 `7 d- R7 N9 [+ w( u" ?
/* AB Sync Transfer Mode */" h0 }" ~# d( u- m! A, q9 l0 O
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" r' j9 F2 F* ~& [7 Z
$ G+ ]' K/ [8 i: k0 ^ /* Program the source and dest addresses for master DMA channel */
+ O o+ t8 U; L S- \' K( C9 j+ T paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);% Y/ U! b8 p$ H
paramSet.destAddr = (uint32_t)(ping_buffer);- X( ~8 i3 X! ]/ I: @
' I% q4 }+ g4 W
/* Write to the master DMA channel first. */' B+ N/ G9 j: G% } _+ G
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
0 D5 B* f. S" T; V, E }
$ c9 D5 C% f3 \) Z* F5 [" I- W# ]$ `( Z# r6 ?% o
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);* K0 p: G% D3 |0 s+ {7 s% B
0 ]5 U, m( H! V( p: p! o if(result == EDMA3_DRV_SOK)
2 h$ u3 Z" j, I, C7 o9 d {
9 U8 ]8 z' l0 H# N print2arm("edma3 driver init success.",0);
% h% X# U( U4 Z) R# T }
, ] A0 H& _6 Q I3 d p* {}
8 k }3 t3 h! ]3 I
' ?1 M& |4 O0 m; M+ I3 l# d# O. g: w" r; @% C _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。2 V4 y% s7 C9 J9 }9 n3 P
' K4 G8 {/ |/ U5 A' c% |1 p
) D5 E1 d5 K- y t7 R4 f0 ]+ Y$ ^7 D |
|