|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 u) @- h5 ~( ~6 q, a' P, h#define PING_PONG_ACNT 1
6 V% o1 B$ v8 L- N#define PING_PONG_BCNT 8*32*40
1 w- z9 _% c6 F/ c3 t//#define PING_PONG_BCNT 1 9 Q9 Y2 D1 V' \/ v/ e- c6 H3 q
#define PING_PONG_CCNT 1
; _0 K; W; X! a5 }6 x#define MCASP_BASEADDR 0x01D00000
8 L E5 o" I" p, ]#define Mcasp_RXEVENTQUE (0u)
; I) d6 z4 W+ F$ U' f$ {, @ m, T1 ^. n( D
/* OPT Field specific defines */3 Z" N: {! }5 C
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! r, ^" L' ?) j0 s( T- D( L6 U) X#define OPT_TCC_MASK (0x0003F000u)$ K& y& c( Q2 g% G0 }
#define OPT_TCC_SHIFT (0x0000000Cu)+ s4 m, V( Z4 ~' F* f
#define OPT_ITCINTEN_SHIFT (0x00000015u)# a% W+ {% J- Q7 ~+ i$ D' G
#define OPT_TCINTEN_SHIFT (0x00000014u)
' `: b# `0 M! s4 L0 F- z' m6 A, V! n& C! O1 \) T/ V
char ping_buffer[PING_PONG_BCNT];, @1 f1 x6 o6 y, h
char pong_buffer[PING_PONG_BCNT];$ z5 s" y# l2 g0 J& u
/ |- n7 K. r* ?/ V! W- M
+ x Q" }: f5 z+ E9 O0 r
9 h3 R' F M5 g. y; k4 O. U' F! j& k" ]5 e
static void ys_edma3_init()
+ M& c# g" Y6 N! \7 T* g; j5 c: q{
0 e# i+ K# F, w# N; ^* H9 ^3 _6 @ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, O( h- C h+ l0 B EDMA3_DRV_Result result = EDMA3_DRV_SOK;& s3 |: }, }- Z3 Z) e& r1 O
EDMA3_DRV_Handle hEdma;
0 H: V% O! x; r5 u, u uint32_t chId = 0;
, e v# l+ D% k uint32_t tcc = 0;
$ N1 U; ~7 U- [5 o' {( l- \2 {/ C1 s0 q: q! \5 y2 X1 T
print2arm("edma3 driver init...",0);: c7 R7 Z; _) Z! _
; l. m7 I; y H% R1 ]; f
hEdma = edma3init(0,&result);) |5 P2 s3 V' ^% O3 R
if(hEdma)4 a. [" k/ \5 A# D4 \, `
{
; t+ X" n- v8 @) E) Y; L9 q print2arm("edma3init() Passed.",0);- R/ |0 t3 q2 F* _# [ E
}% [3 y1 R( [/ h2 C
else
1 L, ^# h; q$ s/ j- W5 P {
. O( f3 x% } x h$ P5 u print2arm("edma3init() Failed.",0);& C- _) N/ T' J5 x$ n8 n
}
* u0 O+ c D& [/ f1 T3 f X5 J5 ?) W % z& C+ d! _2 U0 w
if (result == EDMA3_DRV_SOK)- i! S5 F1 A# r/ _
{0 o+ L. e: x9 ?3 x$ P c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% ~' X% A+ |$ N
(EDMA3_RM_EventQueue)0,* C" s% ]# H" x R5 s
&edma3_isr, NULL);
& R+ s4 ]. g: u4 B' c2 o }
: e. r w. o' i% C+ U* ^% P
% n( K) f$ q% c5 v" u- X% @ if(result == EDMA3_DRV_SOK)' ], D7 z* l0 w7 N# [
{1 h: ?9 F4 g/ |0 I1 L8 R' _
paramSet.srcBIdx = 0;8 q& R0 w. B! k4 b
paramSet.destBIdx = 1;
7 d" x2 O3 W; C- N9 {8 [ paramSet.srcCIdx = 0;
3 E6 u# `7 g; n; n T. d! @ paramSet.destCIdx = 0;( T" B3 J2 T0 @, { g
paramSet.aCnt = PING_PONG_ACNT;
1 _1 z2 L' n6 _: P$ _1 y paramSet.bCnt = PING_PONG_BCNT;3 F: K9 O6 j4 f y
paramSet.cCnt = PING_PONG_CCNT;
# j. T$ z' R( l" b
6 K) k6 I7 A, V% z3 _2 Y: h /* For AB-synchronized transfers, BCNTRLD is not used. */( R9 w% W' T. ^. q+ n3 N' x
paramSet.bCntReload = PING_PONG_BCNT; ^4 a5 v6 R5 e7 p
% s+ [. D8 q5 o6 a /* Src in constant mode Dest in INCR modes */) C) t& [* a' X/ X! |! [/ C8 b& t
paramSet.opt &= 0xFFFFFFFDu;
) A. N7 W2 n. O2 q {# l* T* u3 v //paramSet.opt &= 0xFFFFFFFCu;$ Y' |: j2 O' o0 O' N
6 d$ q( I4 A& L7 `( l1 y /* Program the TCC */ Y4 g$ o0 P7 A: u* z, k `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 b3 r, C, e' {
0 m4 g+ {7 A: P4 B* ]$ m
/* Enable Intermediate & Final transfer completion interrupt */
j$ h1 o, K6 {; \ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% x) [9 M, D' y- k. a- @; s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 S1 Y# j+ N& v2 _9 d
8 ~' W( T" ?( r& m3 o /* AB Sync Transfer Mode */
% Z1 i6 n. I' l) Y1 |! M) N/ O) D' B paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 g4 S5 C! W& j" I9 \4 ~ L H- d
9 q* G, Y. F2 b. ?) T. q: O0 o1 F
/* Program the source and dest addresses for master DMA channel */: E) m ]* E$ b4 w; L
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, m Y' K+ H( u* T1 t paramSet.destAddr = (uint32_t)(ping_buffer);9 W3 t$ g5 E/ q
; i) [. U" H2 G/ I& Y2 {' m
/* Write to the master DMA channel first. */
. o+ ~4 A- z, E; @6 v0 V! [# W: {& F result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);2 c& [2 n1 P) m/ v: c
} % h7 k9 ]% c5 F) y
2 s: ?* ~% ~" _ C$ f
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 D, d4 Q) ^' c# ?# E a( Z$ U& Y. q; ?6 S. j, q
if(result == EDMA3_DRV_SOK) ) x! i9 G; z O- S. l4 t
{ d$ h' u' ]5 g9 z& Z# `
print2arm("edma3 driver init success.",0);
9 f- v7 v& \, q }
6 Q; W) |; Z) f0 o) j3 r% [! \: j}% h; B) |8 [, n0 I& m" V" Z" e' X4 m
) j$ g1 Q# b% J
" {2 f Q% ?3 V) ?EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* ~4 B9 B: B) n
6 ?* I& R7 i4 k I8 t
7 J" v S" R4 a |
|