|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 ~$ H* Y3 ?( k) T6 H) }#define PING_PONG_ACNT 16 b3 x _& t" n8 G
#define PING_PONG_BCNT 8*32*40 / B. J0 ^2 E9 z. B- y. ?7 H
//#define PING_PONG_BCNT 1
) Z! L8 |2 Q4 G. o7 R7 C#define PING_PONG_CCNT 1
. B; E, H0 j0 n4 @. ^( @#define MCASP_BASEADDR 0x01D00000
6 e8 |% q: {0 u; b#define Mcasp_RXEVENTQUE (0u)
- f: z- G& _8 a/ p
8 r1 e9 [0 l# v! r/* OPT Field specific defines */
+ V& V' E7 A9 b3 `! _#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 c% W" `1 ?( _* ~#define OPT_TCC_MASK (0x0003F000u)! L) S& L5 t" \% N' [- {; M+ ~# g, c& O
#define OPT_TCC_SHIFT (0x0000000Cu)
. ]" Q/ f. k) l* U5 }9 M#define OPT_ITCINTEN_SHIFT (0x00000015u)8 [1 s# X$ e1 S- ^
#define OPT_TCINTEN_SHIFT (0x00000014u)6 X# w: n# j' P7 e: r, O2 w
* O( Q8 o$ W+ ]! M7 Ochar ping_buffer[PING_PONG_BCNT];# z& R7 t# |* e% W; @
char pong_buffer[PING_PONG_BCNT];5 s, y% {2 {9 g' _3 G% i/ e. K
/ _0 @8 F3 C" n6 c' W1 J2 O
. r+ n9 ?* L+ ]5 U! T1 j. U5 f$ g! D) v- G9 g
/ B" [1 M0 Y! c/ v( a7 C; i7 l0 w
static void ys_edma3_init()
6 Q1 B# x$ i1 t/ z r4 Q{. s; s* e& h. ?! ?+ B9 k1 d+ |
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};9 T! N! ^! u: r& K* A1 g% y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 q1 o. L9 w2 S2 k [, j- t EDMA3_DRV_Handle hEdma;
( R) Y+ |* ?# i# P( p, Q8 d' e- A uint32_t chId = 0;1 z4 @* D/ J; X/ t+ M
uint32_t tcc = 0;% ^. Z; h7 m+ f
( T' j) h& C+ t* M# A1 F2 A print2arm("edma3 driver init...",0);! a" b& J- f* c" J7 D
) R; d1 y* y. L, ~
hEdma = edma3init(0,&result);* H" X3 c4 B$ E/ f+ ]% o
if(hEdma)
" _! r/ z( V$ [4 C s {( ?# g; q" }" h9 X i1 N6 p/ w% F
print2arm("edma3init() Passed.",0);
5 F/ W) W D: M2 e* ~ }( q7 S7 `1 E; T: Z# b) U; ^
else
3 e( J# ?! r( c# D7 ~$ | {
# i1 A g! x6 R# ?- F! ?3 l: v print2arm("edma3init() Failed.",0);8 Q4 y, G4 B+ ]! y& U
}
* w, C' R( ?) R! X T% v
5 [ [3 W D: ~" J6 L if (result == EDMA3_DRV_SOK)
( Y$ m; _+ d5 M8 ?# B {( _# T' |! f" W; g* N w% } }9 w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 H: t/ p3 e1 c7 ]: U
(EDMA3_RM_EventQueue)0,
7 T. i+ a L7 d& i+ i6 O) @2 r$ T% M! W &edma3_isr, NULL);
% m% a- u3 Y$ r2 J2 S0 A$ U }* A( e( q) p6 O; ?- U; m" M
$ m% `, H. y' ?) q% W) a; [ if(result == EDMA3_DRV_SOK)
9 ~6 X9 I: p6 s7 b7 n$ h" v {
* i m/ p; k( P3 E3 C) m paramSet.srcBIdx = 0;# ^9 | I5 {0 P
paramSet.destBIdx = 1;4 x) E. o( N2 |& ?( b
paramSet.srcCIdx = 0;
4 {+ m' o1 k7 T% F5 C2 y" l c paramSet.destCIdx = 0;2 Q' e( t! o: ~7 H" W2 B
paramSet.aCnt = PING_PONG_ACNT;/ u) y; Q. ^/ t
paramSet.bCnt = PING_PONG_BCNT;
$ k/ q* I+ q- H+ C6 B$ R: [ paramSet.cCnt = PING_PONG_CCNT;' r7 O; z& W ?5 c) G4 P6 h8 ?
2 N% D2 V9 B3 \) {3 P /* For AB-synchronized transfers, BCNTRLD is not used. */
( H4 n0 I. C5 y- W; k/ ^& T7 ] paramSet.bCntReload = PING_PONG_BCNT;
4 @+ I1 b w0 J- V) m7 h' h) z# p% L$ J, Z" O. k5 [& @
/* Src in constant mode Dest in INCR modes */7 C- e4 _# p- k/ B T6 D
paramSet.opt &= 0xFFFFFFFDu;
% B5 W1 _- e6 {! {7 d0 [% A8 J //paramSet.opt &= 0xFFFFFFFCu;
2 A7 S+ c; k- S' X3 U / G+ q, h B' T0 I5 Y
/* Program the TCC */9 x* t/ J0 u& U" q! Y: n( n
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" c9 m( o0 W3 Z$ ~ p* s; c; A! f: r2 }1 [/ {& W) o
/* Enable Intermediate & Final transfer completion interrupt */
' O/ C2 {1 H6 f" ]' y paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 l/ Z7 r6 O* ]
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; q" T9 J/ R$ p1 j) S$ B( e
# }4 v- b6 }: a, G0 _" ]* U6 t /* AB Sync Transfer Mode */* l2 `( \0 |1 W
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 F; f: j7 A" M, E1 D
, V. p* \5 z7 T
/* Program the source and dest addresses for master DMA channel */
8 w, V1 _0 M, K1 d1 @ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 U- V+ `- L9 r+ H% `( Y paramSet.destAddr = (uint32_t)(ping_buffer);) ~; ^' E0 u* A; \* O$ t9 {
! D6 {( d% Q( F% {7 g, { /* Write to the master DMA channel first. */
8 \' z7 a, W2 Z1 S result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);$ _' t: B2 V. M1 V; D7 h6 V# a! g
}
, \6 w$ X( j( N7 T2 i2 ^
( k# ], F" B1 E8 E* e, R5 i result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 z( U. d% s" ?+ G! z; s" W
- k) [+ Q) Y) u3 l8 O X7 J if(result == EDMA3_DRV_SOK)
0 H& t) R" H7 Y. U* x0 G Q {
6 a* N9 i+ F1 p e7 E$ k0 N print2arm("edma3 driver init success.",0);) T* { g7 M/ n* {" q# Z
}
. R0 C5 S1 w ]1 s' Q F}" H4 y8 ^% ~% U {$ p' W1 C
" K! O' s6 V; q* u) z# b$ Y) i8 Q0 U: m" x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' P* T2 V2 W( t9 C0 A: [) K
. e6 W3 M7 j) S; g L# @% N9 p4 M: ]8 { S; C) |3 r, B% e
|
|