|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:4 t9 l _ ^: h7 M6 v- U; t4 Q6 d( L
#define PING_PONG_ACNT 1
6 |1 z0 l: c- [, }+ t/ g$ E) u#define PING_PONG_BCNT 8*32*40 d5 e4 ]2 ^ G* r2 E
//#define PING_PONG_BCNT 1
% H- Q! o/ a6 f8 @7 y3 j7 u#define PING_PONG_CCNT 15 ]% V2 R" ]/ c! t, w
#define MCASP_BASEADDR 0x01D00000/ X+ \7 @3 v+ x, v1 r6 G
#define Mcasp_RXEVENTQUE (0u)( ^$ w h1 x$ [, T9 r
) }1 r0 j, F5 b8 I
/* OPT Field specific defines *// r. z2 E+ E" }1 o
#define OPT_SYNCDIM_SHIFT (0x00000002u)7 B% Q' v6 e* D9 O
#define OPT_TCC_MASK (0x0003F000u)% n; j4 q- D1 N- a; [* G! K$ C
#define OPT_TCC_SHIFT (0x0000000Cu)- s: J& H5 c2 y' X0 b
#define OPT_ITCINTEN_SHIFT (0x00000015u)2 x5 I. E" u% h& Q0 F
#define OPT_TCINTEN_SHIFT (0x00000014u)( `. W$ @5 ^, M% Y- S
% b$ w6 `7 N0 i# W( z: A: i
char ping_buffer[PING_PONG_BCNT];6 x. F0 J7 k$ @5 i/ u1 ]# i8 n+ \3 r
char pong_buffer[PING_PONG_BCNT];
) ~8 d& y5 s6 a; G7 |7 Y; g* b" ^0 H$ k* E
/ t& o* i% b1 X/ J% U0 @6 t7 O) b6 O/ F( v: z" z8 A+ }
$ n3 D3 d( a0 t; {1 [5 n' T+ Nstatic void ys_edma3_init()
: Q( `# y1 F N* Z{+ C+ t9 w; w* K0 Z8 w' f; v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 ^' B k/ M' H. @, j, @0 o" ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK; x% J% t7 }: B9 Z6 y2 d
EDMA3_DRV_Handle hEdma;
( P7 W- [" R- l2 C- \$ U uint32_t chId = 0;" Q9 \# d7 T- {6 T) o( n1 g
uint32_t tcc = 0;
" n0 t X K- g% K+ ^. h3 C0 M$ e3 L' Y+ E
print2arm("edma3 driver init...",0);$ L* i1 n% ^3 w! [
9 v$ c2 T' c8 n+ i7 R9 g hEdma = edma3init(0,&result);5 |$ i( q- D1 C, s) i
if(hEdma)
' X) @* b2 L: I) n7 ~ {4 D) b( P/ n, D/ z" r
print2arm("edma3init() Passed.",0);- _% F, ^3 g2 P- N0 ?7 a% y
}6 z/ y/ \) f0 ]9 U
else- h+ N% n* E: A: y& Q5 r
{
; n0 U+ M9 A( G9 h3 O. [/ T2 Q print2arm("edma3init() Failed.",0);
& Y X; ]: ]" r0 Q0 j8 z }3 @9 k" A( r- z. ]; ~
# g7 C; p' U, w1 o if (result == EDMA3_DRV_SOK)! y7 ~5 z& P i0 W0 T( r4 r3 O* b# x
{
+ x( M* X% p' y result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 E9 P" K, o7 }" d& h (EDMA3_RM_EventQueue)0,
, p g+ N/ A# J, n3 ^ &edma3_isr, NULL);* y" U9 Y* J; n _6 w' E; V: |$ G) _
}
: X1 m6 i7 }! w7 p1 @# Q
9 h, G2 V. K6 I1 x/ [; f if(result == EDMA3_DRV_SOK)
; l3 J) Q' |. P& v5 _- n) C* B {
( |) ~. w+ v5 o3 f/ @- ? paramSet.srcBIdx = 0;
u+ O7 C0 L# H8 {. O# M paramSet.destBIdx = 1;
0 s! C6 m! o [0 W, @# v( T3 g paramSet.srcCIdx = 0;
% x, N* M' r3 D; M& I paramSet.destCIdx = 0;5 g1 [& F1 L1 b& G
paramSet.aCnt = PING_PONG_ACNT;
* W& _6 ?2 E( q paramSet.bCnt = PING_PONG_BCNT;9 p* g: g6 x+ k% }4 h5 T9 y9 U
paramSet.cCnt = PING_PONG_CCNT;
" M( s+ @ C' |- s, g + ^8 ~# a# t5 V7 h( ~0 q0 i* i
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 r. X* W. F5 M6 v: W paramSet.bCntReload = PING_PONG_BCNT;
8 G3 Q4 S& h5 X7 @3 P& X/ ]3 ~8 Z$ q/ q7 M# L
/* Src in constant mode Dest in INCR modes */
+ Y- ~: ^: m9 d% V V paramSet.opt &= 0xFFFFFFFDu;
* N8 m7 s, k* d! k- g //paramSet.opt &= 0xFFFFFFFCu;
" W$ [: Z& c$ Q; T. l. d7 Q
( {3 u2 n$ E( N( Q+ W /* Program the TCC */
2 y/ j2 f% W0 s6 A: [. B2 ^, k paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. Q( q: j, @& W) q+ |
/ Y f2 Q4 ]" {2 l$ H /* Enable Intermediate & Final transfer completion interrupt */
7 O6 B$ ?" U1 v& I" d: a paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! K! I% _8 g l, t# ^2 n paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ t# T8 F4 O% P: R9 V
1 A3 N! E. A a; h /* AB Sync Transfer Mode */ p2 ~" Q( q2 J" n/ w) N
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# \4 i4 G1 P q4 M5 y
9 v* w/ d0 l% `2 m, j /* Program the source and dest addresses for master DMA channel */
6 j+ n+ ]3 B' d2 j2 h$ C paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ K; |; X& `( d% h+ Z& W
paramSet.destAddr = (uint32_t)(ping_buffer);
* h6 i! g9 q3 J7 T) l
0 |6 ?* ]: s! h /* Write to the master DMA channel first. */; m0 J/ f6 _. P4 v6 }$ W
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 N3 Y+ r$ W% b } ( C, M# V% g$ E" f4 _
- x% `) W0 S& |- T. k. l# w3 { result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ f/ s2 k0 @) U! S" Q
/ g. U; B; U, H6 i5 X2 ] if(result == EDMA3_DRV_SOK)
" H+ s- }2 A6 C% T, }& w {0 B; ], }3 `* _3 }
print2arm("edma3 driver init success.",0);" y B& N) g! T! {
}
* x% T0 @ R8 e* s1 L- i- l}1 `( o6 U2 ~' J5 n/ f2 F
5 t C, F7 v. U# I! c/ k1 U4 H( r7 g/ ^: k O2 q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- H! J. e1 n$ C1 X- N6 ? K( U
, A6 T. P' E7 K! U" d: {( p2 [7 _& f2 _& I+ K. c- F
|
|