|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* L# P$ p0 z+ D- e$ X7 c
#define PING_PONG_ACNT 1# M+ F1 k7 |: j
#define PING_PONG_BCNT 8*32*40 ( `: n4 |/ N7 C; t# V" b6 y; G; w
//#define PING_PONG_BCNT 1 , S: N; r: l8 Z& d6 z$ c! j
#define PING_PONG_CCNT 1: r4 a z( s; [+ p: Y1 n0 }; ]" N
#define MCASP_BASEADDR 0x01D00000
2 L, P: i" W. X) e) b7 E2 [#define Mcasp_RXEVENTQUE (0u)
4 j* b& ?& o: C) M+ f! u" F5 U$ N3 G! m: }% D( u
/* OPT Field specific defines */
' w9 y9 m8 d' O# R# K#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ F& Y, b- \& F% U#define OPT_TCC_MASK (0x0003F000u)
2 X9 N/ O9 K3 {5 I' v#define OPT_TCC_SHIFT (0x0000000Cu)/ \+ K! \6 k9 X$ Y$ v
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, x1 j, q* p+ O7 K; k#define OPT_TCINTEN_SHIFT (0x00000014u)
5 l0 ^8 _! T# P, ` G d; g% E. B, k8 g. H
char ping_buffer[PING_PONG_BCNT];) ~" l" t3 w2 n9 r& r
char pong_buffer[PING_PONG_BCNT];* F6 E# n! @7 v$ C: l% M% M
4 v) Q1 m: S6 L: W
* |" d6 l4 I( t% ?* W- P9 w/ @* y
# \ |: u$ n- W( [4 K- @9 P6 ^static void ys_edma3_init()# p: \5 h; J3 C2 W4 T4 \, D1 c
{! m6 {6 c, ~* ~5 U3 h8 d, D; U% v+ v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ Q4 W2 t) Q( t- C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;" d- m. u/ N1 _. O" }$ _5 ^$ B
EDMA3_DRV_Handle hEdma;
v( P# {4 S& A0 B" S uint32_t chId = 0;; k1 t, i* O* ~( v6 @4 p( a+ ^
uint32_t tcc = 0;
* t. s. y: |: \* m* L
5 E+ {# H- G* O0 h3 f print2arm("edma3 driver init...",0);
5 Q, y2 `' q; p* ]6 b$ [8 l; `! q5 G1 v3 l) E( H4 S. R3 c, H
hEdma = edma3init(0,&result);
& L9 O& c4 p/ S* b! ^2 j/ w* x if(hEdma)
& t9 a: `5 g9 `+ N. c$ u {' q# K( d: Q8 m7 D
print2arm("edma3init() Passed.",0);
; \ V& L$ r8 ^1 V' U: A }' m8 ]; X2 V7 _3 Z. I
else) K3 Q- Q5 g" c% g7 ^1 }
{ c+ Z9 y4 p" V. o# @' K! u
print2arm("edma3init() Failed.",0);
) r3 x+ I6 A' t# a) w3 c" c3 v }2 f7 G/ a' `& E6 @+ o
" p: \3 W8 c3 B$ L$ K
if (result == EDMA3_DRV_SOK)# {2 B; [6 e6 @0 A" D
{
2 a) H: e+ S- t' _) B2 e7 o* ]5 p result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 Y, O/ A+ P* R" @( @: y- c# c (EDMA3_RM_EventQueue)0,' {6 T" d& O0 S4 m: t6 }4 Q
&edma3_isr, NULL);
7 U: b, L5 B: B4 l% m E# l' u }
. j! S- x- G9 | n' f$ s( j2 q" V. p0 q" @
if(result == EDMA3_DRV_SOK)
/ }3 S/ @! a* L# J: @1 L7 V7 u0 Z! ]. F { i" k7 [- ~. V" w% x& N- U; x5 W
paramSet.srcBIdx = 0;
! f# J. A+ c, _ paramSet.destBIdx = 1;" Q* I$ [. u* j& Y( {6 F2 i7 O
paramSet.srcCIdx = 0;. A0 X4 }' L' M" \" V
paramSet.destCIdx = 0;
& ]7 [# n- m) W2 W( }- i paramSet.aCnt = PING_PONG_ACNT;
: g) w) s7 e% `6 }7 @ K4 R' X2 g paramSet.bCnt = PING_PONG_BCNT;7 l1 U+ G4 @0 F; g# _. b. H
paramSet.cCnt = PING_PONG_CCNT;8 a2 N2 ]$ Q) Z
* e$ K! ?9 X$ Q- T d' f /* For AB-synchronized transfers, BCNTRLD is not used. */8 W; p- V9 n; l& Y; o
paramSet.bCntReload = PING_PONG_BCNT;- B8 d3 b# u( m' R
4 T% V( `! q. |% V
/* Src in constant mode Dest in INCR modes */9 ~; n3 D; F' \; z3 ^8 u% C* |
paramSet.opt &= 0xFFFFFFFDu;
4 R0 o6 p, @. N. r% \9 T //paramSet.opt &= 0xFFFFFFFCu;
" O3 f( q. S. f& K+ ~0 f . F# H* G' G7 E3 F: q
/* Program the TCC */
( L3 q* i6 Z8 D. j$ B) r. T9 P/ Y paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" H6 r) n8 h7 n' G0 u$ N
/ ~- [+ H: |0 h( T8 H2 \. D /* Enable Intermediate & Final transfer completion interrupt */
' m3 v1 v% q- ?8 N' s* k: a paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ s. B2 o5 z1 X) X/ m- O
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! k0 g% J7 _: D, ]" X
; A3 K2 h; d+ `( k b, u+ i4 b. }
/* AB Sync Transfer Mode */
; R2 P1 |+ @3 y p. j paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# M/ S; a+ i" l: Q& v* R , J" k1 s' ?$ x( {3 f
/* Program the source and dest addresses for master DMA channel *// ?2 Y6 ]2 q+ W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 H- i5 P! z. v; B5 ~ paramSet.destAddr = (uint32_t)(ping_buffer);
5 j% |, D! d0 }
+ P3 K# {. a8 I* \. q2 w /* Write to the master DMA channel first. */& o) j% {! d3 ~. @% q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 X( K1 e) l5 b+ b z4 m# T: k- q1 ? } ( s+ j! I6 b! r& F
" g3 |+ g# Z+ e4 Y }9 E& s
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 Z% A5 \( I6 u- [% c
1 Y ` G" E% x" f J2 O if(result == EDMA3_DRV_SOK) & y8 m* o; ]& {# ? h
{
7 Q0 Q2 x1 {+ D4 f( i3 f, [/ {4 u print2arm("edma3 driver init success.",0);
- a- g+ W! B; M" t# p' [5 x0 D7 M }
/ p1 X8 M* n l! L# ]6 a3 G! f# |}* w+ m2 g( d( g( L
0 G8 ~8 e! y7 Z9 M8 w0 A( c3 q$ E; m* ^0 x) O. Q( Y- d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ t3 [0 d, @' [7 r9 w; b. l1 v3 e, R- u! P% U' ]
$ X* o' U: t# q
|
|