|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( d. O( ?2 Z/ @* Y) O' G) x#define PING_PONG_ACNT 1
% p1 ]- S: s: C- q$ e$ P#define PING_PONG_BCNT 8*32*40
$ ` v7 S- Q- Y1 D+ `3 x# ~//#define PING_PONG_BCNT 1
' Y2 @; ?# z4 a3 g4 P( A, O: s4 j1 F#define PING_PONG_CCNT 14 q( n0 k; v- ^# V+ p
#define MCASP_BASEADDR 0x01D000006 N6 a) [9 O4 C3 o
#define Mcasp_RXEVENTQUE (0u)4 @6 d% O( _3 K# j
v6 e5 [+ i) m1 ^1 ~
/* OPT Field specific defines */
2 T$ ?4 L6 y% W/ _#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 t, `0 j4 Z, E) |+ h#define OPT_TCC_MASK (0x0003F000u)
/ B4 ~; F! _* _. u2 U- Q#define OPT_TCC_SHIFT (0x0000000Cu)% s1 C8 e# ~; j3 X q7 @. [4 g. w
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# p) j; q2 k* D) L, N6 k#define OPT_TCINTEN_SHIFT (0x00000014u). r3 ?* P; W# g
) o# @7 A6 O3 _; v Q# X
char ping_buffer[PING_PONG_BCNT];
0 p, _1 G' b2 M( i2 ^3 [% `char pong_buffer[PING_PONG_BCNT];7 a! }5 K0 t. _, y5 W- M; v% U0 v
: k9 t6 @7 Z+ j! a$ `0 \* I* R9 i6 L5 c
M: B( R( m% H8 k+ B" r2 [
4 q9 M/ J) R/ a6 E i( Cstatic void ys_edma3_init()* L. A) y8 m7 r/ h
{2 i" U. x7 l' C Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 f+ o! `4 d: M EDMA3_DRV_Result result = EDMA3_DRV_SOK;, A3 U. U# o2 y8 Q+ ~- p
EDMA3_DRV_Handle hEdma;
! k2 a; H/ |: s0 D6 P uint32_t chId = 0;
% S; F- J6 W3 q& J2 F- }7 T# b* Y" Q) x uint32_t tcc = 0;
+ ?9 q7 w" d" `' N9 J5 q1 E$ [; Y U4 r# H9 i
print2arm("edma3 driver init...",0);7 [% ^" I! H+ I
8 a2 b4 a6 q* k hEdma = edma3init(0,&result);2 h* ^0 l j: I
if(hEdma)
+ {3 M" f# o7 _ {
# V: P$ t( u0 \& L4 s print2arm("edma3init() Passed.",0);5 M* T. S; Q/ c3 K. Q2 u
}$ t. P" k$ r2 e( c% v8 P
else' _1 f" q4 ~7 v/ d
{
" Z. R6 g# N3 Y* ?; Y( r2 h print2arm("edma3init() Failed.",0);
' }6 f, X1 F- V P3 w7 { }
8 N& K: b( b/ L2 j7 p: b
9 S6 E6 Y' I) C# P) t3 L if (result == EDMA3_DRV_SOK)$ ~+ z& @+ ^3 |+ u" T0 U2 Z
{
4 X4 H2 U- v* q# w1 t result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,+ G* P: b9 _1 E5 c7 e. ~1 g
(EDMA3_RM_EventQueue)0,
! B+ ]6 D( ^6 h( x% d- b3 M &edma3_isr, NULL);. t1 `$ C1 t- ]
}
4 ]# O! Z& h8 G7 F* T7 B! x3 U 6 x$ _' R& T1 r# q
if(result == EDMA3_DRV_SOK)
& w7 S6 i# K- \8 A) \; M {
. A t: c5 L% }" {" J5 \% O* u( R paramSet.srcBIdx = 0;
6 G. P, ^; a8 ]0 r4 M8 ~ paramSet.destBIdx = 1;
) K! K: e+ _& b1 I- _' T6 v paramSet.srcCIdx = 0;, v7 k1 H5 ?" V, R& U
paramSet.destCIdx = 0;
$ I* H1 B( I+ i, @* {4 P paramSet.aCnt = PING_PONG_ACNT;
- ]* l& s) W& D# _* I paramSet.bCnt = PING_PONG_BCNT;
/ D/ y1 \5 w+ d" o7 l1 O paramSet.cCnt = PING_PONG_CCNT;2 W/ f; n, M( u- Z. b( B2 Z
! [# O/ R; v3 a /* For AB-synchronized transfers, BCNTRLD is not used. */3 E/ ]! V# P. j! o2 M K
paramSet.bCntReload = PING_PONG_BCNT;1 d" E( j+ i2 V/ Y. W
7 _0 M. o2 q; X8 x$ q: V% A
/* Src in constant mode Dest in INCR modes */
4 n/ M- N8 l" X. X/ m8 a% u paramSet.opt &= 0xFFFFFFFDu; m/ S/ E( p# E. ]1 {
//paramSet.opt &= 0xFFFFFFFCu;
# g6 G3 h0 _* s/ s& j0 h( N . @: y, ?; U1 f. y: g
/* Program the TCC */$ M9 B$ W2 k' [: f
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 o7 A) y0 L( S4 R8 P6 V2 k5 W# T0 o0 h6 b8 J$ G, ^ |. l
/* Enable Intermediate & Final transfer completion interrupt */( y+ P8 e, Q; ^) \' `6 j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ B8 P0 [) W6 U6 z9 d) j; l" { paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ d- n% z; C& \; _! h
' f; U% n$ Q3 @; G /* AB Sync Transfer Mode */
/ t, F7 m: x+ q4 ]" f paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, B( M( ^; P, t4 z' m z3 W
0 d# S! Z3 p; I2 e /* Program the source and dest addresses for master DMA channel */( y" P# S0 r6 A% E& Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); i Y/ L/ ?8 p q' z: \. l X
paramSet.destAddr = (uint32_t)(ping_buffer);: S4 f- w' X! r4 v7 q3 V6 J
2 c7 f( Z1 G$ _. Q$ g5 C8 p /* Write to the master DMA channel first. */
E6 _. F3 G) |( u; N3 `4 ~( c result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! u1 t2 n6 t; a6 A0 N/ x } ) Y# z2 ^& J# `. B0 S) ~2 p6 h" g
7 m8 b q8 N7 j& R& f0 D" H+ X result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( v4 z; G2 P1 O/ u0 n
& m6 o9 u" d, [. z/ _9 ? if(result == EDMA3_DRV_SOK)
* r K2 n- d5 h {6 P/ ]; n. b* I" K% k7 W5 B4 M
print2arm("edma3 driver init success.",0);
! o4 ?( A7 `! p/ D! \9 F }
6 D. T: `1 x0 f4 o7 y: _}7 j+ Y0 J0 [1 q
& o0 S J4 S; ~5 T) Q2 x2 m \: b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 `$ _$ e' K/ J' K; [0 z u- Y) e2 E" b0 o7 ^; Y5 z
, K; d& _- O8 u- [, T
|
|