|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
a# ?& b2 p z' L+ M; s5 q! a#define PING_PONG_ACNT 1
* b4 p. D# W$ y* v# [#define PING_PONG_BCNT 8*32*40 * P- V6 F1 J$ w2 j3 ~' k( n9 p7 Q5 I
//#define PING_PONG_BCNT 1
4 ^* a, C* D( D% ?9 R4 J: j#define PING_PONG_CCNT 1
. Z# S1 d& K5 C2 M9 Z x#define MCASP_BASEADDR 0x01D00000
; s+ p- W+ r# E5 p7 z6 W#define Mcasp_RXEVENTQUE (0u)
0 }4 j3 j2 j9 s0 F p3 A3 u& ?
- }$ }: g c. c U2 _* r" _# t/* OPT Field specific defines */0 a8 b0 A, H% y: @$ F
#define OPT_SYNCDIM_SHIFT (0x00000002u)" T# J" @, z% E; g
#define OPT_TCC_MASK (0x0003F000u)
& b% R% S. Q$ Z9 [#define OPT_TCC_SHIFT (0x0000000Cu)) `- D3 @7 a( v2 M
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: B5 F/ L# i7 D$ U# o6 t#define OPT_TCINTEN_SHIFT (0x00000014u)
: E& V8 Q3 `$ j/ d1 u! I. Q, M
+ ^9 e, W3 Q" t, ]3 Hchar ping_buffer[PING_PONG_BCNT];: s' {! c7 c& P u0 X! o
char pong_buffer[PING_PONG_BCNT];: U# _, ^+ ]% s& r3 |/ W
) H! L0 D4 i- R3 @: t8 N; A
6 z z) C# i) j1 w9 e8 O! }# P* G0 V, V* n7 k
6 s7 h/ b& G" |$ Sstatic void ys_edma3_init()3 c$ c9 a* S" ~) i3 C) o- t
{" B6 O- [: j6 h9 h) }5 Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' ~; Q* q: D+ z$ t1 U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% S, u( ?2 _' j$ i7 N4 [) ]$ v' q EDMA3_DRV_Handle hEdma;. u/ b& k3 W) I( M7 N; G# ]
uint32_t chId = 0;4 Y8 k; V1 K! [% P" F, H+ f
uint32_t tcc = 0;+ d+ e) J( @' Y( y; |2 o
4 @ K7 u/ `" M3 B' O0 {1 m: | print2arm("edma3 driver init...",0);
3 A. Z2 `4 N; }' l2 y& y2 j1 x! M4 M' l6 k( L! p/ k
hEdma = edma3init(0,&result);
$ P# X/ a$ l2 \4 m7 V5 E if(hEdma)/ t( n" I7 C3 b- X. v5 c6 n1 i# j
{
) ]3 Y% x1 U* ?0 Z' b print2arm("edma3init() Passed.",0);' B6 \6 r; {( a' o. R. r
}
" F8 K; I/ E4 j$ _5 x else+ w; | K( o( @; H7 q4 h4 j
{; F! h* _0 c( u/ u. G |: |. C
print2arm("edma3init() Failed.",0);
; d, _$ b L: A/ M, ^' S4 X) E }
1 X8 i- U0 y1 ~- Y+ ] 1 V! }/ F9 V6 m; u. y2 N
if (result == EDMA3_DRV_SOK)
, r6 h* o# z$ q { M5 r) ^. X0 ~4 e! P+ U; }# I4 o9 r
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 U+ x9 u% J0 |% c, `
(EDMA3_RM_EventQueue)0,
0 R Q* t# s2 L+ r &edma3_isr, NULL);' V: R1 T5 ?4 n- u+ R8 M7 V6 h
}
) d. c6 O" U; ~' L: t
. I+ v/ J, N$ ^# r; K/ t if(result == EDMA3_DRV_SOK)
' i1 C7 P, `& e3 v5 T {0 W9 ?9 g) c6 w; C3 ?9 {
paramSet.srcBIdx = 0;
/ W. A, O5 m3 P7 s" P paramSet.destBIdx = 1;" c- s4 n* I D; _, W* j( d- `7 w1 r! ?
paramSet.srcCIdx = 0;+ C" K) e0 F( Y0 w
paramSet.destCIdx = 0;8 Y; Y7 O$ B- I2 ~" C4 O
paramSet.aCnt = PING_PONG_ACNT;# L" `# t6 j+ I& Y" B
paramSet.bCnt = PING_PONG_BCNT;+ @ i5 E. ]4 Q# Y; L! b
paramSet.cCnt = PING_PONG_CCNT;4 p3 u4 m$ a8 m+ d
5 D$ t$ d) s2 C+ I; v& M /* For AB-synchronized transfers, BCNTRLD is not used. */
) M X! i2 D; c/ Q paramSet.bCntReload = PING_PONG_BCNT;, @- h, {% `% q8 m# y
- n% `6 r7 S; d8 W3 P
/* Src in constant mode Dest in INCR modes */
' p6 a$ X* J" `7 c( m; {' h- Q- o7 K paramSet.opt &= 0xFFFFFFFDu;' U8 y$ m' I3 J
//paramSet.opt &= 0xFFFFFFFCu;
; I* ^* e# `9 G' L5 J * S( R4 B0 X) t* V& I
/* Program the TCC */4 M! w' h8 u6 U6 v; h. j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. I. a( u+ @; i+ R, X
9 h+ a$ ?7 c% [6 H: Q4 c
/* Enable Intermediate & Final transfer completion interrupt */
k1 J5 H9 D; u" T" H0 d, H# K4 M paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ I1 v. c- l3 O5 |# C6 U7 @; R paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 c/ I4 Z6 J, C6 K: u
2 |6 c: v& o* {: _7 s* S K0 f" G$ z' T /* AB Sync Transfer Mode */
5 R7 M2 o5 N0 M& E2 G" T, C8 ? paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% K1 g4 {2 o- V : U! \0 q) G& j$ t, X
/* Program the source and dest addresses for master DMA channel */3 E, x3 D8 U8 l, R% l4 M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);( p$ m6 l6 {2 H8 y9 z
paramSet.destAddr = (uint32_t)(ping_buffer);
3 X7 G" t k" S" E
+ A; m' J* ?- I5 v /* Write to the master DMA channel first. */9 E3 W3 C; N# D- Z" P& t
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);& \0 F. |$ I' y% Q/ T, I- B
}
! R$ A; G* A# ^" v# r. F8 Z3 r" ~9 ^2 j8 v8 R# o
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) R1 m( m# e' ?, k% b0 d
7 v8 n2 s# t1 @9 Q if(result == EDMA3_DRV_SOK)
& O+ \& P3 J+ \& y {
|+ S6 r4 ~" O% P2 a. O" I9 F print2arm("edma3 driver init success.",0);. g1 l' A% {' i) N& z0 O7 I
} 8 v0 s" s5 J/ a( ^
}
e7 g/ k) Q, J3 q7 N1 @
, C1 r0 {# o9 ^4 K4 Q
# V0 o/ ]2 t% Q: rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# U1 y& u8 w# R7 a. J: A
# p; X9 j( v: |* F, y! R0 A, @3 E" v& }* ^& D* H
|
|