|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ C; B' d$ o: e6 @4 h( L d#define PING_PONG_ACNT 14 V$ n9 o/ \% K8 W7 S
#define PING_PONG_BCNT 8*32*40 / I; v6 b$ ^% b+ _. G) u
//#define PING_PONG_BCNT 1
2 M7 J0 q$ N( ?7 C9 S1 x7 ~#define PING_PONG_CCNT 1 C& }5 H0 h3 u/ _2 V& m' n
#define MCASP_BASEADDR 0x01D00000
, h1 F# z( B6 \& T0 p#define Mcasp_RXEVENTQUE (0u)
7 T& u; v, |) {) `9 s; y4 N$ @4 k
/* OPT Field specific defines */# T" k" A8 S' w
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% V/ F5 n# t8 g9 m#define OPT_TCC_MASK (0x0003F000u)2 d+ v3 s9 g' G. }2 B* v
#define OPT_TCC_SHIFT (0x0000000Cu)
, U8 _# S! ]0 `8 N" K7 E#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 ~& x% C# ]* e1 V#define OPT_TCINTEN_SHIFT (0x00000014u)
2 [3 N" `# k% o2 |: @8 U+ o- q- X/ m
char ping_buffer[PING_PONG_BCNT];
' j: d3 E% m; B! P2 E# schar pong_buffer[PING_PONG_BCNT];
0 Y1 v8 x7 z+ C- e$ W4 i$ t
5 Q$ K& ^- Z/ x$ Z4 z3 w- U6 c7 s8 a- r, k2 ^
/ E. o! u! a: D/ s5 Q
5 @9 y; k2 M2 ?2 {! v% i
static void ys_edma3_init()
# t" E4 b% m) z' g" Y2 `4 j{' `/ c, Z- S* Z1 ]1 u* V
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};7 ^( c! d; O$ u6 D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! B8 A i2 h2 p8 s/ C+ H _ EDMA3_DRV_Handle hEdma;
0 r. o' x: A9 S* ~/ f) L uint32_t chId = 0;5 i' P9 d* Y; ^; |) m( l8 u8 C
uint32_t tcc = 0;/ f, G9 q# `$ ]0 }* H6 ]; V0 S
* T2 d4 y& Q) C8 u, T print2arm("edma3 driver init...",0);, r5 u) A% }- J) } F: {7 z
3 W7 t1 s9 V/ i! r
hEdma = edma3init(0,&result);$ Z' |* d$ m& Z& J+ |+ L' T/ F
if(hEdma)
. i, P, o" q0 e4 c7 I) \- J {
q* D) I1 {1 D& j, @ print2arm("edma3init() Passed.",0);5 t, d; P# _9 m5 f( v* x
}1 s9 K' U/ l5 W# K0 [/ i
else/ f: Y3 f- W* L$ M1 N8 A' C( G
{
3 M2 F+ D8 h c8 e( i, G print2arm("edma3init() Failed.",0);
# L; r M/ t+ J) c& V }
4 }" [- u1 ~0 r8 s
8 @" G* Z F: \- |4 ]5 y& k# K( s if (result == EDMA3_DRV_SOK)0 W5 _. X$ x, x. K# o4 r! k3 v* G
{" ^; d; V7 W7 G/ a1 E
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ }4 {0 B* q) C1 X) m
(EDMA3_RM_EventQueue)0," D/ d7 z E! b8 W$ X- H, f. o5 Z
&edma3_isr, NULL);! E, z) M+ r9 i/ r6 p
}
0 D2 z2 c! A) e& N; y$ K : ~- L) ], w+ ^: P* p# J
if(result == EDMA3_DRV_SOK)5 G, `& U" ?# V+ [2 s% D$ c
{* G% `5 G# A, F3 S
paramSet.srcBIdx = 0;
2 t+ ] A% I* f$ m# C( | paramSet.destBIdx = 1;0 n" m s2 o: X6 B* w
paramSet.srcCIdx = 0;
5 p. [& X6 |5 d paramSet.destCIdx = 0;3 F7 e6 Q' C3 m, f3 h8 |. u8 B" ]
paramSet.aCnt = PING_PONG_ACNT; r+ O3 |; y3 F0 V. t
paramSet.bCnt = PING_PONG_BCNT;
- [* H1 c, ~' M paramSet.cCnt = PING_PONG_CCNT;+ U* `' M2 a a% h) |$ U! j
/ k& _) E) O/ N4 v. V /* For AB-synchronized transfers, BCNTRLD is not used. */
- S2 ]4 [3 E4 B, [7 H7 U paramSet.bCntReload = PING_PONG_BCNT;+ U5 |/ _" m& T7 `; r4 J
" n& n* R; O- x4 P# W$ X" H% i9 F2 b /* Src in constant mode Dest in INCR modes */; ^" A7 K) |- ]: g8 @3 a/ M
paramSet.opt &= 0xFFFFFFFDu;* d7 O% `# F1 o/ I6 e" Q) J. O1 O
//paramSet.opt &= 0xFFFFFFFCu;
) C6 j4 I) X% w& o. v$ c- O' [ x- Q1 h ~7 D( O. Z; r
/* Program the TCC */8 J5 [7 Y) \3 @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- `8 k# W" e/ N' P9 N
6 o1 I1 v& x, r& \& R" d* @( H /* Enable Intermediate & Final transfer completion interrupt */
) F* P3 G0 c9 g1 W. M- }4 _ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: b4 r( |: E: g2 Y) C' J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. n' u& t" _$ y1 n; H
+ z# l. K2 C: H7 @- x. I3 u /* AB Sync Transfer Mode */
3 [/ U9 }0 l) s+ ?7 M0 ?: w paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& i$ `& v" w5 g+ m$ k & p6 j% O) y& Q. b' [5 V0 Z
/* Program the source and dest addresses for master DMA channel */
( G9 w! V( h; E! N& K' P paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);- p6 L0 N H3 P1 o" @- }
paramSet.destAddr = (uint32_t)(ping_buffer);- x# G% C0 \4 a3 _7 @; m# K. A
# t1 T) m, v5 q. N4 i
/* Write to the master DMA channel first. */' N5 {% W' X& B! p; @
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
0 l( R# q+ M3 ]/ w* u9 t } / N+ C# o3 y! L" g& ]3 L; x
1 Z; x n7 T1 m# `* \% n+ M/ C result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) ?2 v# h9 g- N; | [
f* }$ N+ w) Y if(result == EDMA3_DRV_SOK) $ Q; X- G: V! {2 A7 T# q
{: |) c) _ m# O! w& _0 }! J
print2arm("edma3 driver init success.",0);
# s0 s, n3 h1 u, W; B* R3 c9 U }
5 C4 R' Z* [ I: b& h, U3 Q}; e# W& ?5 u( m' n T( D+ r
8 p2 k$ y6 r2 q7 z9 P1 S, S& M" V" I$ p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
t6 E4 t7 i9 W7 _7 O0 y: {' o8 `$ l. F+ E t
9 M4 X( A4 F I
|
|