|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 J( o/ B& m% `# U4 g$ s2 p
#define PING_PONG_ACNT 1
$ s& V0 @9 U* q5 I#define PING_PONG_BCNT 8*32*40
; e7 p. r7 X" c# z/ w//#define PING_PONG_BCNT 1 ' J D N% Q( q- L8 E6 _
#define PING_PONG_CCNT 1
1 g9 J( |/ A* n$ u3 F5 @0 r#define MCASP_BASEADDR 0x01D000003 c4 o' Y4 @$ m* b q" k
#define Mcasp_RXEVENTQUE (0u)
/ T8 d7 n' n" ~- z, i5 I: q+ y; k/ Y+ K
/* OPT Field specific defines */
S! H+ K; s+ I6 p9 ?#define OPT_SYNCDIM_SHIFT (0x00000002u)
- q1 H3 C7 P3 J#define OPT_TCC_MASK (0x0003F000u)
- z) B! I% H) \! Q#define OPT_TCC_SHIFT (0x0000000Cu)$ N; O1 Q# j. z* d k |% I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. V4 U9 q& ]' W d; N#define OPT_TCINTEN_SHIFT (0x00000014u)5 u" F2 o. a# K! R& v
5 Y& p8 V0 V1 r7 g' X- q- K# Y
char ping_buffer[PING_PONG_BCNT];% ?9 b5 o: v% Y& ~7 n5 X
char pong_buffer[PING_PONG_BCNT];5 Y' S2 B5 ]* t" R& Q+ |
( S8 g% r, |" l' n
' R0 e& T& D+ g% K
0 u5 l# x f6 x9 G) q1 F7 S% i2 d9 _& L6 o6 Z
static void ys_edma3_init()6 ~# t! a" j/ o5 v4 D5 F
{
0 e4 [6 u( `7 _9 M8 b& g EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! [- J" l; C) \; _" W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% N) A1 N* Q, ?* K EDMA3_DRV_Handle hEdma;
& t% X( X7 z0 I/ h/ c uint32_t chId = 0;- c: d& u& v0 G3 \7 l
uint32_t tcc = 0;
8 Y) u; r! E3 }- F
/ I, g. i& k- ?2 `& u5 U w8 d% o print2arm("edma3 driver init...",0);
, E1 |$ h( T; l5 h8 G- z( R
5 ~) g: s, {: K+ f. V% c hEdma = edma3init(0,&result);
7 W. {% L+ ^. d if(hEdma)! T7 a" T* I4 P$ ^+ R) N. A
{: @' a9 D) J; Q- X, o1 Z; ?* U; p
print2arm("edma3init() Passed.",0);9 L& U! }. @; ^& F
}
. n; C2 ]( q2 z0 m- `8 j H# M else
7 t5 h e9 c9 S1 k! `( [; d t* g {1 U5 \* k3 T! b. b8 f
print2arm("edma3init() Failed.",0);
( O( N* r& r S% u G7 N! ` }6 Q5 p* F9 Y5 ]( F5 V3 t+ p
1 i5 o4 E: g. O if (result == EDMA3_DRV_SOK)# F2 F8 U3 l* C* F% Q
{- n+ I% W. C8 Z: e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 j5 \% A2 ^4 m+ m (EDMA3_RM_EventQueue)0,5 O# j3 [# ]) A
&edma3_isr, NULL);
8 W* k) y1 x1 o! x }
' @$ i5 h& L1 e5 T* b1 J+ f& K3 ?8 _
3 q$ e }3 d! I0 z3 k1 W7 U8 e if(result == EDMA3_DRV_SOK)& T1 A. Z6 a( G/ _& F+ C2 P6 \6 i
{
m: {: a8 U4 u3 E! J paramSet.srcBIdx = 0; t1 p6 U2 F: h, k$ }4 Z0 {) p
paramSet.destBIdx = 1;2 o; ]) y! n% K# g' ~5 E& I( c
paramSet.srcCIdx = 0;0 z+ v+ O! t, [6 v4 u
paramSet.destCIdx = 0;" U" T7 f* K; y( {( J# C0 d
paramSet.aCnt = PING_PONG_ACNT;
8 P+ ?6 L/ |3 k5 |' l paramSet.bCnt = PING_PONG_BCNT;
: ?! M, a2 D% g& P% S$ u paramSet.cCnt = PING_PONG_CCNT;/ X% A% X- r* S9 {$ x
# r& I6 v& l+ X0 Q# [0 n6 U6 e' |
/* For AB-synchronized transfers, BCNTRLD is not used. */
& [" A6 C# u0 b7 _ paramSet.bCntReload = PING_PONG_BCNT;
+ s$ D* H' o% F+ X( L0 B9 f3 P: B0 g# U5 f( ]2 l2 m) ` x' q
/* Src in constant mode Dest in INCR modes */
1 L+ N1 m7 j3 i( a, N& @ }! ] paramSet.opt &= 0xFFFFFFFDu;
8 Z) {) f; z* y7 w //paramSet.opt &= 0xFFFFFFFCu;& N" V9 h* G u' H
5 d4 D6 R8 L8 C! z
/* Program the TCC */
" Y5 z. @. q/ } c" u$ y- l paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 {1 B/ {6 }/ f
. ^8 U) i) f& ~9 J4 L6 Z* v+ M
/* Enable Intermediate & Final transfer completion interrupt */
% i( j4 s* N# y paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% D7 \; M3 e2 X; ?9 i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) J+ s/ V# Y) @$ ^) L8 V3 d0 _6 r$ X. s" y* {
/* AB Sync Transfer Mode */# O( u- J- ~4 h
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 \& d0 k" h9 i) @
4 p& S5 t+ }9 C
/* Program the source and dest addresses for master DMA channel */
! e5 m( Q: G9 _9 }7 T1 V m paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 `4 }2 |/ ^% y paramSet.destAddr = (uint32_t)(ping_buffer);
' q! w$ N: N- N; n2 @* Q# Q0 d! f) N+ i5 T! w7 @: x
/* Write to the master DMA channel first. */$ c4 H7 P8 b1 W* H, S! U
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 I0 a {, j9 k- G1 } }
+ M1 [& W2 T8 d5 W3 m4 Z0 A$ {( K3 m; P7 A, U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ n5 @+ m& k( ?
& ?5 T7 v% r4 q0 I7 K. ] if(result == EDMA3_DRV_SOK) ' o" [, D( m# d
{( c1 x7 S: t$ j
print2arm("edma3 driver init success.",0);- {9 |7 c# ^! }# z1 x' Q; K D
} / D2 I2 \9 z3 ?1 A5 F& O
}5 v( k' H/ d- q$ m
7 d# s2 e% C' u9 p
0 l# f, S5 A: M7 _3 S0 s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ v; V8 w y* f8 N+ q2 k7 Q2 L
) U* n$ M/ t/ m) m% \& S
" x/ e# @" m% d) P3 u( q. ^) u4 C |
|