|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& [" L" w2 M$ G3 W% J S#define PING_PONG_ACNT 16 w4 r4 K) E+ U# {$ h. W! N! E' _
#define PING_PONG_BCNT 8*32*40 0 U. v3 x( b% b# [; f7 i1 X
//#define PING_PONG_BCNT 1
1 a7 i* A, U( r4 n. ?2 H1 m#define PING_PONG_CCNT 1) L# }) M# r1 G8 f3 M. g! ?) ~/ t
#define MCASP_BASEADDR 0x01D00000. B/ K7 y) C( {
#define Mcasp_RXEVENTQUE (0u)
$ H! f/ f. f# N( @" z8 Z
; p# B% d& x1 k5 i4 ?/* OPT Field specific defines */3 H( E1 p& ^# D8 S c
#define OPT_SYNCDIM_SHIFT (0x00000002u)# V7 ?; R* f* @, G! R9 R
#define OPT_TCC_MASK (0x0003F000u)/ L( Z0 j3 u5 T8 _5 ?
#define OPT_TCC_SHIFT (0x0000000Cu)
; o' B2 ]/ D) d7 g9 M8 {% @; z( X* L#define OPT_ITCINTEN_SHIFT (0x00000015u) C ~8 d/ p6 M4 h2 H1 Z9 E
#define OPT_TCINTEN_SHIFT (0x00000014u)! U( x, }; T, E d$ N; B7 }2 Q
. R: X% N/ p" h/ c0 v
char ping_buffer[PING_PONG_BCNT];' ?6 S5 A, J a7 H- p) A
char pong_buffer[PING_PONG_BCNT];. b$ B( M9 _* z7 @" ]5 s# s2 I, T
+ b. }) _' X. O
+ o7 {( l! @* w' m& h8 f9 y% o- ?4 c; l
6 |- L3 H8 A8 y: H- E" \- F2 l$ e4 Xstatic void ys_edma3_init()) j6 l1 z9 d" @
{% S# R( C7 V C9 a! f3 S7 n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 R: a+ T! z' w% }! X, C' u EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; v1 E/ A. E0 ]; H3 o EDMA3_DRV_Handle hEdma;
5 p9 F& R5 i1 T& w# r/ V; Q uint32_t chId = 0;1 R5 O k9 s7 U* L- u9 G
uint32_t tcc = 0;
( ?: i! g: ~; i3 n8 { _2 Y4 T* S- r) G9 x0 ?. w) E( p
print2arm("edma3 driver init...",0);
0 A: p" K2 `7 }3 l& n9 ~) M. l/ m M2 E: ^+ _/ A
hEdma = edma3init(0,&result);
- F6 x% Z5 N) p$ y/ w if(hEdma)
% \, y! k `; d ~0 r* ~! ~ {! v9 T! d& \9 _' q( ]2 r! T
print2arm("edma3init() Passed.",0);! a2 W: ]" p0 K- P
}) L* d5 A* J/ g/ z* F0 I1 u5 k
else
4 E. f D: ~% k, D/ k3 F" A1 R e: r" n {1 Z5 Y% V$ t# Y3 l7 r A+ P
print2arm("edma3init() Failed.",0);
4 ]" Q k/ T1 ^6 r }0 g3 Q! ]" E' D0 q1 Y
7 f0 L' I# j" e: P8 P$ L V- ]
if (result == EDMA3_DRV_SOK)$ G# j: Q q6 V" E- V
{
9 x7 Z( K4 {$ d! E/ D: a result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* c1 u0 U, A& g9 E" R4 N+ S s$ H (EDMA3_RM_EventQueue)0,( |1 F! F# k9 @+ G7 X
&edma3_isr, NULL);: n) u. K- `6 L8 [
}+ R) Y/ i7 T- I/ B; j
9 B. h* N+ R' g" A% T0 ^
if(result == EDMA3_DRV_SOK)$ I9 T- {7 d }
{
! b7 B2 }# f% n; E" H8 C0 K: p: f paramSet.srcBIdx = 0;2 J7 D2 R7 F& X8 f9 I9 v @" W) g9 t
paramSet.destBIdx = 1;
$ z, r% W$ @$ `0 M, H paramSet.srcCIdx = 0;
% g4 L% P& L7 a4 Z# L paramSet.destCIdx = 0;
* @% _, J# L) J0 r1 l# c paramSet.aCnt = PING_PONG_ACNT;
& h* D' q! X8 z paramSet.bCnt = PING_PONG_BCNT;
; [. V3 U3 g$ h% F& x! c7 T paramSet.cCnt = PING_PONG_CCNT;
: V7 u+ s, N$ q; F
: I! {3 W& Q8 V2 e5 g0 e /* For AB-synchronized transfers, BCNTRLD is not used. */
' Q- P! g6 j% Q" c! u3 P( G paramSet.bCntReload = PING_PONG_BCNT;6 v* K0 a+ I. ~8 f# _9 L% _
- w8 ?+ a2 E* z/ n1 D9 s, K
/* Src in constant mode Dest in INCR modes */$ t! B9 o6 o" }2 q" S
paramSet.opt &= 0xFFFFFFFDu;: n# \; S1 e9 v1 k) n6 `2 B7 A
//paramSet.opt &= 0xFFFFFFFCu;, X: j" q5 N& Y) k! W% n
9 k4 L. b/ R# ]$ b
/* Program the TCC */3 r. O4 }( v1 b& |- c$ `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 B. u% H! g) }! @* E c) t0 z; y5 D
/* Enable Intermediate & Final transfer completion interrupt */
$ J& S. I$ A- z" e, X5 s* Z$ x paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ _. a" K7 _" s# |4 `: ? paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 q [. c5 V/ Y& H" H$ M4 x" |0 |% ?; A! c7 b0 |, w; h8 I
/* AB Sync Transfer Mode */
' A: T' w/ D/ x5 y4 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 u3 S5 M ~4 O
+ P0 T# p5 a' q5 f
/* Program the source and dest addresses for master DMA channel */
4 W+ i( O2 T0 v( x& M paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ O6 O# F( i& n6 i ]6 [
paramSet.destAddr = (uint32_t)(ping_buffer);
9 i* i6 v1 B1 Z3 E f& L2 W
$ m6 i& f, C$ T x /* Write to the master DMA channel first. */
I4 E) A; p1 c7 v: d: ?, h" b result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' [4 L* g0 f7 ^$ `# ~2 _0 }
}
8 P' \, H' Z5 ~, E) O A# e" J; T# x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# U4 C z# @9 T$ `+ E2 u6 v3 B
, b5 \1 K, l* A5 d' @
if(result == EDMA3_DRV_SOK) # l" X! Z: E2 `, a+ \
{
$ ]' `5 O- X# b4 Y print2arm("edma3 driver init success.",0);
$ j k: J% V j4 j6 } }
1 u# O6 B9 ]9 X9 I* T! [' g h$ o}
/ Z" _* x+ J) F* Y# _, ^: p; M. [! a* C
T/ f6 T+ t7 a o( M2 r/ D3 A8 i
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# Y8 G) a, ?+ O q, p! L+ e1 R0 Q
/ @4 q& o5 F2 q# e
1 d' L/ R/ t* ?: e+ G |
|