|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' H a# B# c! G; [# I U$ m' f0 _1 a4 `
#define PING_PONG_ACNT 1
7 t; ?7 ^7 K6 k3 `- K#define PING_PONG_BCNT 8*32*40 3 v- P S. `* k7 ~ ~
//#define PING_PONG_BCNT 1 7 F& H9 ^! A) O+ D' D
#define PING_PONG_CCNT 1
1 ]7 a% ~; n( |0 [- S" F) A% k/ l#define MCASP_BASEADDR 0x01D000007 Y# O: ~; J; H" E/ w
#define Mcasp_RXEVENTQUE (0u)( Z0 G! ]) ?3 b) A8 X- B$ y5 x) S
0 B5 i7 z& P$ }7 \1 P3 Y& m/* OPT Field specific defines */
( n) I$ g+ S' a% h9 Q- Y#define OPT_SYNCDIM_SHIFT (0x00000002u)
J1 o& g) R( l/ B#define OPT_TCC_MASK (0x0003F000u)% B1 P# Z1 \& A* @
#define OPT_TCC_SHIFT (0x0000000Cu)
( [3 f% Z; [9 Y Z' C' s0 T#define OPT_ITCINTEN_SHIFT (0x00000015u); Z' N1 V3 I: o+ R. O
#define OPT_TCINTEN_SHIFT (0x00000014u)
. r) k6 g) k# d6 o/ j2 `
u m% A2 J/ Z7 P' r: |0 e8 wchar ping_buffer[PING_PONG_BCNT];9 s6 H1 o, D* K: s7 ~6 ]! `6 D
char pong_buffer[PING_PONG_BCNT];4 B: G9 m# t" i$ V) K0 n$ D% x
0 E- S0 ~/ {% ~$ Q. q* r3 O
5 y! R m. p( ]) e" o( y) _
$ C7 I9 o. M S8 N5 K x' |
9 a3 k/ G! |/ d# x1 Mstatic void ys_edma3_init()
* _' m! \% u+ x$ u& B{, v# j0 c! c4 P5 V# |3 }
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& F: S" G f e' O EDMA3_DRV_Result result = EDMA3_DRV_SOK;) A' H# a4 L. N- a e, e7 v
EDMA3_DRV_Handle hEdma;
; a0 @2 M( s- x3 G. q# q uint32_t chId = 0;. |4 z! [/ h9 V
uint32_t tcc = 0;
. q& {$ r9 b$ }0 Q; V4 O9 u
0 v7 m e; h% k2 ^: [/ R print2arm("edma3 driver init...",0);
( }% Y5 B5 [# y3 a+ r1 q4 Z2 T: D) n3 k* l* L' j
hEdma = edma3init(0,&result);
3 f6 a- b) m0 N3 b( c O, J if(hEdma)
# X8 a$ T0 G4 Z" m/ b4 c. t {$ J, n4 H( m- a7 e
print2arm("edma3init() Passed.",0);
" }* l( N! x q$ c+ E7 h0 _0 s' P+ o }4 X' T$ D6 ~; z4 I4 h/ g) d; b9 j
else# ?+ i' A0 r9 y9 _* i
{
/ p$ V! L) E, q$ E5 b& R* t print2arm("edma3init() Failed.",0);8 ]8 w9 G8 W# W8 J2 Q
}( E; d/ B1 Z4 u- _# J
1 J2 }8 k, R$ x5 d1 M( r. s# u5 {
if (result == EDMA3_DRV_SOK)
4 W! M" M; P1 l. O# Q {
6 d" K/ @3 U) A, T* _, ~1 u5 f result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 b5 |# b' t i (EDMA3_RM_EventQueue)0,
3 u! o' @9 m" J% a/ v- R &edma3_isr, NULL);
& E2 N7 H; V& g, B) s( U }8 `8 t4 Y" p0 O U2 W6 j1 |; j+ B
/ X1 i/ S* O* \& y0 F if(result == EDMA3_DRV_SOK)" e/ ?2 N. l I. E( y+ v! B
{
( u1 D- |. d+ \# C$ O5 M1 h% D paramSet.srcBIdx = 0;
# i' G2 x! e$ _ paramSet.destBIdx = 1;
+ \: U8 v( N% m/ ^& v1 i paramSet.srcCIdx = 0;- S4 L. H* D8 I8 n' i
paramSet.destCIdx = 0;3 \' L* s9 T8 {, m
paramSet.aCnt = PING_PONG_ACNT;
! V6 ]. c1 q8 u' F paramSet.bCnt = PING_PONG_BCNT;1 b9 E8 m ?8 q$ v" ?. h% t A: ~
paramSet.cCnt = PING_PONG_CCNT;4 I% k7 V' I/ v) B \
& r! P2 N. s& H0 a* q
/* For AB-synchronized transfers, BCNTRLD is not used. */
; ?( C+ c4 R7 F- h& z# N2 @& y paramSet.bCntReload = PING_PONG_BCNT;4 H* R: |, J# T9 g/ i
9 k( H9 F2 P6 k4 t. \" T /* Src in constant mode Dest in INCR modes */
- E* a1 f7 d0 K7 y( V paramSet.opt &= 0xFFFFFFFDu;2 l1 `' S, Q! I/ P; |
//paramSet.opt &= 0xFFFFFFFCu;( h& K6 i, P' p; E* m, q$ [
' a3 |6 v7 d* F1 i; K! Q
/* Program the TCC */" \8 T# s9 l' ~5 F" @8 v2 X
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% m0 X/ Q: u& ?6 ^4 b' } ]3 z
- q1 V' F) x) @% D/ R /* Enable Intermediate & Final transfer completion interrupt */
' t3 Y3 r" [( U! Y/ p+ H4 j7 V paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" t9 G4 W* }6 c5 o5 j paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 i$ k# R6 E( ]$ F) G9 ?2 y9 O" b$ h4 i6 N( x5 X Q
/* AB Sync Transfer Mode */1 I1 @5 R4 b" T& U+ q% P
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 @) E% Y* P" l
* [5 L7 ` {6 P5 t! V /* Program the source and dest addresses for master DMA channel */
5 s# s* F7 h$ |- R" J Y0 X paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ F# b+ k- I8 b: H. z* k6 d
paramSet.destAddr = (uint32_t)(ping_buffer);; @8 N" u$ X- B F
; y5 o* z) z/ h+ ^4 Z% a
/* Write to the master DMA channel first. */) O* M" b, d% u) L. K* f' B
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" R5 J! q9 b/ E1 ~# H } 1 e( M1 q. Z, m: t" S& H
1 x+ `. {; {& l: o0 d) {; U result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% \' |6 b. i& I- W ' p" f: ?- E$ `3 V/ { m
if(result == EDMA3_DRV_SOK) 8 v" |* b1 w- u j9 G, V a
{7 `' `" G9 p! f- e+ z9 p, D
print2arm("edma3 driver init success.",0);6 \' D' o6 G' R a
}
9 C: T8 s k g0 E7 |8 w' H}
* O4 n0 L5 n5 ?, X P
+ r$ v# d0 L ^5 j1 z7 F/ h
, g8 \: N: f: _9 A2 YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( |7 ~0 N6 p8 O& F9 T
9 C* K5 u2 t% S* Z$ }9 l Q
4 \7 G/ t) \% k7 c) a |
|