|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. s; r) Y1 i1 ^1 w* w: ?) @
#define PING_PONG_ACNT 18 D( O% f, r. @2 I! Q3 ^3 W
#define PING_PONG_BCNT 8*32*40
, g- ^# i9 G8 F5 `+ ~4 M: X//#define PING_PONG_BCNT 1
% ?% r7 o/ L1 J, ^$ Z9 C; q$ i5 \#define PING_PONG_CCNT 1% M1 U, C: q9 w1 G" t) X) l
#define MCASP_BASEADDR 0x01D00000
8 k! S3 ]2 r6 R8 V8 @) R#define Mcasp_RXEVENTQUE (0u)
# M0 @1 V0 t. G2 A0 Y
. L Z3 }( z! u- p& A0 d/* OPT Field specific defines */; K, Z8 m% ~& N2 _9 ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, I. q& O4 Z/ L! k) N' \#define OPT_TCC_MASK (0x0003F000u)
+ S9 H: n; a1 M i7 F) r#define OPT_TCC_SHIFT (0x0000000Cu)
/ m( ~; X) R7 z9 ]" i#define OPT_ITCINTEN_SHIFT (0x00000015u)
- S- F6 `. N/ o+ Y#define OPT_TCINTEN_SHIFT (0x00000014u)
5 M: x! e+ C* A4 {" h& s+ A6 P j6 \: U. y" }* X& J+ D
char ping_buffer[PING_PONG_BCNT];) `; |. ~" P' H u4 ?. ~! }5 x8 z$ C
char pong_buffer[PING_PONG_BCNT];! w& y4 l$ Z4 B9 o% r: C5 S
7 F0 |9 R/ Q$ G& ~8 N# c8 d9 g, j4 C7 I0 e7 ]( m0 v* g
' o4 J3 g% x8 m' k7 p! h" X' w4 A7 J; i7 g, I6 c) d9 v
static void ys_edma3_init()0 N2 z4 T4 Q2 s6 P
{: C% G( x2 y& s+ ]* _* U) u) H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- ?1 f7 Y7 Q. Q1 l EDMA3_DRV_Result result = EDMA3_DRV_SOK;( `' x0 }, i5 S; d2 T) l
EDMA3_DRV_Handle hEdma;
2 K+ X" j" x; l& P0 x) _5 F uint32_t chId = 0;$ s$ X6 F% V1 O1 s4 u r6 Q
uint32_t tcc = 0;7 t D) M4 J& s; Q
1 g! @) Q& p, p" H6 K2 C! F) J print2arm("edma3 driver init...",0);
- N& _' s; ]' }2 P, H4 l |
* U d" @" ~4 Y hEdma = edma3init(0,&result);
0 g! Y# ]9 m6 h if(hEdma)8 C- G2 _( b" Q3 w1 t& m* z% ?
{3 t# N" k0 Z# X+ e3 ^* f- b" _
print2arm("edma3init() Passed.",0);$ M" i4 p8 ?& |8 I& P m
}1 W- I* e( G+ Q/ G2 V9 i! [
else
2 r* l8 r. n7 \$ u5 O {
1 R$ u9 C5 S: @9 h0 r; S print2arm("edma3init() Failed.",0);7 W# f% Q+ d3 E
}. @: a5 U3 c' w" n( K q3 K! ~
; N4 Y4 `/ S e) b% [* | if (result == EDMA3_DRV_SOK). ~; P d0 e4 A: I x }/ v
{
6 p$ B. y( t! d# K2 v result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, I) n6 D0 N% [
(EDMA3_RM_EventQueue)0,/ W! \4 M6 t% W! h* o( E
&edma3_isr, NULL);7 p( Y6 G9 ^* @$ S9 q( J+ V) P/ G* B
}. @ H1 }$ r, K) p- \! d/ \2 T
3 r( p4 H2 r! H
if(result == EDMA3_DRV_SOK)
3 n) n9 I: B% y7 g2 r5 c% H {
) z+ B- g6 g$ A( r1 q9 L& Y paramSet.srcBIdx = 0;. M0 `9 _- k0 p( p2 c
paramSet.destBIdx = 1;
+ V: x& f" u. u0 e, ?* s" n paramSet.srcCIdx = 0;6 s% b8 C! P6 n9 c5 t# G
paramSet.destCIdx = 0;5 K, p7 a! R* `# \1 r+ M" ~4 u/ ?
paramSet.aCnt = PING_PONG_ACNT;
% W2 B' @9 r( x# S3 U paramSet.bCnt = PING_PONG_BCNT;
( V1 `' x# M$ ` paramSet.cCnt = PING_PONG_CCNT;# O0 y1 u; m' t3 A3 s2 a
# t) a2 [ [' u7 E( O1 G9 b3 l /* For AB-synchronized transfers, BCNTRLD is not used. */0 i, \ \( X/ o8 s
paramSet.bCntReload = PING_PONG_BCNT;
9 v6 R% I- N# \9 J. }2 r, P, U' {
/* Src in constant mode Dest in INCR modes */
7 z7 h4 `$ v$ l4 ] paramSet.opt &= 0xFFFFFFFDu;
/ o# \0 k! ~" }6 C! W4 K# s0 E //paramSet.opt &= 0xFFFFFFFCu;
5 u; G4 l, u" b1 ?/ ~- G3 l 5 e) o" a. q' T7 x3 C0 C3 D
/* Program the TCC */
/ L* A/ W1 @. ^ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ `! S) }0 J7 K5 y' M
7 y" V% n7 }- B1 n /* Enable Intermediate & Final transfer completion interrupt */5 P0 B* U8 s' I$ j9 v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: M3 V4 R- @8 p' t N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);( N4 v8 k( O/ k( @" z8 u$ p( q
% r. i" y' ^, G. O( _- w4 l /* AB Sync Transfer Mode */
4 S) Q5 [& }$ { paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 s2 Q. d/ A& d7 _7 Z9 b5 @
/ s% X, O# G) ?+ F& k5 H% M
/* Program the source and dest addresses for master DMA channel */ E3 p/ H5 x2 O9 X; _3 u- E
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); r8 \% _ k) {& f9 K* Z, L
paramSet.destAddr = (uint32_t)(ping_buffer);
1 B0 N6 \7 O0 ]
+ x+ ^5 `3 z& R /* Write to the master DMA channel first. */
4 m) L1 x8 ?* n, f% ? result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);/ P( r3 k: Y# N6 _) b
}
2 X3 ~+ r6 R/ U% [* n7 O9 k
! _+ t% Z( V7 C1 W6 R result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 C5 b3 w. I+ b: I( ~' C \ 7 D: p* G5 D) X/ G' Z ]
if(result == EDMA3_DRV_SOK)
, @/ K" L( h; m9 K) e {
$ \' p* }- r; t- Y: B& T9 l print2arm("edma3 driver init success.",0);
( L* a5 E. d& y+ `( t0 h5 J# ~3 J3 k% v } # J% V. X/ t3 e# E; P _
}% Q! W+ P) } ^/ {0 ~3 S& J
/ N8 o# G1 x2 a
- w; k, ?4 Y9 R# @& iEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. l3 n3 Y6 J& l3 W4 ?3 s: p
5 m; h; L ]* i; S
' s. L6 A4 i7 Y* n5 P |
|