|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* z1 [5 i1 i$ ]
#define PING_PONG_ACNT 1
& c0 O; N3 j* X2 z/ ~#define PING_PONG_BCNT 8*32*40
- j8 F+ B* p2 ~/ A* C3 G- U' d//#define PING_PONG_BCNT 1
" [3 o5 g& y$ C5 F: N9 D#define PING_PONG_CCNT 1- `9 J! z! F/ P8 w7 n2 g
#define MCASP_BASEADDR 0x01D00000
! x% {9 s- @7 ~( a4 ?" J4 N#define Mcasp_RXEVENTQUE (0u)& p8 m. N D- Q% A: W3 N
1 S# ~: Y4 U0 p$ r0 o7 s% s/* OPT Field specific defines */% m8 N7 D# I1 Y
#define OPT_SYNCDIM_SHIFT (0x00000002u)" |0 @3 K$ [% X: o$ A5 c5 Z
#define OPT_TCC_MASK (0x0003F000u)
( i3 g/ P. z, N0 Y" g5 w/ w#define OPT_TCC_SHIFT (0x0000000Cu)$ L! ^" A, D- l; O: F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# }& Y/ h+ H Q- _ Y- P#define OPT_TCINTEN_SHIFT (0x00000014u)
! i* A. }; } X1 M( i& w
- G! C0 y# D6 T* U: x0 u, S6 _' ochar ping_buffer[PING_PONG_BCNT];
7 O6 U3 ^( a1 z3 `( d- nchar pong_buffer[PING_PONG_BCNT];
( V- c! M) h3 p8 _& P* R8 |9 K; c# W z
9 f' t- ^" Y: E/ u5 r! r
; y7 U7 h5 T$ ]# v, V6 G& T) w) p+ t) d& T3 q* K' i
static void ys_edma3_init()
; u' e3 |5 x" c; z& j{
6 N' x3 p* Q# C9 H- \. Y) r4 l) T, k EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 }9 N- K% @7 |* _, C; F
EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 m# u3 K4 H( ^* x! @' e
EDMA3_DRV_Handle hEdma;
5 @/ R# J! K2 J3 q4 l: o0 c uint32_t chId = 0;
+ W# T" K- v* C h; G uint32_t tcc = 0;4 i. \. [7 I% b8 e
{* u3 R! F* b: A print2arm("edma3 driver init...",0);
a" c' \( {0 K) R" F( ~7 ]! z4 h a4 v
hEdma = edma3init(0,&result);) [9 \& c$ G$ g' ~' n' Q. h
if(hEdma)
0 S6 J5 z$ l6 J$ |% n: D% M {; [2 e9 ^( |( n- Y* a. X, Q
print2arm("edma3init() Passed.",0);; O, Z& X1 x" @- n' I% P1 w% h
}
5 ^4 g" S8 v% s" v4 O else
& `2 w+ S5 ^4 Z6 r9 A {
* A' i9 V1 b( z. Z X print2arm("edma3init() Failed.",0);
5 h- |" N; A- N8 ?, ? }4 q) V4 \1 g7 }/ ^6 j! q, H
; t# v" j7 Q2 _3 C
if (result == EDMA3_DRV_SOK). G) ~+ U1 y; `! P: f' e7 U
{
& o0 Q( [+ z4 s0 ?( h result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 l3 Q/ [6 s" J5 t) a/ [ (EDMA3_RM_EventQueue)0,0 O5 {1 r, v. o* `( P. q
&edma3_isr, NULL);
1 K; v+ k6 Y# o4 c. p. L9 a# n) E2 G }
! J; C2 h' q: z8 ^1 z' X$ H , w+ u3 P; \- S8 d% i
if(result == EDMA3_DRV_SOK)
- f* s1 ]$ u3 D3 V {
! ]! n, s' X+ ?1 a& D% E* ` paramSet.srcBIdx = 0;0 P9 D5 M) z2 Y7 z1 ^3 n
paramSet.destBIdx = 1;
# h& b- _0 D6 U paramSet.srcCIdx = 0;4 E, ?5 u7 n o4 Y i! j
paramSet.destCIdx = 0;
. W9 t8 ?, h+ x. w paramSet.aCnt = PING_PONG_ACNT;
; h1 a) H% s9 ]- I paramSet.bCnt = PING_PONG_BCNT;
; j2 l+ {3 G3 ~& }9 X: ~ paramSet.cCnt = PING_PONG_CCNT;. t6 p; A8 Q# P2 I V; ~
3 w1 u% D' D) D" z0 N
/* For AB-synchronized transfers, BCNTRLD is not used. */: o, X3 j' t8 [8 A. u
paramSet.bCntReload = PING_PONG_BCNT;
, b( F( G6 l E6 n. `" H3 `- @9 H2 H
/* Src in constant mode Dest in INCR modes */3 c1 ~8 u# P# O$ E4 v& H( _
paramSet.opt &= 0xFFFFFFFDu;' F s) H1 v( J4 f5 Q
//paramSet.opt &= 0xFFFFFFFCu;+ t( u5 ^* {. x( E5 k* i
% J$ _0 J* J0 w# V+ Z6 D /* Program the TCC */
0 R$ x% _+ [/ c2 v paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ l) ?" E9 `( J. G' F" Z2 I% X+ y* j7 }3 K
/* Enable Intermediate & Final transfer completion interrupt */
) T0 |( z. _) J( n' e3 ?+ F4 k" f paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% B7 r+ ?' o& ^) g$ d* N9 j
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- Q" ]$ ~5 W: D% d
5 k" X' h* ^3 C* E
/* AB Sync Transfer Mode */
# k a% a- ^& V" l E paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) ]3 T5 \+ B* z+ `. E( U, P ^
# k- e# P, a# `3 _
/* Program the source and dest addresses for master DMA channel */
& a$ O; a! T+ [# H/ G4 b paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ `' p; s, y* v: d ^, c& C5 N paramSet.destAddr = (uint32_t)(ping_buffer);
. ^8 T3 q+ x+ n
! }3 B: }) g: G1 [ c4 ^7 }9 O /* Write to the master DMA channel first. */; l8 @! b# L3 M& O
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);0 D: i4 V8 r3 ], }" A' O
}
* Z% |" j( g% z' z+ t$ x1 E; L ]0 M
/ |6 M4 u2 [7 C result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ `! ^) G& q% W
3 D h/ m3 l' c( e. ~- f9 F3 C if(result == EDMA3_DRV_SOK) # n9 a0 l7 C7 t: \- O3 i- d7 {
{( B6 h) e/ j3 _) m- B
print2arm("edma3 driver init success.",0);1 d3 h$ z* h( e
}
; W. p* V6 ?: r}5 H( \- q. Z. ?/ r" k6 D# h
+ s5 x2 C- W8 Q& o: @
/ Z( K: d' [0 e: Z/ ?! CEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ s* q3 i. ?/ m! y6 m6 j3 a6 y/ @6 d% r7 S+ l ^
" D7 s: p6 k) O# H( [4 Q$ a
|
|