|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) g- ^3 C- g2 c4 M6 N; w#define PING_PONG_ACNT 1
n" ?" b) x; W#define PING_PONG_BCNT 8*32*40 T% Y3 p1 M |, _: ?
//#define PING_PONG_BCNT 1 . \/ b4 j! \+ f7 F! ^8 E! B9 g+ z
#define PING_PONG_CCNT 1# \( `5 m/ j/ U" a
#define MCASP_BASEADDR 0x01D00000/ r. P! H! v- }: P
#define Mcasp_RXEVENTQUE (0u)
4 v- u M" ], q# |& k9 c7 {7 r. g7 T. B
/* OPT Field specific defines */
' ~* y5 C2 D% u \8 w. j) b# h#define OPT_SYNCDIM_SHIFT (0x00000002u)
, w' g8 ^1 h# @; t% X' O- o#define OPT_TCC_MASK (0x0003F000u)0 d7 \* `" w6 w. l& g: W
#define OPT_TCC_SHIFT (0x0000000Cu)4 {9 n/ N- m1 t/ t; ~( r5 ^
#define OPT_ITCINTEN_SHIFT (0x00000015u) m n' A% a" ^9 p4 v
#define OPT_TCINTEN_SHIFT (0x00000014u)- F9 z& J) }* i: h
5 j4 Z% F O9 j4 Uchar ping_buffer[PING_PONG_BCNT];
3 @ x0 w6 y* l- K1 T) \. C. b1 Vchar pong_buffer[PING_PONG_BCNT];
, ?: R+ [: z. d o8 w
, ~- G- i% n% T% b: i6 C. L1 p# G
" v# A, @ e- A3 D+ _% n/ x
: c8 C5 s/ y" l( z. j7 d$ P" |) s4 |
static void ys_edma3_init()
6 v1 ^- x, o: ~9 N+ D# m{
- ?' b8 t2 P0 i EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: i7 ~3 }/ F' G/ p1 h, m% J, E EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* K6 `3 s/ a: S/ v EDMA3_DRV_Handle hEdma;& G6 ?' W8 g# I5 c2 S
uint32_t chId = 0;
& o& ^* R( J4 K# T, P0 V uint32_t tcc = 0;7 G! b% O: T) D- C8 o5 B
~6 I1 Y* z5 \ d9 X
print2arm("edma3 driver init...",0);
, R: ?8 E1 [# Q( p
! g1 B% n- _. I' o4 L* k4 @ hEdma = edma3init(0,&result);3 e4 f0 O; Z$ X5 N% R+ b
if(hEdma)% W9 j! K7 Z; c+ @
{( w* |# K v6 W4 A$ j
print2arm("edma3init() Passed.",0);
H) r3 G3 m. A! n9 w }4 _0 h7 E" a! l8 `5 ?
else
7 }3 j1 T# o* Q& I J4 y {
5 U1 i, U+ u( u) R7 J8 t% e print2arm("edma3init() Failed.",0);+ }9 U6 Y: f9 b
}5 b' g' D Z/ J6 k! s# s6 P2 j. X
( f9 P+ D/ R( a* _) I6 ~
if (result == EDMA3_DRV_SOK)8 c; ]) L, f1 I+ G# G% b7 T
{ Y$ _& N+ N' n6 T4 y( r% k1 |7 [
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, A, ?$ Z4 t' I" c2 ]: B) s4 A$ Y* o& N (EDMA3_RM_EventQueue)0,# R+ L R, a8 F' h; [3 S* t
&edma3_isr, NULL);/ z1 s" m- l. u2 s5 `. e- M3 Z
}$ ?) \( |0 D" B
4 }7 v: j1 I! f& e7 T if(result == EDMA3_DRV_SOK)
, R+ k9 U* s% ^0 H' C( Z {( @4 q( j- C2 s) ]. r
paramSet.srcBIdx = 0;
# e0 a- J0 p- {* j4 o$ v paramSet.destBIdx = 1;
9 I( ]2 O4 |6 I5 ? paramSet.srcCIdx = 0;- V* W8 {' f0 a, n. H5 [
paramSet.destCIdx = 0;5 f8 U. N% q+ K+ j% ^( V/ E% [
paramSet.aCnt = PING_PONG_ACNT;, u0 J0 b# ]; d( c6 o
paramSet.bCnt = PING_PONG_BCNT;
( [; b; r, _) t3 w) F paramSet.cCnt = PING_PONG_CCNT;
( Z. q0 v6 @0 f; g/ O2 c 1 r9 O+ O K& ?) O' Y
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ c% \& F+ f8 R; u9 A3 e9 y2 d7 e paramSet.bCntReload = PING_PONG_BCNT;7 a' s8 ~ n& t [: Z* S
/ V- @1 @2 d/ o- o" k5 C3 X
/* Src in constant mode Dest in INCR modes */- V1 t& ~, C" E6 A( D$ R
paramSet.opt &= 0xFFFFFFFDu;% O) N# Z9 `6 N9 x! S3 W
//paramSet.opt &= 0xFFFFFFFCu;
( f1 |! S3 S) |- z M Q2 C 6 |( y7 V8 l9 i* M
/* Program the TCC */! n4 ? Z; d' b7 x' r% \4 ] Y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! I- }# `6 ?+ L9 I
: }2 L4 [- w/ s/ j8 y /* Enable Intermediate & Final transfer completion interrupt */0 u2 F0 V5 n& M4 t+ B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 r ` |' k0 n2 g4 k( s2 N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- S. ?8 F$ o+ c4 q6 E2 Y
* x# R% u7 N* K /* AB Sync Transfer Mode */
* i2 e2 D v E5 } m4 Y: N2 _' U paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" W* J5 \8 P/ h/ I) w1 W# q
. Z L J1 H* F" c- c
/* Program the source and dest addresses for master DMA channel */
# m( z3 m0 ~# ^( K& O paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ]- j! A' E- `0 o8 I E
paramSet.destAddr = (uint32_t)(ping_buffer);
0 Y5 @, r& `. D* D" F; z. [3 s1 \0 p5 u. J. @
/* Write to the master DMA channel first. */8 j, C5 |4 N+ G% [1 }
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% J) y5 d( ^2 `6 Y } * u& P- k5 b R! F* m3 |; K( x$ |6 z
) ?4 f4 Y( F L" L( D' B result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 N4 J( ~7 Q- G% P; i
, `: j2 @ k" f# U if(result == EDMA3_DRV_SOK) 4 b x4 ^* `, M: c
{2 u6 k! i4 h1 i: S0 o0 Y
print2arm("edma3 driver init success.",0);* T m" _ p3 P3 M
}
$ @, o7 V" w8 U l: ?}, Q& r0 q1 z) A& f& p
2 \9 B% {+ a+ D' a
1 R! c' q2 L0 d; s' ?1 a
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
5 x6 Q' c4 L4 S/ o1 a
: U0 B/ c( c" L K% B
) _% f3 g% _6 {- _% w# @" m |
|