|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ l* p# t) j$ E1 L- O#define PING_PONG_ACNT 1- l8 H$ N& W4 }6 I
#define PING_PONG_BCNT 8*32*40 6 j6 ^& w( `' q& h' B4 H
//#define PING_PONG_BCNT 1 ( R' |0 c) L; I8 `" j
#define PING_PONG_CCNT 1
$ D: ~' v' R. R5 v3 \# a1 d3 ]#define MCASP_BASEADDR 0x01D00000' x) V! X# `2 J1 P4 t! ^
#define Mcasp_RXEVENTQUE (0u)3 X) l; s; b2 `+ l v- k k
7 ]5 v/ g+ O# [" a
/* OPT Field specific defines */
% a: s/ {5 t" Q. p#define OPT_SYNCDIM_SHIFT (0x00000002u)( D' U$ @$ i D o8 v- w9 }
#define OPT_TCC_MASK (0x0003F000u)' c* Y( T4 T1 |4 N: R, |
#define OPT_TCC_SHIFT (0x0000000Cu)
9 Z' [+ p; o* Y8 K7 e' M#define OPT_ITCINTEN_SHIFT (0x00000015u)2 I1 J0 z( o' T: a; d
#define OPT_TCINTEN_SHIFT (0x00000014u): u1 w; d6 Y r: V1 o$ E+ n4 U9 f) t
3 K N- F2 N' B/ M* A0 xchar ping_buffer[PING_PONG_BCNT];" `& h0 s& c* r/ n8 w/ g) v
char pong_buffer[PING_PONG_BCNT];
5 s' a: @8 [1 t3 W5 i' H2 S' U* @: M6 ^1 p: g
$ t0 o/ u2 O# p+ ? a5 o
( v/ y; N- W i' q& \
5 r$ C4 D! j$ a9 Tstatic void ys_edma3_init()
7 G3 x. V( J1 w{
0 D& {! Q6 b) o) Z7 R EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& u2 B5 Z6 e1 r# d+ z EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 E, i9 S. t8 x& @4 F' D# u- j
EDMA3_DRV_Handle hEdma;
% w' N' Q3 Z- L5 j4 _, C uint32_t chId = 0;
4 Z. x8 A4 ~, X0 K1 G; Z uint32_t tcc = 0;+ }; ]! Q4 N- `1 k' i) ?$ E5 c
4 \' r9 l7 S1 u) F- e1 `9 Y
print2arm("edma3 driver init...",0);: q0 b" m4 O8 G3 R y5 O
5 h( G* u! ~2 @ y ~: Z hEdma = edma3init(0,&result);
" X& z( r" G$ O, ~" F, j0 r if(hEdma)4 O& g E T Y t: Z* x8 o
{; C$ k2 H0 \$ g3 J5 \5 w, f
print2arm("edma3init() Passed.",0);
" D" z8 n- x" J3 W$ q% I7 b3 K L }+ s: G) u! V2 s
else
* P" y( y3 P% ~ {
# @8 O$ d4 R* j print2arm("edma3init() Failed.",0);) t$ i; m _" U, l' ^/ B9 A: F: B
}
, r9 w3 T, _; D9 Q* k. g0 v ( G: a! G/ T. {" B
if (result == EDMA3_DRV_SOK)( U$ Y) r N6 W; h
{6 s8 D& |. `2 p8 Y) @9 {0 f/ y/ c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 Z P% Z) v5 K! k (EDMA3_RM_EventQueue)0,6 W; F* H, P, b5 S: Y9 Z+ j3 U
&edma3_isr, NULL);1 T6 b; O3 u- x6 g# \ h. D
}5 k. A# x& Z* D! c- d1 r
0 Y& ?5 T' j$ K" _2 T5 ]0 U5 L1 b if(result == EDMA3_DRV_SOK)
+ \. A& y+ T" _* _( f {5 b; i2 A5 e7 p0 M5 y
paramSet.srcBIdx = 0;( U# ?" @1 }; ~; |8 O, D" X, b: [9 s
paramSet.destBIdx = 1;
1 P( q- H8 P4 T- a, h paramSet.srcCIdx = 0; g; Y9 H6 t7 e1 e$ c
paramSet.destCIdx = 0;, i: t! J5 O, P6 Q& ]
paramSet.aCnt = PING_PONG_ACNT;
6 Y# H: t) j& Q4 x7 ~$ W paramSet.bCnt = PING_PONG_BCNT;
3 N: S r8 i; L1 q( p paramSet.cCnt = PING_PONG_CCNT;
0 L. E( Q& v u8 U 9 n9 M d7 {6 i6 h
/* For AB-synchronized transfers, BCNTRLD is not used. */
% \9 i' P- c) J: u- W, z paramSet.bCntReload = PING_PONG_BCNT;0 n; q0 u5 P/ @8 H
* g" o+ L! v( H' c" M9 }
/* Src in constant mode Dest in INCR modes */
6 n+ h. ]( a! u, j7 o: E paramSet.opt &= 0xFFFFFFFDu;
" @% H# q, d1 V; j- n: } //paramSet.opt &= 0xFFFFFFFCu;
9 c* S6 X/ P# N, ^ 7 s' [) K2 J% |7 C, s1 Z- C8 c2 {
/* Program the TCC */. X' U" N0 I& u: N1 \9 x
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 v' M5 G# H3 k" a
7 |; J1 [: y/ }8 t8 s2 o7 S /* Enable Intermediate & Final transfer completion interrupt */5 f- Z9 Q R1 T" h- L" B. o
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! Z! J [) r) @% M paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! e& i8 o( W/ [( ?! ]% O
' w6 V! W, L/ n2 ~/ v /* AB Sync Transfer Mode */
! Q, [/ ? y/ o/ y paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% y$ X% m, r$ ^0 l# i7 O+ O% n( @
: O5 W* o2 D( w2 @
/* Program the source and dest addresses for master DMA channel */( N/ S' Y! l. j* }! E
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! D1 N% ~& q& o9 _ paramSet.destAddr = (uint32_t)(ping_buffer);% f1 X& { i7 `
% r( A; ]" _- q* `% E- C /* Write to the master DMA channel first. *// \6 g( p, o r' h L% o |( L1 r
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);5 B8 @+ B9 p& A( u* s7 M
} , l5 J' n( e! c5 n' B
. |, y! V) E' C5 T result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 a* y3 s+ R* \" c% d- _; J
' k$ }, o$ q* K8 A! }# [
if(result == EDMA3_DRV_SOK)
6 ~7 o1 [( a. E: R7 K {
$ h' j2 T' y% p. b' x+ k print2arm("edma3 driver init success.",0);9 l( U# S5 H" b1 g; E8 d9 \
}
. I7 L6 ?1 [2 q4 E4 ~! [! j/ u/ e}9 f9 m& ^2 \- R+ l# @. v
) t+ B( |' w5 F4 n$ l; }* L$ @2 m1 _' V8 ?3 I6 Q, G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" o4 y- s) A- @4 T" S
4 G3 f" N% z7 N
0 e" f' U) p* m5 J+ D |
|