|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' ]' Q/ P: v9 |4 X#define PING_PONG_ACNT 1' m+ a$ t3 z- E6 s! D: u
#define PING_PONG_BCNT 8*32*40 ; g J2 V" a& G9 ~ c
//#define PING_PONG_BCNT 1 ' p, j4 e$ k7 k% G1 n' d9 s
#define PING_PONG_CCNT 1
* y' j8 w# }& q& R#define MCASP_BASEADDR 0x01D00000$ j. Y9 T/ N- |2 \
#define Mcasp_RXEVENTQUE (0u)
6 N% u& c" x' w- U0 O1 j# T9 Z% p/ B
/* OPT Field specific defines */
7 c2 F* J6 R4 C/ u#define OPT_SYNCDIM_SHIFT (0x00000002u)
& w |6 t, P- D: M) {#define OPT_TCC_MASK (0x0003F000u)& c; K6 ]7 ]. n% @. Y4 b
#define OPT_TCC_SHIFT (0x0000000Cu)
- r8 D, s& ]8 E+ S$ {: B#define OPT_ITCINTEN_SHIFT (0x00000015u)
4 U! a) H6 Y" P( Q- g b" Z& G0 H! M#define OPT_TCINTEN_SHIFT (0x00000014u)
: K T8 d( `- K) H) V- ?# w- m3 E1 g! S- E# A* e
char ping_buffer[PING_PONG_BCNT];. L* D% ?3 ?: F8 M, e
char pong_buffer[PING_PONG_BCNT];
9 u4 B4 ^% c0 d& `
% T" y- G! P; T, t2 o$ V8 x6 k G* M
- [: W, n0 z; o; K2 r }% _$ ?) P
' Q4 C" t: l I7 |1 d# D4 u
static void ys_edma3_init()
8 [% x6 ~# {& A3 a{/ D$ W0 h$ n3 z( m1 |1 [8 v3 ]
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, [% ?- [! S4 b( a
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) _" `7 B. e6 n* Z+ i0 ^+ X EDMA3_DRV_Handle hEdma;
7 l" {' Q+ o2 t' j6 g uint32_t chId = 0;6 C3 Z; v/ W, {; O; f, z- t
uint32_t tcc = 0;) t h) V, o; ?9 K6 t
$ j& ^9 M' a( L) g" E6 F
print2arm("edma3 driver init...",0);
' A2 J q" V1 ^8 }9 X/ u% d" ^5 E- m0 [: q
hEdma = edma3init(0,&result);
: K7 c2 @$ j) j$ q8 G' { if(hEdma)
. {! E5 [7 s. s: G {+ D |+ ]3 @1 W! F- [6 Z o0 d0 l
print2arm("edma3init() Passed.",0);
7 U* V/ D* ^# {2 V. ] f }
/ ?" S1 h# D. ]0 r- D. R1 } else
. l1 \- t) ~& e, o7 X, G& Y$ o {/ ^4 h$ \1 J/ a1 T" n6 W
print2arm("edma3init() Failed.",0);
) p; e: G( I1 `* I }
! W$ ], |- ]- M' ?; P
! `2 ?/ L7 Z) U% O" ^3 @& D" j) H if (result == EDMA3_DRV_SOK)% O' P7 g) m( U0 T4 M9 l6 Y
{% h! C: G, _' N( O+ o5 F/ \
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ Q: W/ B F% y3 T a (EDMA3_RM_EventQueue)0,
* F; k( \$ y2 k- G; k( A5 z &edma3_isr, NULL);
3 G" ]8 |! ^5 Y$ ^1 j- A }6 z2 L1 P+ ]4 Q
# l! u$ @, z9 L/ \- {+ b if(result == EDMA3_DRV_SOK)$ Z5 o1 @) O$ n3 r6 t6 G
{
1 E+ \" {0 O3 g! o3 O paramSet.srcBIdx = 0;; s2 L/ y1 g2 S) w8 W& p" _
paramSet.destBIdx = 1;& [ b/ ?9 N% V& D$ h: v" w
paramSet.srcCIdx = 0;
- N6 ~, H. T: i( m+ q0 P paramSet.destCIdx = 0;
' l9 R) `' S9 B1 C5 X paramSet.aCnt = PING_PONG_ACNT;% v9 k2 Q9 f1 _4 T2 j: ~
paramSet.bCnt = PING_PONG_BCNT;6 W/ I+ L/ H* m! B- ]9 T
paramSet.cCnt = PING_PONG_CCNT;
: z; M5 C, H7 N% b" H! S9 @& f
$ t( z7 n" K3 E+ s! N- b /* For AB-synchronized transfers, BCNTRLD is not used. */
% d9 F$ {8 N0 G2 G# a! J: b paramSet.bCntReload = PING_PONG_BCNT;
$ c+ C2 C* c P; P; I% w/ ^
+ ?0 c) A# ~( c, V9 L' F) ^ /* Src in constant mode Dest in INCR modes */, Q2 T k+ d2 e% H6 C4 o
paramSet.opt &= 0xFFFFFFFDu;) L, b/ ?% ]# g H& P
//paramSet.opt &= 0xFFFFFFFCu;
; d8 D* W" _, A, E 7 @, G" e7 K5 q8 m" l) W6 K6 x
/* Program the TCC */" k3 N2 k7 F; K8 `8 z7 O
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% r( r+ G8 d k5 F Y9 q0 ~3 u( l/ m+ |' G
/* Enable Intermediate & Final transfer completion interrupt */
* j$ j' Y" a1 N5 s5 v paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 G* [# ]; E& E' |3 x9 ]% j paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! `0 {$ ^$ S, q! I. Q
% g3 w; U- L% o2 t4 }9 W
/* AB Sync Transfer Mode */5 s$ X2 h& l [
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 @ `! d9 w5 h
0 [! n) t0 P. h- e
/* Program the source and dest addresses for master DMA channel */
9 q9 o3 U7 O# M* W paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);( U- @: ^3 e. s; R" g" p6 g1 k( N5 I
paramSet.destAddr = (uint32_t)(ping_buffer);
* \& @. y, o _5 R' ~( q( _8 {! ?7 R8 G1 x
/* Write to the master DMA channel first. */
S; @1 u) S1 n' C; L result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( J# I. @& o+ p A/ F } P0 \2 |; F' ^+ I' r
" |9 @0 G% P, }: G" c/ B" P result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 }9 x& o8 L* v$ C6 p% g3 `
4 [1 _% d% z$ f7 O if(result == EDMA3_DRV_SOK)
( ^& R. H5 p1 p* M, i+ i {
! | b6 W' n+ \# e6 z' y print2arm("edma3 driver init success.",0);
$ K# w7 S* b: s: S5 R3 R } 4 t3 W9 d; x, k3 M' r2 Y
}
: u; C4 }. i0 n4 }3 H
5 t! W% v: p$ b* [4 \6 h9 i
0 v) B* g/ c& z0 \EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) A# u+ j+ A8 o$ @9 d/ N
3 N( D9 F) _' w$ V) a3 L* @ S# ~; z* J
|
|