|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 g6 T" f0 W0 d5 D6 u9 x
#define PING_PONG_ACNT 1- ~6 \9 l+ j4 X. G
#define PING_PONG_BCNT 8*32*40
8 ?" u ]% U* H: \, [0 y//#define PING_PONG_BCNT 1 / @& c+ i$ U4 j% u9 t
#define PING_PONG_CCNT 1
. u: f% I& ]5 E+ k M3 T#define MCASP_BASEADDR 0x01D00000
9 y( q6 H3 y8 z/ g) c0 s4 n#define Mcasp_RXEVENTQUE (0u)' J' v2 J1 H2 |; }: C. D L8 ]
% d9 l, Q2 L1 l4 I9 W0 Q8 f/ H
/* OPT Field specific defines */
! ^9 T1 U; M: M# m#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 Q+ t: ^0 R+ r1 `# K#define OPT_TCC_MASK (0x0003F000u)
& m8 x! m1 b; m$ [- |) U' Q& c( k' u#define OPT_TCC_SHIFT (0x0000000Cu). w7 z6 t4 {; r H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; F8 `2 _ W! {4 f9 v2 [5 \5 G E#define OPT_TCINTEN_SHIFT (0x00000014u)* o3 @3 W; f0 k7 w# A2 F4 D
' |6 e1 u. u4 E2 h! O( V5 Z( y
char ping_buffer[PING_PONG_BCNT];
: h: M8 Z8 z y# h* D1 Wchar pong_buffer[PING_PONG_BCNT];
) O, I* V, O$ o a$ K
( b3 g! \3 v& x2 c" k0 P$ S) T' u) R. Y4 S$ j$ O9 @
* n: o8 o4 u6 C1 R# s8 s
3 X) i; j/ k+ X+ ^4 V+ f
static void ys_edma3_init()
2 {! {) n7 d5 n. X{
) {1 |) w- h7 q2 j" L% p/ e. P EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ H4 C& f+ a; K3 y( P* \ EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. c# C! T" q$ s& M EDMA3_DRV_Handle hEdma;) S4 z% ]2 |2 c7 d0 b
uint32_t chId = 0;
8 T) p+ E! k% c3 Q Y1 @0 Y uint32_t tcc = 0;8 S1 V- C4 v* c' q1 f- ^- J* o" V
, N! _ U# \( j# ]% n print2arm("edma3 driver init...",0);3 q3 F) n- P8 ^2 A7 f: L
, D C2 ]% O1 }
hEdma = edma3init(0,&result);
! I# t8 I# v) p9 S: c if(hEdma)
6 m. e1 O$ d1 e: L6 c | {
8 p* c. A! O0 k5 ^/ B T0 \ print2arm("edma3init() Passed.",0);
5 E* P8 L% ?. W6 i/ E* q, W" p4 W+ e4 o }
- c" [: J9 u( F5 w" j else
/ `6 o/ c2 h! i, a& x& u( L {
8 q* A: |- d5 F% D( g print2arm("edma3init() Failed.",0);
4 Z+ d: y7 e- K% j( R% y( ?+ U } Z6 z. ^; G7 ^* U+ B& ^& w
1 T% b9 H1 V1 A+ \2 K. O& [0 I
if (result == EDMA3_DRV_SOK)
5 v2 k d8 ]8 h {+ U7 w* i+ O* V4 j2 X
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 [; m' z4 C: ]
(EDMA3_RM_EventQueue)0,
! Q+ \% h) \' U* X' P& ] &edma3_isr, NULL);# ]8 @6 v7 d9 g3 O) k( y% T
}2 {5 a; [; e! w M; e4 y: {
9 B4 u" ~/ o* d6 d5 T0 U
if(result == EDMA3_DRV_SOK)9 Z: S: g7 ]: Z+ g
{
8 e6 B. C6 X" r: F9 X. x7 J paramSet.srcBIdx = 0;( d' i& j G- R4 r) c* y( |* t
paramSet.destBIdx = 1;7 l* E# b; \/ x+ ]
paramSet.srcCIdx = 0;, E/ f/ p6 Q8 F. K* N5 P
paramSet.destCIdx = 0;
$ p J, G' v# y: {) H B) m paramSet.aCnt = PING_PONG_ACNT;8 i+ R2 O& H x
paramSet.bCnt = PING_PONG_BCNT;
5 R# ?9 d- i; o# u1 b paramSet.cCnt = PING_PONG_CCNT;3 V5 D# n3 s R. V
; a1 j+ a/ F, L: U: I /* For AB-synchronized transfers, BCNTRLD is not used. */+ l* j$ K% ?9 }6 p( }/ C
paramSet.bCntReload = PING_PONG_BCNT;
, Q# ?7 u6 N8 l- d/ F8 ^1 k% B6 f, b: T: x- q
/* Src in constant mode Dest in INCR modes */) E7 o" ?, B& J; `) K( K
paramSet.opt &= 0xFFFFFFFDu;
3 }2 d/ B$ V. ^ //paramSet.opt &= 0xFFFFFFFCu;9 L! j' }# C& Q7 [
2 l- W; h" J0 R" O3 `/ d J" k /* Program the TCC */
# L* Y7 a# I" r5 \ D9 S5 A" K paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ A ~; a9 m7 U: _6 O
4 [( p8 i& Z! C# K7 }& n f2 _
/* Enable Intermediate & Final transfer completion interrupt */
7 o6 }) P a v w7 q paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);3 M" P6 T' `6 }4 {7 J# Y9 Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" H. d) r5 y8 F8 A, A) M# r. p7 d0 O7 C8 ~
/* AB Sync Transfer Mode */3 u) o" T! N9 V1 Z% Z5 H
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 q: Q! a: T; S d: o+ ] " u7 x9 u* X/ q1 o4 O# b
/* Program the source and dest addresses for master DMA channel */
$ V1 r# c; C' ?2 u$ @; H! d, G paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* r( j1 L; b9 P9 o, [" u paramSet.destAddr = (uint32_t)(ping_buffer);
0 n. [: y! M8 ^0 a, m
8 d4 N; _% h1 U+ B4 M2 z /* Write to the master DMA channel first. */
; ~' A' C" ?; y" c! a3 w! V result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 d: ~' S1 Z, V/ A' F9 l( l } 7 T; G4 s" l7 M2 d5 n
( v `# |2 W/ j3 O! U9 ? result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. e1 g6 i# _7 q( o
, `: T/ D( J! ?$ e# k
if(result == EDMA3_DRV_SOK)
9 o; k1 n; w2 l! L {; i$ ?2 }9 _! n) R7 \8 ?- S
print2arm("edma3 driver init success.",0);3 c1 m6 p* |; z7 I; }+ m: b
}
6 m! {* r& E6 i! B$ A3 R}
$ Q8 @. Y. W- b& }2 R" P* d8 ~! E. V* P9 o9 i9 K; S. p$ P9 Y
9 Y8 L) Z; V$ V+ } I2 W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& j& E3 A6 x5 a2 o/ L( i
( o% y" n8 j7 G, ?
! p8 r" q& f, Z+ B/ _" r
|
|