|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 k6 ]5 }5 r$ d g#define PING_PONG_ACNT 16 D6 a* U. g! H' V* I: j& [
#define PING_PONG_BCNT 8*32*40 ( n% [( m8 m8 Y/ p/ a
//#define PING_PONG_BCNT 1
- M' U; i$ L* t+ d( J' T" n" j#define PING_PONG_CCNT 17 x4 |5 h- T, w3 N/ c, d7 W
#define MCASP_BASEADDR 0x01D00000
- i, O- W8 i; s( ?6 L9 u#define Mcasp_RXEVENTQUE (0u)- Z8 N1 i: z7 J
6 p8 N: a: p& ^$ o+ ?; [
/* OPT Field specific defines */1 h* C- w: }6 ~0 G$ A4 k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 Q7 k' [: f9 R# l#define OPT_TCC_MASK (0x0003F000u). A9 z" _) F; f/ F" Q2 q
#define OPT_TCC_SHIFT (0x0000000Cu)% _! P- T1 T5 w6 _" v; j
#define OPT_ITCINTEN_SHIFT (0x00000015u). _0 Z" K* k. d& A8 |
#define OPT_TCINTEN_SHIFT (0x00000014u)
* z$ _0 ]8 d6 o: p+ ]. J8 |
+ L; U! w, z" h. M) l5 d5 @; hchar ping_buffer[PING_PONG_BCNT];
& @& p% f1 O1 |+ @char pong_buffer[PING_PONG_BCNT];
1 t/ P& j8 V& K0 H; B1 k% [9 B
: t s. c# {! P/ S
" B) [2 C, X8 w, z: ^
3 I s+ E$ E* D+ `( u! m4 C# x/ C; [ q5 _- V. M/ n& X
static void ys_edma3_init()2 a) }; L5 `2 V, Q, d8 ^$ a! x
{
* K$ A; W2 [1 c% N EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! o- ^5 ^, D1 s1 }9 P# m
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
t; X& j: F- R6 a EDMA3_DRV_Handle hEdma;
- D5 ^" c( B* M# v; t; P uint32_t chId = 0;: Z$ A6 A7 U, W
uint32_t tcc = 0;3 c2 C* t8 o$ P) q0 _! I- K
1 f: j& I. }# W& o" Q$ k( I print2arm("edma3 driver init...",0);; P. j0 b: ]1 r: u8 K5 Z9 E3 k
9 ?8 w! d# _, M/ |! z
hEdma = edma3init(0,&result);& [! H' k- }) Y+ n1 j6 `* p7 o
if(hEdma)
2 d- g7 l. b# x) j/ R {! d, t8 m. ?! w% }! a
print2arm("edma3init() Passed.",0);
0 ?) `; ~" n, S f5 U9 M; b }
3 b7 x3 }- }: H else
' ~1 o/ s% ]3 e1 o {
* b$ s6 w. {7 x2 H7 {$ m% x% Y8 G/ i print2arm("edma3init() Failed.",0);
8 w P, q4 y5 n* G& s$ h }
! t# S0 e( ?' _/ N+ R+ U' x _
0 u% P2 U2 S& Y% H if (result == EDMA3_DRV_SOK)
& [+ p O9 b! ~ {! h; h1 F6 F, X! G3 P* ] k, W7 L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 W% P H6 f, E! d% k v+ ` (EDMA3_RM_EventQueue)0,
" z1 h% n+ p) r9 e1 O* r &edma3_isr, NULL);
L C6 E4 B( L0 c' a3 I; Z+ h }: K, {; ~0 J/ L* x
; f9 L# k1 S% L( y m p
if(result == EDMA3_DRV_SOK)- o5 P% G4 {: t- `1 g
{2 l. s0 n$ {9 d+ e6 A9 n" i% B8 f
paramSet.srcBIdx = 0;
7 {+ B8 Q) ^ E! t9 V" ? paramSet.destBIdx = 1;
+ X+ b3 I% p _ paramSet.srcCIdx = 0;: m- E2 N2 _7 I8 Q. L! W% X' J
paramSet.destCIdx = 0;/ \$ O( p: o4 `0 U
paramSet.aCnt = PING_PONG_ACNT;
. a) m+ k; C/ c2 R paramSet.bCnt = PING_PONG_BCNT;0 M7 E: k7 I$ M
paramSet.cCnt = PING_PONG_CCNT;: O# [3 d: n% w. j7 X
& s% ]! l7 x2 t# b* @9 G9 _" S( o
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 I# b9 ] k, c: M) i3 t& m0 P paramSet.bCntReload = PING_PONG_BCNT;
% }' u6 j: B p, ? ]4 p, M
* Y" E3 w2 I6 M; B, a/ _- i5 u: F. g& q /* Src in constant mode Dest in INCR modes */
0 l: G0 t: o% S8 V3 _ paramSet.opt &= 0xFFFFFFFDu;
* ]+ N! y4 s; g C) H //paramSet.opt &= 0xFFFFFFFCu;" _ f( x8 Y3 Y
2 `7 c6 ~; f1 ^1 X9 c' Q /* Program the TCC */# `/ `3 ?* Y( c. p! p& J9 s6 b
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ Y+ h8 U |8 k# \
: G ~9 R% g3 E7 t9 O3 u$ x
/* Enable Intermediate & Final transfer completion interrupt */2 @9 }9 }; X } M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- V% W: A0 l2 ~/ A
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" }6 F& q0 G# u# P# G9 m0 E0 s# z' ~! f6 m) u6 [
/* AB Sync Transfer Mode */5 Y. T5 n& B- P% x1 S# L/ A
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: U; v4 J$ D; }& x/ u# q
9 j% ]6 v% C' J' I0 Y4 o- ^$ Z /* Program the source and dest addresses for master DMA channel */: p5 Q: \+ M# ^$ K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 g3 C8 T. w1 E4 M& X7 D3 H paramSet.destAddr = (uint32_t)(ping_buffer);
2 \0 m4 O" r. I; i& p. i4 g1 ?8 A) `: G, u6 P( f
/* Write to the master DMA channel first. */
% p" T+ G# @/ ~4 \$ G result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);/ w9 M1 n4 f5 C7 M: K, K
} 0 g6 V6 n& R3 `; z
6 o; s1 h) W% O' P/ V result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: \' N- i- f( a, F% K f8 Z( I
. p! p+ z4 [; F8 K4 O
if(result == EDMA3_DRV_SOK) 7 ?2 e' D e6 w! ~( r- A
{2 F; C- ^$ A" J, ~9 ^
print2arm("edma3 driver init success.",0);
8 u8 D. g5 j- `5 P# _' ~/ ~' Y9 c } ~2 x4 Z" u. { g
}6 ^+ |0 B4 d5 g* X& G3 Y4 {
/ I1 {8 a' T& k& i' v0 d9 R3 S2 t' U" B" o. }9 ~/ m$ J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% e$ |$ E+ q. @; k4 t& Z" E
% H: X. R& J/ W1 r# z4 D( @# w
7 r, @; c, ]' w- p+ }& T: P |
|