|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 W; C: T3 j G" \
#define PING_PONG_ACNT 1
! h: d% k, b5 I( l' T#define PING_PONG_BCNT 8*32*40 7 Q4 F3 `0 Q) u
//#define PING_PONG_BCNT 1 ; q% F6 b2 l, s* @9 @
#define PING_PONG_CCNT 16 H( ]% f; o6 T6 {9 }9 ^
#define MCASP_BASEADDR 0x01D00000, e; ^0 c9 C: V
#define Mcasp_RXEVENTQUE (0u)
/ ~( [) W4 p' B4 I
) a& \- @% R6 i9 T/* OPT Field specific defines */
; i6 T( f; i/ z5 l0 K# D( R+ g) |#define OPT_SYNCDIM_SHIFT (0x00000002u)
( O4 @; W! x6 h$ s+ Y' l#define OPT_TCC_MASK (0x0003F000u)
5 @1 l# _+ |7 L" k#define OPT_TCC_SHIFT (0x0000000Cu)0 Y1 b1 L, L' e, T
#define OPT_ITCINTEN_SHIFT (0x00000015u)4 k% Q! |: u, w: J# ~3 s
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 v( V R/ l* Q" R$ r9 [
# Q* [% H8 a2 q2 J$ s4 k9 t2 T" rchar ping_buffer[PING_PONG_BCNT];5 m4 L+ q2 r+ _& r# f. r% w3 q% L; o, D
char pong_buffer[PING_PONG_BCNT];9 `1 e, P; `, Y8 N
; o; U9 b" M, I4 e& V# K% G
: ?1 B4 p7 p6 E$ j' r8 z3 q, U* Y! _6 Q" l8 \& U0 K; Q% k+ R
& O8 H" g- g6 V( B! n6 j
static void ys_edma3_init()9 C4 w8 }+ {6 h) i# {3 Y% V# s
{ O: j) M7 \/ d* Z5 {
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ `+ ^. U7 J" e/ D' p+ W EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, Z' B: c; b$ m0 f, G EDMA3_DRV_Handle hEdma;4 z- Q* `% o; l: o' w: o2 u
uint32_t chId = 0;% s2 d( O. {* [) }. N% y
uint32_t tcc = 0;
0 P$ |2 j6 y$ F" C8 {) E
- u0 z* L4 N' j: w: c- @0 T' D print2arm("edma3 driver init...",0);
- A% C8 O% j) H. z, I( q" ~' x# k/ S
hEdma = edma3init(0,&result);4 g. d* ^: E! O1 K2 ]
if(hEdma)
: F- D3 z; t5 a1 s {
}7 u! |( V S+ A1 O print2arm("edma3init() Passed.",0);
1 I" N) y$ m* X7 K }
# F' Q/ f; p: W, C" h' d else
$ F% q* @; e% g# n {; B k: F% T" G
print2arm("edma3init() Failed.",0);/ \# Z4 C% S( R8 g% ^
}' H# {# h1 n% o4 y% |
' O* d) z# b) K8 k; T
if (result == EDMA3_DRV_SOK)& z& Z# a k2 `& i1 I9 g
{( W1 ?3 m, T1 n4 y8 F
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( v- _# I* }$ w8 w5 b; ]
(EDMA3_RM_EventQueue)0,/ \* [; G& c, x+ R
&edma3_isr, NULL);
5 Y$ G2 ^9 S) @6 y: d }1 i( W% X( X8 B$ N
* p, V# S7 T4 [) k
if(result == EDMA3_DRV_SOK)
! ]) ]/ r- U6 X9 B5 t- X2 d0 y R {
" F M: ~( A8 v& j paramSet.srcBIdx = 0;/ Q6 {7 k s9 e
paramSet.destBIdx = 1;7 h& A) R. f; z& n! D3 X! e
paramSet.srcCIdx = 0;
% L3 v) e3 [8 ]; {3 }3 ^ paramSet.destCIdx = 0;
; {; @/ q4 w8 e! |1 ~0 Y" [+ X paramSet.aCnt = PING_PONG_ACNT;4 O0 w% n- o, E' X7 m
paramSet.bCnt = PING_PONG_BCNT;
+ X9 ~% T Y) ?3 o% P paramSet.cCnt = PING_PONG_CCNT;: t1 c" J! I3 X) f" J% Z2 K1 c
- S2 G7 ?8 }. y9 f" N( ] /* For AB-synchronized transfers, BCNTRLD is not used. */8 y m2 W& { M7 \) b
paramSet.bCntReload = PING_PONG_BCNT;4 Z; \2 K& f) d! d4 h+ [
4 ~. w" T" w' U# n, G /* Src in constant mode Dest in INCR modes */! h1 |7 R, e+ Z3 M
paramSet.opt &= 0xFFFFFFFDu;
. N4 u4 ?; ^$ Y( T //paramSet.opt &= 0xFFFFFFFCu;$ v5 j9 I6 |) g' Y
4 Y4 s9 N' [( ^* @$ I /* Program the TCC */, {# c5 N1 K# o% K$ z
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 }( p' `6 L$ K: o! z: w3 p, o' ?8 |( T5 [
/* Enable Intermediate & Final transfer completion interrupt */8 \; U3 F2 o$ \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) X A) P& `( R2 n6 H
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);" U9 W# z7 u& G4 Z2 g0 Q
2 b9 D6 v7 n& v
/* AB Sync Transfer Mode */) y3 `* ~ ]& o( g# N( a/ M
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: J$ u# G1 o+ N0 l# n7 t* v
8 J) n7 b9 X+ v1 ]7 R" R* O5 q& _
/* Program the source and dest addresses for master DMA channel */
6 k j: u( I, r% g9 y paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 Q+ Z% O3 ?1 K: |! G paramSet.destAddr = (uint32_t)(ping_buffer);
" v/ [) O0 U5 r! Z$ [, B- k: E& ]& ~
/* Write to the master DMA channel first. */
. W7 @4 p5 @( B. m: Y2 a result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. L: W8 {" ]+ L1 M/ B7 h } 3 r7 U3 Q C- F/ }
" N- K- ]& \/ t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 U) F/ L# L* F$ b k; z
2 G) D% z3 G w' N1 [& t9 e: J if(result == EDMA3_DRV_SOK)
. ?& g4 Q7 v( V1 P- C! z {& l) d) v0 [6 I7 B: U6 q/ e
print2arm("edma3 driver init success.",0);
+ _7 n# ^+ L! z& r. Q1 ] } $ t( C4 S+ M# B
}
% s" s) G8 X* y6 j7 _! I/ P! `+ p) r" @- j% _
2 K' G9 ]! R/ K _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- w/ ~% r' R9 `1 u0 t% u3 m
& _$ [2 y( j; R5 B5 {/ s% g5 b0 _. Z, c2 b, R. r$ \
|
|