|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 @5 X: p) L7 h! u: U! e8 E
#define PING_PONG_ACNT 1
# }6 P" V2 ^6 N# H#define PING_PONG_BCNT 8*32*40
* P% Y. Z" G" p) w//#define PING_PONG_BCNT 1 8 ]5 n# g! Q( K3 ^' a
#define PING_PONG_CCNT 1# }* B& u" q& o; O3 ]
#define MCASP_BASEADDR 0x01D000007 k# ?* [9 b# U% J
#define Mcasp_RXEVENTQUE (0u)
/ _. r5 V9 E6 m2 V5 }+ S8 i8 g5 _
% }. t9 [, S, Q b/* OPT Field specific defines */
& w: I/ t$ J7 E. ?#define OPT_SYNCDIM_SHIFT (0x00000002u)
: r% I( {$ ^# o* B#define OPT_TCC_MASK (0x0003F000u)! p6 d# D A( i3 o. }5 Q9 G
#define OPT_TCC_SHIFT (0x0000000Cu)
1 j3 Z$ E" f1 t! \: C1 l#define OPT_ITCINTEN_SHIFT (0x00000015u)" ~; b$ q% V! W8 v5 R3 d
#define OPT_TCINTEN_SHIFT (0x00000014u), L7 F I- \3 F
3 w1 B2 {- U Nchar ping_buffer[PING_PONG_BCNT];
# O: W: d& ]% I8 U7 w5 s/ pchar pong_buffer[PING_PONG_BCNT];6 V# O( v" I1 z; z$ c. c
$ U1 @9 ~) i: d# z1 ]' o k
2 t/ H1 M3 B$ m& a2 E G) L- Q* A; ]' j: h4 c- j$ @" `
, l3 ^6 k0 m* Q5 J
static void ys_edma3_init()" G. [+ P- A% }, W$ A& u
{
U- E6 b5 k2 q0 L" v# l8 Q+ q2 s EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};" `+ `( K6 q0 D' O# Z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ w4 W; g6 R' `. h EDMA3_DRV_Handle hEdma;! M: X) G9 w" d7 r! W
uint32_t chId = 0;
3 r! X& ^ c+ B' Y1 v4 X3 H uint32_t tcc = 0;
, W8 T" }9 ]* U, O% c. |3 n% u( e+ Q5 E( Y( X
print2arm("edma3 driver init...",0);# m2 L- Q/ |1 C2 {' I
# v$ |% R* R8 u, p% _
hEdma = edma3init(0,&result);
5 i: f! y [ V3 |6 F if(hEdma)" u0 V8 v: _& H
{7 H# K% _' A; j B6 ?& v) t; t
print2arm("edma3init() Passed.",0);3 S e1 X8 q% K! w1 y' V
}% `. B( _ G. s
else2 P' z3 w' t* o$ T
{- J2 k) b3 I9 V ?3 `- o5 F2 |
print2arm("edma3init() Failed.",0);$ d" K+ ?) G% g
}( ?7 L5 K. }6 e7 o4 d1 S
9 l4 a& l8 q; @! W) Q$ l
if (result == EDMA3_DRV_SOK)
9 X; T3 o$ U+ e. X2 d! R {+ O5 ]7 ^* V( T& F
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ t( `; ^9 |* Q6 }6 C% ^( y( [
(EDMA3_RM_EventQueue)0,) [2 A" u/ k1 y" F* W
&edma3_isr, NULL);
1 e; m' V, i4 j" K" ?& o2 V }
; P5 ~* @3 ^( k) d' I! d2 e2 _
( z$ o' t# V, }# X) v& g* Y( w+ N( n if(result == EDMA3_DRV_SOK). q; R f/ i& u+ \/ _1 M4 Q# _; T$ U
{' @2 y2 y' Y9 _6 h) W/ r
paramSet.srcBIdx = 0;
. j/ Q# r. {6 \; _4 M% g& @. s paramSet.destBIdx = 1;4 f% j7 X9 i& p- n# Z$ I! ?# G6 @
paramSet.srcCIdx = 0;( A9 |9 S8 ]* D/ c0 ~
paramSet.destCIdx = 0;
9 \2 a# \! _% h/ _- P3 n" J. a/ L; M4 E paramSet.aCnt = PING_PONG_ACNT;/ E7 j3 o* | k
paramSet.bCnt = PING_PONG_BCNT;
" b- \% e2 z8 F+ i paramSet.cCnt = PING_PONG_CCNT;
# r, `. i6 n. s( ^
) U% w# Q* q- u: ? /* For AB-synchronized transfers, BCNTRLD is not used. */3 t8 U5 q$ V! ^7 _* s; ?
paramSet.bCntReload = PING_PONG_BCNT;
: q2 O$ W& g6 ]4 p, _8 i/ s3 i8 m7 [1 K! ~( g8 f5 O. x/ q. R+ W
/* Src in constant mode Dest in INCR modes */
+ i4 F( K! H+ @# t# R! U# p paramSet.opt &= 0xFFFFFFFDu;
( v2 C6 Q- ?2 Z1 b5 {% d //paramSet.opt &= 0xFFFFFFFCu;& j% V- Q: j0 P4 k1 a1 Z! a
% H) D/ o/ V5 P B) v: t /* Program the TCC */" d9 X' @, g) |
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 j6 D5 B+ u0 h+ A4 g
6 [8 S# V# i( ~# S/ [- q; [4 o
/* Enable Intermediate & Final transfer completion interrupt */
) B4 q4 C J2 ]3 U8 v paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: I" @" t \, ?$ y* z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# J6 E( }% F4 {
+ Y3 d$ s8 l' Q5 G /* AB Sync Transfer Mode */
. Y$ C( q6 F- X8 n' I$ O( Q% W paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) ^ b# t/ V/ M" h0 |5 v0 G
; C- B3 n# T) g /* Program the source and dest addresses for master DMA channel */: e. J& g, k. M$ C8 w& T/ c; ^0 c9 B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 H( z7 B9 o: V: v+ ^; v paramSet.destAddr = (uint32_t)(ping_buffer);
: I3 L, m2 w5 I. h# k* P J, n& e* z- _: r. m
/* Write to the master DMA channel first. */
4 |7 H4 R( q; _. ?7 C+ f8 G. { result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" Q- E7 A6 q; c& a
}
7 ]; n' O: H2 R6 s# n& `3 k' Y4 v7 |2 ]# P% @( x8 h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. y' u9 m, j }. h1 e2 B( {2 |0 L
8 ^7 A! x! ~1 s6 s1 l. Z0 `9 o5 E if(result == EDMA3_DRV_SOK)
: I/ w/ X4 R/ D {8 N; R b5 o6 R+ r& b& f1 Q
print2arm("edma3 driver init success.",0);8 l* O3 B/ f' O4 D
}
8 |# \! l5 ~# `! w5 j. Q3 m" p- w}9 s1 M9 K& }" I; h w# d& F: \
2 k% F1 c) _: T. N1 Z" p7 z0 n; {& g$ ?
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: [9 t8 U+ M- b: P
5 ?. K$ C, l: ]9 i) \ J5 ~
9 V, E% q# x" H: R& z# w
|
|