|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- Q% z# e/ ~" `
#define PING_PONG_ACNT 1: Z" y) P, e6 n4 ~( |( t
#define PING_PONG_BCNT 8*32*40
' ]& o/ U6 c8 l! t ~9 p/ r//#define PING_PONG_BCNT 1 + Z1 R' i2 j ?5 j0 z6 |5 V. C4 l$ d
#define PING_PONG_CCNT 1
s/ g. t5 O2 j. h% D#define MCASP_BASEADDR 0x01D00000: z! K& _7 T4 k; _0 @4 _
#define Mcasp_RXEVENTQUE (0u)& n$ A' |5 E( o; E: c
' t D9 J4 n; o& j& e: }0 v
/* OPT Field specific defines */
* ^/ ?, E0 t- n6 H5 f- }#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 A# s, q# v0 f+ B#define OPT_TCC_MASK (0x0003F000u)& r3 z0 ~7 i4 J$ t' h& ^/ B
#define OPT_TCC_SHIFT (0x0000000Cu)
7 p* S. {/ o7 a#define OPT_ITCINTEN_SHIFT (0x00000015u)7 J: r1 m% L8 `3 U3 i7 T
#define OPT_TCINTEN_SHIFT (0x00000014u)
; {8 X+ O8 K, T8 f+ E8 J; H' t; u x$ x* j( z. N
char ping_buffer[PING_PONG_BCNT];/ ?& l9 F1 ~. K$ e7 s. x6 t; [
char pong_buffer[PING_PONG_BCNT];
2 Y) N' w3 M4 U- |8 d7 {8 G% ^+ R8 N" p" h9 h* q# {7 p0 Z4 Q
5 ], a. F0 ?1 l0 H5 }
8 T; n# \: J3 c3 @
( g; P' W$ i; U8 w/ n) fstatic void ys_edma3_init()$ L* Q" H5 O7 Z' L: x# }
{( z& w: ^; J6 F1 R$ N9 M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 H- S8 c$ s0 \3 q" u2 t+ C* H4 k) g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;% E- z1 ~; t8 Z/ ]! N; j3 v+ d8 W, k# K
EDMA3_DRV_Handle hEdma;
. f% ]1 d/ c2 _0 o' ^ uint32_t chId = 0;
2 [8 j: Q( k/ g* u uint32_t tcc = 0;0 I+ g. ~- E" l" \
, ?$ E/ I! d! t* i: O- H print2arm("edma3 driver init...",0);5 l/ ~: @# Z0 `! e$ Y
& ?) b( Y% d: Q
hEdma = edma3init(0,&result);
; M& v Z3 B) |. H \7 S# d: | if(hEdma)
& {8 i; p+ `0 x; @0 w* H" c {
$ c; v* h' M- a; @, F; W- s8 V print2arm("edma3init() Passed.",0);% k2 L A8 [3 u/ P
}# B9 v, T; w8 `( f. r6 a5 E
else
% g% }+ v% U8 e. z {
- W) {4 I( L7 E6 ` print2arm("edma3init() Failed.",0);* P- U* o1 m# I5 U; u/ f% R0 f
}
C9 J5 |. n) _: V
8 l, T( b$ X7 N+ o$ g- s if (result == EDMA3_DRV_SOK)5 N0 v; x/ B2 k
{
o: d- P) ]4 k( X5 Y7 S# A result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- K# _6 \. V7 J/ i (EDMA3_RM_EventQueue)0,) m7 m5 D2 j4 g9 o, k5 G9 D
&edma3_isr, NULL);
) @6 A+ P9 N2 ]' x: H }& y/ z: l+ \9 }9 i$ c3 a
; @3 H0 m# { [: L2 Y; y if(result == EDMA3_DRV_SOK)
( R) s( K# }7 R9 R( t2 k$ \ {( ^2 }- U$ U7 @' C u
paramSet.srcBIdx = 0;) F7 n# W* U/ _ i1 n7 ?$ |
paramSet.destBIdx = 1;
1 v9 E% W: `5 _0 d! q1 ] paramSet.srcCIdx = 0;, }; b1 S2 w+ Y- V
paramSet.destCIdx = 0;
8 i2 C7 t2 m+ P8 t. ]* X ` paramSet.aCnt = PING_PONG_ACNT;
; G4 G9 q( T j, h6 a$ `( q paramSet.bCnt = PING_PONG_BCNT;) s# s0 f) c7 Q1 k
paramSet.cCnt = PING_PONG_CCNT;
, N5 ~5 b* c' _* G: I " Z% J8 }( N7 Q
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 j. C6 O4 j2 P. G# R9 {0 o/ W paramSet.bCntReload = PING_PONG_BCNT;
5 L0 h5 g# U. U1 q& ^4 O0 z6 n4 ~* x; ?7 m) i/ d; w
/* Src in constant mode Dest in INCR modes */
4 V7 _% x7 P2 w- v0 S paramSet.opt &= 0xFFFFFFFDu;
0 q9 a: e, X8 \( a% T3 S7 H //paramSet.opt &= 0xFFFFFFFCu;* H8 i9 o' _8 z k
% w. P+ h1 S/ W* v/ n6 \ /* Program the TCC */* p0 M" \2 e, `& e' v2 I5 L6 f0 T" I
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); n% ]0 A0 p+ G3 c. Y: |
$ w( G& ]# ~ H& O" l /* Enable Intermediate & Final transfer completion interrupt */
8 b$ ?: w( ~& G' r1 e9 N paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' h5 i: B7 b$ g: N: L" ]' k7 ^ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) i1 I5 f1 l+ v& t4 j) h
+ M5 E: C8 t0 I /* AB Sync Transfer Mode */
v7 l u! N g% Q& [& e paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 `. a$ R& ]8 t- Q1 W
6 r* g6 S6 Y7 Q# ~/ p# [' p /* Program the source and dest addresses for master DMA channel */
0 U% {% g, s& d6 s" t& j* }2 U paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 e4 i& ^! T2 v& L# z+ m paramSet.destAddr = (uint32_t)(ping_buffer);
% _6 I2 O* C1 w& M( f. c/ h$ }5 i/ G4 |- o" l0 B0 z* d& z' x1 H# ]3 `
/* Write to the master DMA channel first. */+ B, k5 U! v# ]/ j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: d& n; H! K, J0 s6 ` } $ A8 |) r( {( [4 s/ ^) D3 C- I4 H
+ T* ~6 I# V& V( O! K9 A result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);+ T* f" K& U' y8 w/ v1 U1 L
7 j+ A( G% T. L& ?7 N0 G- K if(result == EDMA3_DRV_SOK) & `" g$ V# }$ \
{
! [3 g+ U& j6 Q* ~2 O print2arm("edma3 driver init success.",0);
1 t; A% ^; E$ M3 O+ y } 3 | p& ?* L6 s1 c" M0 V
}, f! q! w r; o' z
) g) e$ f7 G/ c4 u) D+ s
* h6 r; I) |$ K2 J" PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* A0 f* T5 k) v/ t5 p+ ^ N2 W# C* K5 }+ c9 L. _
' l; ]; `# t6 t+ W3 ^0 |) B |
|