|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 }+ e* c6 C1 _ w#define PING_PONG_ACNT 16 D/ `4 ~7 ~' e0 g- [" k/ b
#define PING_PONG_BCNT 8*32*40
) K5 e1 ?1 _3 }; e# p: @% m6 \//#define PING_PONG_BCNT 1 ! \! l0 E" N) W6 k8 G! j% }
#define PING_PONG_CCNT 1# e4 i0 |& M m8 F& Z
#define MCASP_BASEADDR 0x01D000008 Z8 i. K, G6 S) O$ j
#define Mcasp_RXEVENTQUE (0u). K* z! J5 @, v5 R- C6 N5 C
6 @. I1 f( @1 Z, Z/* OPT Field specific defines */3 _4 ^, C2 c" s% T2 E
#define OPT_SYNCDIM_SHIFT (0x00000002u)
g3 \9 ]9 K$ ?2 D1 f" C$ S#define OPT_TCC_MASK (0x0003F000u)
# d1 z8 b2 g8 Q! O0 I#define OPT_TCC_SHIFT (0x0000000Cu)1 s" ^; R2 D& b9 ^- V$ U& a
#define OPT_ITCINTEN_SHIFT (0x00000015u)7 w; i/ b& J$ C9 q2 u; H0 C% p
#define OPT_TCINTEN_SHIFT (0x00000014u)3 t3 L3 [) `# o/ R, A
+ ~- l% M1 i2 @char ping_buffer[PING_PONG_BCNT];
0 Z# q1 C) x) h& L5 i* A/ |3 j. ychar pong_buffer[PING_PONG_BCNT];7 R( ?: B, I+ e% r f8 g
" F- V' o: S$ ]* A
; a, Z/ Y5 ^9 `' k6 {% m# L
# h% @1 e& o" F: t% F& {
% V, l5 M' d0 A' E" M9 Y
static void ys_edma3_init()
! _5 A5 Q& t2 H {$ k+ ?6 y{0 u l' C5 G% n# V$ b" h! R/ j7 X& L
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 |, I* X2 W2 X* i9 K+ y( I* ?
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 P1 l& @) H5 W EDMA3_DRV_Handle hEdma;
/ j( ]# C# Q6 A' D: l uint32_t chId = 0;! z3 C& W9 g) G. l
uint32_t tcc = 0;( v* J- H. S# F: S
- W$ b% _' ^. Z, d' L6 [2 [% _9 g
print2arm("edma3 driver init...",0); P& t( t$ @& F/ e& C2 L3 O) J
2 ^7 ^" R7 t7 \0 t! t4 I. }
hEdma = edma3init(0,&result);8 J* F; u0 ?; {0 y; m6 w1 u
if(hEdma)' J5 Y; }* K9 e4 q# ?8 S0 \* p
{
" H7 }( M! ~) T( U6 h print2arm("edma3init() Passed.",0);3 ^/ x" X! d& q1 J0 l
}
. v0 w1 _9 U* t% q# i% j2 u else5 O9 l/ Z) Z. E( i
{$ N0 ^0 {/ C$ X; P3 }* Q
print2arm("edma3init() Failed.",0);
& z1 h0 P3 H k, y7 B }' |- I: y" t/ _, H8 h
. w: K0 }) m ~0 g if (result == EDMA3_DRV_SOK)- E$ p- O$ Z* m
{$ X, V( r+ ?4 l; }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ _" P: u+ I- O- G9 Y
(EDMA3_RM_EventQueue)0,7 B+ Z3 w0 Z" U. O" z8 F$ G
&edma3_isr, NULL);
! ~5 _' \# X9 q }
8 y; {& m; q$ \/ U4 I5 i; ?& f
& J3 H( K/ f! e, e7 b/ b; d if(result == EDMA3_DRV_SOK)
9 h3 z; Q3 `( B {
+ u% i" X1 [, u2 n9 ] paramSet.srcBIdx = 0;
2 a3 D/ i) Y9 l' H$ q paramSet.destBIdx = 1;
7 g! |# u+ V- \, ^* V( F paramSet.srcCIdx = 0;
& X$ q, N4 H) G) n L paramSet.destCIdx = 0;- j a' d; n; X9 x9 p7 u
paramSet.aCnt = PING_PONG_ACNT;
0 Z L" Q) ?# C paramSet.bCnt = PING_PONG_BCNT;, @4 k- I6 B- U' {% V- k
paramSet.cCnt = PING_PONG_CCNT;" y3 G" y) n8 f/ i
?4 g4 g2 D. n; |7 Y K /* For AB-synchronized transfers, BCNTRLD is not used. */& r3 `4 y: {& T- z
paramSet.bCntReload = PING_PONG_BCNT;
! n# S1 u) ]. h6 B7 S4 Y y, R! u; \ }/ g8 ^- \& ?
/* Src in constant mode Dest in INCR modes */! H; v- [* C0 o: }
paramSet.opt &= 0xFFFFFFFDu;( @7 r8 |* A I7 u! Q3 _
//paramSet.opt &= 0xFFFFFFFCu;+ T9 t. e7 U1 j
; O( F% o c) w6 T
/* Program the TCC */
/ b1 A7 b$ h. v |/ t paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 Z) x$ G/ V) w8 A$ r; \/ N3 u! l3 p D. ]
/* Enable Intermediate & Final transfer completion interrupt */
( z' @ m( ?& k1 j4 k' O paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);& I5 a6 S7 H4 K4 y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ y9 }( n8 G/ I/ B
. p; J+ N/ s+ P+ j /* AB Sync Transfer Mode */
5 V% H+ S2 T+ D7 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" F# a8 }2 T" N1 ^) m
- z4 E5 @# g" ^. q /* Program the source and dest addresses for master DMA channel */
8 G6 m6 p$ q8 M5 o! Y m paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
N# r- R. r' P7 E' s. V, m9 i9 h4 w paramSet.destAddr = (uint32_t)(ping_buffer);
9 h2 H8 Q5 p/ o& G' ]0 _7 p5 b4 M. _" U4 {
/* Write to the master DMA channel first. */3 W: g7 M: E1 {$ u& p2 M; ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- Y# R4 }& e2 e: v8 Y- A
}
% O' t7 w* Q5 k8 S2 Q( [6 M) h% g. w$ V8 z! ~% P4 j4 S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 y j- W) X. q* `3 L
9 l: h* ]6 g: u1 S9 L# U+ a, I: I if(result == EDMA3_DRV_SOK)
- A7 R' B( n* Y" c, H {( q) F6 b9 S% T: B' ~2 D
print2arm("edma3 driver init success.",0);* z `1 j: a8 N/ O- [. \# b
}
' f1 P& n) {1 ]5 v% h+ ^0 [}. Q3 O6 }) O% X% m/ H" R% ~5 P- {
# Z+ o3 O& [, C: p' ^$ T
/ ^1 J: e# }* o- t1 @EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 c7 c( Y& X4 h+ ]' l* f) g- M- b3 }0 O2 `$ L; M
; f, r: F5 M4 g. ?& _; ~' ^ |
|