|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 L% p) q. H. R/ J0 k% Q4 v, S
#define PING_PONG_ACNT 1
" \4 X: p: m, \#define PING_PONG_BCNT 8*32*40 . \' I/ G, U7 I4 a) t* {/ k9 S
//#define PING_PONG_BCNT 1
6 p3 C" f& V; f3 N. [3 @#define PING_PONG_CCNT 1, \: H* B% x7 c; n
#define MCASP_BASEADDR 0x01D00000
& M# B! d* `4 c% b#define Mcasp_RXEVENTQUE (0u)
/ b& }' [) }) F* y z# ?9 W( W
* G- j) T6 M) ~) a% G n/* OPT Field specific defines */ K; g9 Z* N/ q1 L: ?& N
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 |6 k2 h( Z5 [0 y' v5 A5 H#define OPT_TCC_MASK (0x0003F000u)
_6 J5 y& I8 C9 ?#define OPT_TCC_SHIFT (0x0000000Cu)% |" f7 B+ t- ^+ W, t X* \
#define OPT_ITCINTEN_SHIFT (0x00000015u)' w$ l" `' V) Q% q: W0 U2 j
#define OPT_TCINTEN_SHIFT (0x00000014u)
( l: a) d A0 ~2 \; T# Y2 k* s' ]% Z7 q* A; D& [0 _6 s
char ping_buffer[PING_PONG_BCNT];7 ?- ^" p! f1 m. y* v8 g3 O
char pong_buffer[PING_PONG_BCNT];
H; c! P0 r. M1 Y- Q9 \- {/ B! \% X: G3 p! f, I5 y3 U
# K1 S( ^- P* X& p, @( \5 ~5 M0 B
% [, p2 s" j1 y
* C3 K5 X) M6 i
static void ys_edma3_init()2 g6 A+ ~ K6 T x0 Y& L. u
{( p! X8 O: s5 m% c, w
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 v! g; n6 K6 a' v* Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 x9 j# D2 I* M. G% J3 G J# w
EDMA3_DRV_Handle hEdma;
$ v% t- j9 v$ s6 m uint32_t chId = 0;
6 w! v/ {* ]+ y8 n uint32_t tcc = 0;; V0 p, Z4 v" S3 r9 V! ^
$ _' h8 x) ?3 s( c# h print2arm("edma3 driver init...",0);
& {" [( p1 g; S9 K1 b' _) ]5 x& l( N7 ~+ G7 p
hEdma = edma3init(0,&result);
1 o9 z, r0 i6 `% J. b* ^ if(hEdma); P9 Q8 Q. u+ i
{
! Y: O; x' W: x% o H print2arm("edma3init() Passed.",0);
1 d* M# k4 S- D' C& m' i7 G6 E }
/ G9 i+ K4 Z* J5 n- \+ e) l$ Z! { else7 Q: X4 o& _8 j; S7 F. N
{! X6 @ G+ W$ e6 A. Q! ^
print2arm("edma3init() Failed.",0);
* t( {! W; \# V5 ^! o B }
6 e) M/ Y! |# G; D$ K& u4 n. U1 Y
& w' q8 j; G- B$ r* [" m if (result == EDMA3_DRV_SOK)
. ^8 x3 |' T( e. n& Y3 ?0 j L& B. g' G# \ {8 S7 Y/ Q; W7 n. A
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 L+ E# w n$ J- ^
(EDMA3_RM_EventQueue)0,# C, |! @: V3 V; U5 F* c
&edma3_isr, NULL);$ @& r$ [1 z# u2 Y6 ]! ^
}
7 E& w" A+ c- _* x- W# M " D) z2 S/ ^. B9 a8 h1 ]9 C8 z
if(result == EDMA3_DRV_SOK)" d% i! \5 ~2 O+ A ?
{
* b- N7 T: i' [. e# R4 n paramSet.srcBIdx = 0;
( l1 ?& q! K2 N( v paramSet.destBIdx = 1;1 Q9 g4 Q$ o0 o' S9 G
paramSet.srcCIdx = 0;4 H# a x, A# W0 @
paramSet.destCIdx = 0;" I! {% D% }) U1 v* s
paramSet.aCnt = PING_PONG_ACNT;
$ k8 Y" D7 x. B+ E1 ]: P$ c paramSet.bCnt = PING_PONG_BCNT; H7 y4 W* Q' b
paramSet.cCnt = PING_PONG_CCNT;( S6 o/ m- O0 u9 q5 j9 X+ J
9 h" m6 b, a P( K. s! t /* For AB-synchronized transfers, BCNTRLD is not used. */' D) t$ g- y' z4 x+ u
paramSet.bCntReload = PING_PONG_BCNT;
5 M* I+ I; v2 q) A5 k/ ~
& o( N2 a) T8 |! _ /* Src in constant mode Dest in INCR modes */
7 v( A0 ]: B/ P5 h+ l paramSet.opt &= 0xFFFFFFFDu;
# T5 {& y! B4 y, G; ? o( L( a //paramSet.opt &= 0xFFFFFFFCu;
~ O/ d7 f% l2 g; T u
" l. ]% ^5 w' Y4 z# o# N /* Program the TCC */& c6 v% f. {2 @: m& Q- K S$ c2 G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# Y, `& G3 `+ ^: i% b- F2 b8 }" m! }
/* Enable Intermediate & Final transfer completion interrupt */8 [! P, w( l1 y3 F9 w6 J! f
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 v2 D9 N9 x" ~2 m+ O4 |& c1 ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 P1 X8 X! U& {) a& p& |. K6 E
+ |; q2 Q3 `0 X' R /* AB Sync Transfer Mode */
$ A6 n4 r! F$ t5 S1 y paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 s, F& r) g" I0 H& r . B: o- g" I4 T+ A( K( r# [
/* Program the source and dest addresses for master DMA channel */
" i' J2 F! _. v. q, ]0 q paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: C9 }! d' B' [1 S paramSet.destAddr = (uint32_t)(ping_buffer);3 \" }3 X; } Y: T5 ^: `0 J& p
9 g+ ^9 D# o9 t" k1 j7 v, |
/* Write to the master DMA channel first. */3 J( v. b5 @* G+ {4 H4 V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 T" l# s w. }% y- e! _4 t }
* [$ ]4 ^: [5 _1 f( [, j! v! x C, ?9 B) B3 ?) T( M& _' Y' L& x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! s: D7 J9 C" M
, |2 B/ o7 \- } if(result == EDMA3_DRV_SOK)
) z5 [" L3 a5 z! @. m {
8 D$ r& H6 n2 P, s# J/ f print2arm("edma3 driver init success.",0);
/ ~% [0 |; k5 _# l }
+ i: p' M% g2 W( i}
& C( o' B9 w! b4 e! Y! I9 p3 w4 I
1 h# }+ v& _5 J+ m. J0 _* d
+ N {, V- }- B/ jEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 S+ ]7 e0 Q9 T# U+ _" L0 Y4 f0 V( ? y1 e
% \+ h9 J4 W* G/ J3 I$ d! z$ X, U, Z+ v |
|