|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% n1 u( k5 s5 y' h! ^' @#define PING_PONG_ACNT 1
' ~+ R" f% z+ K; E- B! C#define PING_PONG_BCNT 8*32*40 # Y/ H* N/ d7 ^
//#define PING_PONG_BCNT 1
! @6 f; M9 \6 n/ m* `#define PING_PONG_CCNT 11 F2 y) H& C1 W! H' s3 y# X7 b
#define MCASP_BASEADDR 0x01D00000" v' a& S7 E6 g4 o. G
#define Mcasp_RXEVENTQUE (0u)
, J3 @* Q4 d/ }' x! ^& E+ d4 y" i1 J) \- H
/* OPT Field specific defines */
2 h( \, S! n }2 l, Z#define OPT_SYNCDIM_SHIFT (0x00000002u)9 q, ?, C# D7 g/ n! D, d
#define OPT_TCC_MASK (0x0003F000u). D0 ?( l) v K$ m5 ~7 r
#define OPT_TCC_SHIFT (0x0000000Cu)
- w' A$ c- O( H1 g$ a#define OPT_ITCINTEN_SHIFT (0x00000015u)
& G8 T7 K* Q3 S. k#define OPT_TCINTEN_SHIFT (0x00000014u)5 h% }* z+ y2 v+ s2 i) W
( C- [$ b3 i! e. H- C
char ping_buffer[PING_PONG_BCNT];1 }3 H, F1 Z2 H/ O1 h0 E z
char pong_buffer[PING_PONG_BCNT];3 b0 V. P h: I% s; @
: N9 Z: m( X6 e r9 q
# a2 Q4 S. |! y9 ^: w: \; h+ ?9 m% q, s: [$ V W# w
5 k( x V9 c; y) z
static void ys_edma3_init()
' z# ]; }0 X1 b$ z1 a. V{. S0 e+ i% a' _9 M Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% r8 N* s* [+ E# x+ Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 n# d! g2 r. @) b EDMA3_DRV_Handle hEdma;. @- Q1 P' Z! z7 d4 c9 _* U+ i/ M. j
uint32_t chId = 0;
4 w$ d$ i' e3 N5 O- `' G( |7 h uint32_t tcc = 0;: m% P7 Y6 Z# ~
* z) a- d! Y& i2 j
print2arm("edma3 driver init...",0);
8 m5 T2 f; P) q# ^1 y6 N
5 u& W( x {- f hEdma = edma3init(0,&result);, K `! _0 m _0 B0 C- a8 J7 W! E- C5 {* k
if(hEdma)
! `* F2 J+ p, V3 a( H% ` {
9 \, ? C. v9 D" @0 f- E: Y! X print2arm("edma3init() Passed.",0);
, F! s \+ f8 L }
+ k; J j6 i2 I3 @% |$ V5 G else
' Y* Q- M% E: H {
Q9 f( `+ r. U! B print2arm("edma3init() Failed.",0);* h8 B. v% O+ n; S/ J" c/ w
}
7 U" l7 X8 d' K
# ~1 m6 l; |, {5 N if (result == EDMA3_DRV_SOK)2 d0 o5 o! k( G) f
{
5 _7 u) A, e$ S7 e result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,- U+ b3 b8 o5 }6 a8 r$ i1 o% [
(EDMA3_RM_EventQueue)0,
0 k& w& W6 H! t. I4 ]2 Q/ e &edma3_isr, NULL);) j- r. O# b: B
}
! b! R ~6 _$ D F7 y
" j. l- O; b- x+ R5 T1 D if(result == EDMA3_DRV_SOK)
1 K" X2 _) c5 p+ \ I' r7 A {' F+ m; E1 r8 `0 g* `$ F
paramSet.srcBIdx = 0;
o* b, Q5 r0 i' V4 r paramSet.destBIdx = 1;
$ v( D8 w) X0 q! g5 q5 s& ?7 i paramSet.srcCIdx = 0;9 |2 N0 a4 ^4 J( \7 y, j; {
paramSet.destCIdx = 0;
" z0 Z# s6 ?. w: R% H% r8 F3 | paramSet.aCnt = PING_PONG_ACNT;& t f5 }, T/ `. U3 m3 Q0 y- f
paramSet.bCnt = PING_PONG_BCNT;
- ]2 o% e7 S0 m$ y3 E2 r! d paramSet.cCnt = PING_PONG_CCNT;
/ D+ D) z3 h* j; Y # a" q3 E4 j3 i* ~: @
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 o7 n% a5 k/ c# ~/ @1 x/ R! t paramSet.bCntReload = PING_PONG_BCNT;
6 q8 ~7 _1 Y7 E/ M' i; S; c. C0 p6 B# n; |
/* Src in constant mode Dest in INCR modes */0 k+ z) j4 K4 z* L/ q# [( P! E. G
paramSet.opt &= 0xFFFFFFFDu;3 S- [$ F" c. B+ L7 o. J
//paramSet.opt &= 0xFFFFFFFCu;
8 h$ l* @0 Q0 V& K/ { : r' J7 k2 U( J
/* Program the TCC */2 g* M2 E: h+ a7 r7 A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" d" }) N: r6 K4 ?
- g6 `& [4 e! `5 V+ w
/* Enable Intermediate & Final transfer completion interrupt */
3 @0 R8 f4 F8 `' c1 l7 j2 l- Y paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( t/ |* u2 H7 ]' b& R. p+ v
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 U3 c; s) [ g8 y; o A
6 D) P& u$ ?' t: m# M9 Q /* AB Sync Transfer Mode */! P# G6 d" G$ S p6 b8 e5 Y$ C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ e5 \/ U2 t% A' d$ x
' `' \0 O- O* q3 t /* Program the source and dest addresses for master DMA channel */, u/ s6 b* b" I! e
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 g" l. j& Q/ r" B* M5 {0 P paramSet.destAddr = (uint32_t)(ping_buffer);
8 [7 ^2 t! M8 z* b" A" V* m
4 G5 X; x0 N+ U' ?4 d6 H! g /* Write to the master DMA channel first. */
$ { _9 B6 D. v3 ]) m* l result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);) e _! Z6 k+ E7 U$ S: `; }
} 1 j; T2 w0 R- i8 O
7 a+ k; O/ E* `7 Z' }/ e& X4 W result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
z; e. q1 e* f1 r6 a* i : x1 \& r4 O2 {; z& p8 w
if(result == EDMA3_DRV_SOK)
3 Z {9 Z- D/ v& n' Z, l% i {5 C2 H) Z1 y/ a6 k4 [
print2arm("edma3 driver init success.",0);6 V" h- _9 l2 }% @4 _% j5 S
} ( |/ k9 U( d5 U
}' ?' A3 I9 n- O
( c f0 G9 N# b0 B) q5 e
) { q" v4 _, N9 a& h( J3 G) X( lEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( C! _) E0 K( ?. U o7 u/ J+ k. T
3 l" o) b6 V9 ^+ o$ d: z
1 p, G0 G) i J |
|