|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- Q) H% g }; }- n5 b#define PING_PONG_ACNT 1
, E9 C+ |) u; _( o8 Q0 \( M9 j#define PING_PONG_BCNT 8*32*40 ( `; k' M$ o& i
//#define PING_PONG_BCNT 1 / y S( Q1 j; S. L8 \
#define PING_PONG_CCNT 1
% }# j0 o4 k$ m+ N6 r G#define MCASP_BASEADDR 0x01D00000
& k! J. @% M( }#define Mcasp_RXEVENTQUE (0u)( v- f0 d$ S* y4 M% j
: m/ H% X* y; E! l3 m
/* OPT Field specific defines */! ^# W {& V, D. ~2 \
#define OPT_SYNCDIM_SHIFT (0x00000002u); [+ p5 [/ \2 `, P
#define OPT_TCC_MASK (0x0003F000u)4 J6 }3 G6 G$ f" [: N0 c% a) W# A
#define OPT_TCC_SHIFT (0x0000000Cu), t2 T* k9 ]1 W- t
#define OPT_ITCINTEN_SHIFT (0x00000015u)6 d8 H6 U- o- @( E" O
#define OPT_TCINTEN_SHIFT (0x00000014u)/ R0 l1 N, t; x
4 z: R' T+ V, t f* D4 M9 q
char ping_buffer[PING_PONG_BCNT];, K) _1 R# a: L6 J9 M3 P
char pong_buffer[PING_PONG_BCNT];
- e( C, l7 ~( u/ H6 Y- p8 O9 f2 q5 C. z* Z1 F
0 @' b7 b4 y M' g
& M" F3 l8 X/ U( d \4 j/ B
' B) I% ~: ~& e2 j( L$ ]static void ys_edma3_init()5 | I2 C H- F( k( l% B
{+ O1 r9 h' z& U
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
@7 S1 o% N. E \$ s% U0 \ EDMA3_DRV_Result result = EDMA3_DRV_SOK; u3 `* v9 b- F
EDMA3_DRV_Handle hEdma;9 D" w* M# [# r$ d
uint32_t chId = 0;# Z& i; C+ h. ~4 ~* R5 V
uint32_t tcc = 0;
1 X+ f& f% e, N* @+ t5 F# P
% l/ p* g, [. V print2arm("edma3 driver init...",0);# B5 f$ `( W p/ x$ O, G
; h1 |" x2 v, W: a! ^& Z7 y7 ^- R, W
hEdma = edma3init(0,&result);
" h+ v8 a6 d* m# D1 G, v if(hEdma)
0 m5 v8 G% F- I8 {, a" ^ {- [( ]% T3 K$ R1 l) O" y
print2arm("edma3init() Passed.",0);- n5 |& r" d% Q2 o" H
}! z% Z. K7 a7 c9 i. i4 |
else* ~0 R$ G5 G& Q+ r
{
+ g, v6 P4 N8 p7 N7 _! V* n print2arm("edma3init() Failed.",0);# ^9 p% l! |! n) t1 P' J3 e1 x% P' N
}( R& N( U$ n$ d7 x
% Y+ g# F# _0 t% B3 V' Q$ N
if (result == EDMA3_DRV_SOK). L4 F; j7 l- F7 B4 e8 M
{
- y: }8 O' R0 l* h2 w% g, N8 L4 x# X result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* C. I7 }: d! q (EDMA3_RM_EventQueue)0,
6 C+ S. q0 |( j6 z, Z' P/ B+ g &edma3_isr, NULL);- V1 @$ R/ U. z( C/ D+ Z/ K0 D4 L
}& |, p& H2 n4 ]" g( n5 D, t- y5 k
; b8 C5 s. K$ O, Y if(result == EDMA3_DRV_SOK)
+ t0 Z: E/ I3 _8 c6 O {5 ?: y' }) N0 A( [: }+ @
paramSet.srcBIdx = 0;4 Z u: r- I! |/ j; B
paramSet.destBIdx = 1;, b. ]& E7 W: f& J1 A9 \( K. p) ~
paramSet.srcCIdx = 0;
/ [2 m j7 Q# T$ I5 I! o _ paramSet.destCIdx = 0;( \9 g- ~" C) }: f' ?
paramSet.aCnt = PING_PONG_ACNT;
$ f) M4 _' u" M% @( }: V paramSet.bCnt = PING_PONG_BCNT;: G% g1 N A7 F$ n! z
paramSet.cCnt = PING_PONG_CCNT;# R/ `3 s9 x3 R% v" I8 y
* c" g6 ?0 b' E$ Q3 [ /* For AB-synchronized transfers, BCNTRLD is not used. *// h1 u5 C0 q6 K. p
paramSet.bCntReload = PING_PONG_BCNT;; q/ U' m/ W# U. Z7 `5 J$ I
5 ~# u2 V: g/ G /* Src in constant mode Dest in INCR modes */
3 a$ K, b5 z, v1 E paramSet.opt &= 0xFFFFFFFDu;- i+ L ?6 Y9 ~ w: ^3 ?
//paramSet.opt &= 0xFFFFFFFCu;6 \) y9 v( V) k/ B* G, N
5 O5 H& @' t% {# j6 i
/* Program the TCC */
2 S9 p3 \8 m$ K! {2 b6 S' N. D paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) {: R2 u) k5 {( C. }
/ z8 D$ p! j" A7 i$ K/ I% P/ \
/* Enable Intermediate & Final transfer completion interrupt */
' s" @- b+ ]; ~# I" P1 [+ V paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* ]8 F! i9 F$ ?* E1 y% @
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; |" D# O N1 L3 w+ W
: i, C( ?$ r" F) Y- i4 R
/* AB Sync Transfer Mode */8 K4 N5 ], E+ m9 N$ D" ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. @0 T9 j* ]: K $ a4 z7 L2 I% c ]" q8 f# J
/* Program the source and dest addresses for master DMA channel */
' t: O3 L& v5 x1 O/ P4 ~% O$ n paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ p6 k3 \0 Z0 Q7 s4 n; S
paramSet.destAddr = (uint32_t)(ping_buffer);
: S/ Q0 i( X* |! }4 S, a; H1 e0 X, J
/* Write to the master DMA channel first. */8 w0 y) Z4 \* D, Z, l2 a. ?+ w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' I4 I7 B6 |; ?" c
}
5 L* W# ]/ D( }: X5 R2 N- ^: }9 t2 E% }" E
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 }5 `5 l3 C8 d8 r- L
: J' Z* @# T; b; [$ ^3 W if(result == EDMA3_DRV_SOK)
8 b0 V, a+ `4 b* D9 n {
" O/ k: g% l" W4 @4 I print2arm("edma3 driver init success.",0);
) @+ @8 K) B) ^% V } 1 `# \2 Z0 Y+ p0 \
}3 h7 ^! W4 S; C. d# A+ ^- g
/ F2 X$ D' a; h+ m) v( ^( E
# L z. U4 S' p+ C- A: S5 qEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( r# p G; `5 y2 P( G {# x, i
: c& V7 E! o4 l3 r& L0 H& k% D
1 m) L# r: ^4 V% n |
|