|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! G2 D9 P7 I. Z0 h5 u! r6 h#define PING_PONG_ACNT 1
, Y& a, k1 M( h( V) l' f& X: h#define PING_PONG_BCNT 8*32*40 , B$ t' B8 F6 X- u! q5 B- j5 K
//#define PING_PONG_BCNT 1
* [8 V1 O0 O, ]. |4 O) x#define PING_PONG_CCNT 1
9 Y6 T y- Z9 g& ~3 V: e#define MCASP_BASEADDR 0x01D00000
: r& ~ v) A4 b* w' k#define Mcasp_RXEVENTQUE (0u)
3 b, [6 j) F& x5 f% }. T* f" d
2 I- }: D) b7 G" a# @) k5 f/* OPT Field specific defines */+ ?3 N3 y! l5 ~& t& B) ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 V9 y) |) V0 a& z' m$ }2 c#define OPT_TCC_MASK (0x0003F000u)9 b' X1 F" ?' g3 T1 ]
#define OPT_TCC_SHIFT (0x0000000Cu)) Z: a: _- o4 ?
#define OPT_ITCINTEN_SHIFT (0x00000015u), ^1 J1 Z9 T j4 h2 p) P
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 j" N% W% R: ?: I7 `& \+ O2 P: Q& J- L# A
char ping_buffer[PING_PONG_BCNT];4 P6 S1 R0 F' O$ b. _" z1 ~& R
char pong_buffer[PING_PONG_BCNT];
% W8 [' a6 N, l+ p# M0 h8 d* w% p2 Y
2 B6 u+ O! W1 V& N [ `* }5 o' Q% H3 f$ k$ x2 w1 \
2 Y8 v U9 B, Zstatic void ys_edma3_init()
3 u. `6 ]% | D5 \1 B{% i( C5 c$ O( A- D0 Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' f8 N. T0 v5 y% B' P, `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 U* D2 L @! k- x2 H EDMA3_DRV_Handle hEdma;. I8 I' R4 L8 g$ ?1 R
uint32_t chId = 0;
3 G G! f1 i% ? uint32_t tcc = 0;
# S, {- z' p8 U/ E* K& L
) H! e5 O. Y2 t H* f4 U4 N2 }+ @) h print2arm("edma3 driver init...",0); @# [, I& B/ e" I2 u
2 m7 M6 U4 i! V hEdma = edma3init(0,&result);
' f5 l: S. g, b% o2 Y% l' {6 y' ] if(hEdma)% Q- |1 ?; V& Y) D0 @1 |, t
{6 ]; j! \4 m4 Y( ^# P
print2arm("edma3init() Passed.",0);) y! I+ u- v# Q9 r, _# v
}
?0 l8 {6 ]+ g% c3 { else
' x: P( n; r$ A9 b' R% A: y" R {. w' c x5 e P5 G& G% ~5 w
print2arm("edma3init() Failed.",0);, H5 {# \1 ~+ V" C
}
9 W7 h' `- Y) W7 s$ e
# B3 j' s0 }* @( a b: v' I if (result == EDMA3_DRV_SOK)
7 k# W+ T+ i, I N- m {
- m: i6 [) v8 V* W, y result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ Z0 S+ E0 n/ j( p1 o (EDMA3_RM_EventQueue)0,
+ {# E3 e; x( `" Z" d& ?7 u &edma3_isr, NULL);9 N/ n! w- L) I% f. |: @! a- L
}
- _& p0 V% [9 u0 |; o5 N $ w0 P$ c$ J/ N ^+ C
if(result == EDMA3_DRV_SOK)
$ {7 _4 V0 U" @$ ]0 O {
# ~; z- R. S- d paramSet.srcBIdx = 0;
' }$ ^; ?/ D( X8 u+ h$ ^! n! N- P( E paramSet.destBIdx = 1;1 c( M2 `9 }) A5 v% `- G
paramSet.srcCIdx = 0;2 M0 L' ]# G4 {
paramSet.destCIdx = 0;. f h5 i: E% ]6 @2 S
paramSet.aCnt = PING_PONG_ACNT;- K1 O5 g% n! P w% ]1 y$ Z
paramSet.bCnt = PING_PONG_BCNT;# }7 d7 h$ i! }
paramSet.cCnt = PING_PONG_CCNT;4 A" v- j& A7 n( h0 b* S
1 H1 x5 w: p m3 n /* For AB-synchronized transfers, BCNTRLD is not used. */
; ~7 {' w- c0 P$ ]# L paramSet.bCntReload = PING_PONG_BCNT; _& V/ K/ C2 s6 U3 D! l! Y
( B% |; u/ \5 g! t. N. ]+ Z: o6 ` /* Src in constant mode Dest in INCR modes */
: V, j% q# t5 }) s. F. H7 E paramSet.opt &= 0xFFFFFFFDu;2 n" e( z% A% Z- F
//paramSet.opt &= 0xFFFFFFFCu;
8 D% v0 h# k$ A; {; z3 t : \: Z. R% s4 G) k' k4 ^3 l6 U$ h
/* Program the TCC */
8 d0 e* y! G2 L6 R$ ~ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 g) G( b) @+ b- t& U) h0 g* y) R
( v/ B/ ~5 @, B4 \6 N: } /* Enable Intermediate & Final transfer completion interrupt */3 N* w. B% F1 I- o& I& S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, V: n: {5 U+ C/ Q N4 J, P paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);6 m9 B. P3 a# U7 x1 S
" K1 b9 m& _" N6 X/ H6 l
/* AB Sync Transfer Mode */; G! h! U |, [: a: L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' |6 R# n# Q" P8 C
; E9 A7 \* v/ Z
/* Program the source and dest addresses for master DMA channel */
8 I L& B2 Q( A4 [; ]6 [6 ^ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);. I6 D3 B- L u3 V' w! \3 w/ D/ R8 [
paramSet.destAddr = (uint32_t)(ping_buffer);
! Y& L8 n. q, G0 Q& | n' c L2 s/ V% }. U$ \1 Q" ]" M, f, Y
/* Write to the master DMA channel first. */
3 }/ k0 g* n7 J& C$ b/ s+ H9 R result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);7 }! r4 ~$ R7 j) q# i
}
4 U, j0 i* u, W2 j. z3 W9 L6 Q8 n4 P: r! X3 E; A
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ A& K! M; y1 B
2 x, y+ L" S6 B9 `% k. I if(result == EDMA3_DRV_SOK)
6 Q* O, L h0 t# ~ a/ {9 x* m {
% L6 F' {: u" _5 J1 k print2arm("edma3 driver init success.",0);9 \! }% e1 p- W1 a+ e
} & K& f' @- R# e- l* ]. j) G! P
}
0 Y# p/ K* z# y, `1 a% j1 @8 y5 F1 M3 a m4 {7 ]$ T& {" B
& H# `! p' C" f$ U5 ~9 O1 c+ t' b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, i) ^7 Q1 l; N! ^ q! L7 l) h7 t
! n% x2 I6 H. e! E |
|