|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% B% d( z: A. v. p: s/ n( h+ \; ]
#define PING_PONG_ACNT 1
6 {; G: o; n4 [# E: D: \ ?" H* ?#define PING_PONG_BCNT 8*32*40 0 a4 j) ?) _0 a" n8 e
//#define PING_PONG_BCNT 1
/ L! h. S4 O: \6 N) {- h#define PING_PONG_CCNT 1
0 q2 U0 K* U( n; k2 x! A+ L#define MCASP_BASEADDR 0x01D000005 t5 z* [- ?1 G; v! |$ H
#define Mcasp_RXEVENTQUE (0u)
! ]$ y. Y0 v- G( |! G% R& x' Z
- d) l) U# O/ h$ J/* OPT Field specific defines */
* H \$ v/ u: x" J" ]$ m" _" Z#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 m" Z# ^& x2 {+ Q# ~#define OPT_TCC_MASK (0x0003F000u). h1 Y* ?7 k- e! M
#define OPT_TCC_SHIFT (0x0000000Cu)5 v" a& l6 r" _5 I) O3 L2 p& U( \. Z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. W, m9 F: t# }1 z( Q#define OPT_TCINTEN_SHIFT (0x00000014u)
* W& [3 M: u" O8 A% B; u
; a: e3 |: R3 X# u2 ] `char ping_buffer[PING_PONG_BCNT];
0 a$ L; g) Q% y0 w* |char pong_buffer[PING_PONG_BCNT];
1 x1 q: ?) D+ O) P9 u9 J4 A
: ?' Z/ _( [4 K1 ^- P
5 T; R! o5 s$ O1 e" E
0 E4 v6 t, |2 d9 j D& _+ X5 U
static void ys_edma3_init()% K0 Y8 P; q* y7 @( ?0 z
{: J! X) A& I, _: F
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, q/ c, _- y; X EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- E3 Z4 E' {# { EDMA3_DRV_Handle hEdma;
, w/ ?; L" t {1 Q, b9 d8 G uint32_t chId = 0;
$ I w9 a$ u# v) i9 @- O0 e. V) Q uint32_t tcc = 0;0 M" r, W' r5 y0 S
/ d* U' F8 y: b/ b) l# |5 W print2arm("edma3 driver init...",0);9 B- |: |5 v7 P, n+ j+ s7 q$ Q
" @4 |" n4 t, C( k$ Y+ _" Y
hEdma = edma3init(0,&result);
' E/ |$ N/ L5 @7 I3 Y' L) N if(hEdma)% t/ K4 y. C" v0 E9 Q( \
{' Z$ p6 d, p1 J' @" ~
print2arm("edma3init() Passed.",0);9 q7 f' Y. R7 U' c
}2 A; O% K8 `$ `7 K/ o6 v8 \
else6 C# t7 w7 R9 A9 z! z
{& |+ o! y7 ^+ o& n& ]: @
print2arm("edma3init() Failed.",0);
! N" _* {+ a" w; K/ D" Q# V, U7 `- z) w }
! F: s# U' P# m4 {4 Q' K" A
! h2 }& S7 M& M: U$ y* b D8 Y$ ] if (result == EDMA3_DRV_SOK)9 u3 U0 z. I: w- ~
{
6 S7 x- C0 W/ v: h result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 j) _- u5 u4 M% o6 G
(EDMA3_RM_EventQueue)0,! S+ z9 ^3 @' y
&edma3_isr, NULL);
D) g! P* ~- U. P, x) s, N8 x6 F }
4 |- S' X9 t$ x; g
4 j& i4 d- j2 {3 {$ ? if(result == EDMA3_DRV_SOK)
, l/ s8 k. F( p* j" w {
* H) `6 ]( O7 q4 _, l7 q* L7 p% T9 ~ paramSet.srcBIdx = 0;
) E7 {' u+ x! r9 N# | paramSet.destBIdx = 1;
+ K% s6 k' V& O4 k; W4 y paramSet.srcCIdx = 0;
* I6 x3 c3 e+ ^3 L paramSet.destCIdx = 0;+ D w: C9 s! h2 V2 r( S3 e+ }
paramSet.aCnt = PING_PONG_ACNT;, }8 H! l7 E5 }9 w) L
paramSet.bCnt = PING_PONG_BCNT;
+ C; [ P: y1 W6 i, S& ? paramSet.cCnt = PING_PONG_CCNT;
; s; w% A; @* Z# N7 P2 r/ A- M* }) V ; N& G. p' `1 ^. m
/* For AB-synchronized transfers, BCNTRLD is not used. */8 W! M4 g: x+ G0 S5 ?( {
paramSet.bCntReload = PING_PONG_BCNT;
7 Z' p7 z6 O' v2 h7 c! A
3 m" _4 l. `, E /* Src in constant mode Dest in INCR modes */2 o: {+ [3 N( N! M7 B
paramSet.opt &= 0xFFFFFFFDu;
* T% P1 q( Z) \) V //paramSet.opt &= 0xFFFFFFFCu;
/ W6 z2 E$ F/ V3 {$ w4 L I1 k4 O
5 N0 [1 s* b o4 w i6 B /* Program the TCC */
& l7 d" n4 Z3 s3 m) q" G/ U( `# @ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% h# g5 m- ^+ E9 l. k9 E
: o4 A7 z4 P$ y3 y; w; | /* Enable Intermediate & Final transfer completion interrupt */) T% _; r9 `9 t9 `5 B: ~
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. e, {+ Z/ v0 s2 v% b W; t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" Y* D0 E6 K) O3 T% s6 G* j
, V$ D" b1 r! w, K: Q9 n. N /* AB Sync Transfer Mode */
% j5 _7 ~: E- O6 o1 L* u- C paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
y" n6 S. g9 d, R7 Z1 K
6 ?7 `/ U0 `3 l+ C0 F) g /* Program the source and dest addresses for master DMA channel */
( W( t7 h t1 W5 i paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 N8 [, A) }1 c4 a9 ] paramSet.destAddr = (uint32_t)(ping_buffer);
! x, ?! O b! s+ {: \; E3 K9 n( _: _6 ?! C3 Z" t2 {# h. j1 p
/* Write to the master DMA channel first. */
6 V, l0 I( {! {- i6 i& e2 u. H" c: Z result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 ]: i' q) M. r# S } - U9 |% R1 | G$ `1 O; K a
) i1 k) ^9 i# @
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 M$ e0 }/ o# I3 k7 Q6 B. V" c" ?
* c5 |- K9 U: f* n7 t
if(result == EDMA3_DRV_SOK)
0 s4 {) ^' J$ Y* o- r# _, D3 q8 J {( X7 M v- X* B7 h% z4 U( C
print2arm("edma3 driver init success.",0);+ g" [* {- _" q/ }! H) z
}
3 Q: Y8 X0 N& X4 ?% D) F}& \3 l# w0 ]" y7 J) O2 b7 I5 E& K
1 u! G. l4 N* R! t9 `+ Q; N) \+ g3 c4 g6 J: f
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ }4 P4 o& R3 A; ?
% U; ~7 W B6 `6 n: |% p [$ s7 V0 V, S) ~8 k1 l& y
|
|