|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 l$ V' k1 B% N" }& d" P# |1 G* W#define PING_PONG_ACNT 1& ?2 H% y( X2 z& i- R! n# r0 d& ^6 V
#define PING_PONG_BCNT 8*32*40
3 c8 Q6 _) F. a8 F E) y//#define PING_PONG_BCNT 1 " E- h% G( r! }/ f" X9 Q
#define PING_PONG_CCNT 1 n/ s8 r: o4 q( Z- O$ ^; \
#define MCASP_BASEADDR 0x01D00000
! T6 c# N* O6 L0 A#define Mcasp_RXEVENTQUE (0u)) N7 ? M, e- }$ _" Z
" k/ b' Q% t5 K/* OPT Field specific defines */
( j7 U) V( M r" c9 |* {#define OPT_SYNCDIM_SHIFT (0x00000002u)
) |: J$ l: B- @8 X( O#define OPT_TCC_MASK (0x0003F000u)
' W7 S. f( h3 b9 @) ^" i( c#define OPT_TCC_SHIFT (0x0000000Cu). _! m/ ~' s( O1 A# l) i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* Z# y9 J/ Q; ?$ F4 J9 L2 |1 M#define OPT_TCINTEN_SHIFT (0x00000014u)" B7 ]# @4 |# U, P3 T
' Y; V9 r. J; z. ?, J" A
char ping_buffer[PING_PONG_BCNT];
8 b) G6 F( @9 l6 z+ lchar pong_buffer[PING_PONG_BCNT];! ]# f# s* B1 g8 w8 H7 }% w) S
% w% I, c/ } N; K6 W/ `1 i. S6 t4 Z6 J
) o/ r9 p4 }1 R8 r+ l! v
: M: m6 n5 w; E/ ~" o6 F3 H: \$ qstatic void ys_edma3_init()
2 w% x/ v- k# u; j) ^{' n" a1 I e$ t& a5 Z4 h. B
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};# ~* k8 e4 V0 n1 Y |
EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ \4 V9 i2 T/ Z+ N3 g; b
EDMA3_DRV_Handle hEdma;" r$ y" o M- n4 F2 w
uint32_t chId = 0;. a0 \ p: `& i" F" C+ n
uint32_t tcc = 0;8 [+ [. b3 k$ {' n: E9 p5 u# d
5 O m# Y, ]$ r& H B; A# L print2arm("edma3 driver init...",0);
# M, r7 W! a8 o' k' L% C; g2 k5 T, w& J4 g, e
hEdma = edma3init(0,&result);
& `/ P/ a5 x& T* S. ]* H if(hEdma)
% M# ~" l3 w7 _1 I. l* D6 o {9 Z! K& l Z: u
print2arm("edma3init() Passed.",0);5 h4 U9 s! ^' N
}
' u' k7 W. A" l4 O) t" m else
9 P4 [9 C2 u8 s7 k/ j: N- _7 ]9 i {
- }4 R) l3 f" I5 ^3 z& w6 U print2arm("edma3init() Failed.",0);
8 r7 P# I! k: u& \8 a+ ` }& R4 z4 ], @- E/ `/ v7 g
. p, i6 K4 e% k if (result == EDMA3_DRV_SOK)
* v2 @; [. L7 ? A+ `4 _( G$ P {' e h1 U* a \4 K6 o6 @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 S; G; C7 p9 J
(EDMA3_RM_EventQueue)0,
# B; `; c4 ^5 O! U4 q2 l &edma3_isr, NULL);5 X4 v& p+ E- i" R
}
3 J9 Q& K$ Z% @" J! C9 N % p* F, P* x! {' |; m
if(result == EDMA3_DRV_SOK)7 u2 P" M0 j Z, M' v* n& a4 t
{
3 r0 l* p2 S1 O) T- `' b: X' }( H paramSet.srcBIdx = 0;
+ C5 w0 Q: n8 h! U+ j1 ^ paramSet.destBIdx = 1;
# A5 Y5 {( s4 R! Y paramSet.srcCIdx = 0;8 z# w' O" M% i+ ?! o
paramSet.destCIdx = 0;
& a" ~# x7 I: j+ s6 H+ t7 ] paramSet.aCnt = PING_PONG_ACNT;
' L) j+ ]* U0 L5 z7 O paramSet.bCnt = PING_PONG_BCNT;
p/ F3 j" x" e I; `. W! f paramSet.cCnt = PING_PONG_CCNT;/ C8 M% B B1 }2 p' I# f( a# R7 X
; I/ ?, K" C" `& J /* For AB-synchronized transfers, BCNTRLD is not used. */# o3 M2 H" n6 u p6 B$ b/ Y
paramSet.bCntReload = PING_PONG_BCNT;
$ P& D. ^* Z f6 u) h$ r8 W7 u4 R% R* K; F5 t/ f
/* Src in constant mode Dest in INCR modes */7 C: w5 D( H4 i8 j2 `, W5 V
paramSet.opt &= 0xFFFFFFFDu;
( }6 g9 n( h/ M3 ? //paramSet.opt &= 0xFFFFFFFCu;" t4 _7 Z8 N- I
: ~5 h2 {* q# ]. `5 b3 x
/* Program the TCC */
2 w3 z5 e$ Y7 g paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' q5 S0 f8 Y0 r2 D! W! x, ~4 \
2 G" {$ T9 b" M* u) H0 h' }! P /* Enable Intermediate & Final transfer completion interrupt */# \# D" l9 u1 p* Z' u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 A$ x1 l2 }* X# b0 e7 N" U* { paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, n5 F+ g O6 R2 E7 U( j6 W& z- e
8 O" f& K8 U: ` C G /* AB Sync Transfer Mode */
9 B' Z: @. A4 Y1 h, u. I paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& }4 G. R# Y1 F$ g9 S ! F6 P; s" N" Q; S
/* Program the source and dest addresses for master DMA channel */) e: K( s" ?( B6 D% u/ `7 c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);6 B3 B3 ?- R' x. ]) L( X+ s7 }
paramSet.destAddr = (uint32_t)(ping_buffer);
6 J+ E; {1 z0 c) W. ~( M3 r6 j6 b( T& p/ C
/* Write to the master DMA channel first. */
5 V' X& D9 O! E( I result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);7 V3 y& ^2 K* z1 I+ m
}
) H, G. ]/ K! K! A) g: n, L3 G% \1 l f
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( l% I" O: J. I- {# D
$ N, `5 j* \" O. X- B. ?
if(result == EDMA3_DRV_SOK) 9 Z0 K) a) Z6 c. i9 y1 ?
{
9 {2 m( {$ d2 ?, y; z4 s2 \' M print2arm("edma3 driver init success.",0);' M; ^! D7 z" _' T3 j
}
8 o0 P1 [' T* N8 U; o. Q}
- I& z. p# C5 d: O) D" i0 }/ @7 ]) H
, V0 j' P! E; h1 x6 vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- n. E) \8 s9 {- G/ f7 }& `4 V2 m# P
7 M% b* p" H1 \2 f
, N, B! u: i! N |
|