|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( D# d( Z. n5 U! ~
#define PING_PONG_ACNT 18 J4 z0 v7 o7 h2 a# J
#define PING_PONG_BCNT 8*32*40 # ]$ \" \7 r* f Y
//#define PING_PONG_BCNT 1 * { X( a1 P, h
#define PING_PONG_CCNT 1, d& e# P4 A3 [
#define MCASP_BASEADDR 0x01D000008 a6 f) x. l% d6 ?- p" {: y
#define Mcasp_RXEVENTQUE (0u)# n2 F6 |" r" B1 e8 n6 l* h
\1 m0 A1 v, a; Q- e9 Z/* OPT Field specific defines */
0 i) d9 d2 Z6 [$ d#define OPT_SYNCDIM_SHIFT (0x00000002u)6 i: M5 m# e' }. R$ u3 l
#define OPT_TCC_MASK (0x0003F000u)
4 j1 L7 y0 A! L' y9 H/ h# I#define OPT_TCC_SHIFT (0x0000000Cu)- |' Q7 Q0 U5 ]. @! h7 B4 }5 M$ a) @
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% \% t4 L) o- U: N' L8 c. f#define OPT_TCINTEN_SHIFT (0x00000014u)7 \) [* \7 z/ N, q' m
6 L* J8 r: |3 m! rchar ping_buffer[PING_PONG_BCNT];* ?. Q; h( X# |4 M4 U ^6 w7 v
char pong_buffer[PING_PONG_BCNT];
( v s9 W8 ~* X9 N$ M
% w4 }0 G! e. m$ c/ g: k: t
6 R& |- q3 y$ m2 A* Q$ \$ O: }
0 ]! }# ?2 R0 ]2 g* C. k
6 Q8 u8 p, S3 }& s- h0 W% Ustatic void ys_edma3_init()
/ a0 G( L2 U- K( R( y{
* |, D) M) C. F2 H+ P- M EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. B ~" w( o2 ^* A* ]+ D EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 N& A* e7 s& w0 d2 v; r! j
EDMA3_DRV_Handle hEdma;7 l2 C% t0 z- a! Y8 u% }3 e* X
uint32_t chId = 0;& l8 G8 R" N4 T& G# B/ {
uint32_t tcc = 0;
% g5 ?0 W9 i, } i" f) D6 d# u# x
print2arm("edma3 driver init...",0);
9 [% K% W# y1 C
& b: O# a8 G1 o g7 C5 e hEdma = edma3init(0,&result);
H( j) |$ B6 z" j4 N if(hEdma)% e( E; H% `1 [! y! Q* `
{, Q l# d- g1 r3 T: C; u/ C- J. f
print2arm("edma3init() Passed.",0);
/ w( a$ J; \/ U/ C% H( Q }
9 A$ D- {3 ~, B7 J# F else5 M- S( i0 `- X
{# C# B* r1 y$ M7 W
print2arm("edma3init() Failed.",0);" J, i n, w' V, Y# P' }
}: ]4 _" p: M' \" z0 E& R" _
& G+ H9 u7 h5 a3 P if (result == EDMA3_DRV_SOK)
* d9 f* x* \$ I1 m {) N( @+ k- t: @0 g' z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ Q7 x, o' B; I# g! x$ Q, Y (EDMA3_RM_EventQueue)0,0 T' [ v( Y4 F
&edma3_isr, NULL);
5 G L, |& t0 M! B( f! p }
- n: B ^2 [5 p2 Q
' N5 U9 `4 l9 c: }. ~/ H4 q# l if(result == EDMA3_DRV_SOK)
: B! N' k6 Q4 F0 ^ {
8 l4 q4 F6 a! n- L/ }; ^ F, R0 u. A paramSet.srcBIdx = 0;5 [9 ~/ B9 E; [# v2 s- I
paramSet.destBIdx = 1;
7 {6 n8 Q8 H# r7 [( O% d0 I paramSet.srcCIdx = 0;
( d: J2 p$ b0 R/ F- n# ^ paramSet.destCIdx = 0;2 ]4 E& ?4 p# |! F
paramSet.aCnt = PING_PONG_ACNT;2 Q2 B* X; J$ H3 F- Y
paramSet.bCnt = PING_PONG_BCNT;# Z0 G2 r; |1 l6 Q
paramSet.cCnt = PING_PONG_CCNT;
R5 s+ {/ r- ^ w% z/ q% z % H$ K# } j2 V
/* For AB-synchronized transfers, BCNTRLD is not used. */) M, ]; v3 X# P
paramSet.bCntReload = PING_PONG_BCNT;/ S8 H1 w" e' x1 C4 z# o- x
+ v' f' u/ ]) v9 U3 V6 k, g
/* Src in constant mode Dest in INCR modes */) U6 K9 ?' A8 @/ _2 ?( Y
paramSet.opt &= 0xFFFFFFFDu;
! s; C9 k8 G3 }% ^& Z //paramSet.opt &= 0xFFFFFFFCu;
* ?- @: u. z O5 R. s0 v4 S$ i / v2 N2 a6 X& s6 b/ P" `9 @9 c
/* Program the TCC */$ J$ T+ W2 z( Q$ g/ Z/ J8 q0 E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: h5 A: u9 J& f' o- X9 Q, l
# y e- y4 l! |1 h6 l: ?' j: `' @ /* Enable Intermediate & Final transfer completion interrupt */
3 b1 ]! b3 f+ i paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. N: \& d% D& I, B
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ {4 D7 h1 p: \, s
7 I! U) U+ U: l$ j /* AB Sync Transfer Mode */+ m9 Q/ i* q7 o. |* a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 v% n! Q6 M1 g
5 x& u* w. l: v+ r$ C; P2 Q \ /* Program the source and dest addresses for master DMA channel */1 A8 N: o6 X2 I) R
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);# t: B7 v0 Z& Q
paramSet.destAddr = (uint32_t)(ping_buffer);
% `& Q; K2 x3 Y7 S6 d9 S. \ M( R. q: `$ F5 R; U
/* Write to the master DMA channel first. */
+ b* s4 p, m x4 I result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' R. @- \( v, q6 a$ \
} & n/ j* M! [- `" `! E( w
8 t1 L2 G1 }% P+ G& ~9 J result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( v7 r5 s( L' X3 `) a: N; X
" H8 `, T, o' Z. S' N) H if(result == EDMA3_DRV_SOK) 4 W- c4 ]5 W' ?! G
{- p; i4 I) P1 |% w3 Q5 k
print2arm("edma3 driver init success.",0);
# x5 p5 h: A- h }
1 b3 A* m5 t. S# b6 u4 f6 \3 M}% t5 A' |! A7 l: e( l4 `
, p" H9 d0 E ?2 }- \+ e! w3 ~; c9 E: I! _1 b) Z3 b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- N: L8 Z h# A! }
4 P1 L/ T; Z) E, s6 Z7 Q
5 \ Z' |2 i8 Z' j |
|