|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 j. E- ]- N. X; @& [
#define PING_PONG_ACNT 1
& L# G% B/ n( F, ]- k1 E- y: d4 u+ c#define PING_PONG_BCNT 8*32*40
* W* Z/ k) o+ O9 z9 b2 W7 m//#define PING_PONG_BCNT 1 / j, p# b2 y5 D& m
#define PING_PONG_CCNT 1
% G: v0 I% p o/ \; v9 S( ~#define MCASP_BASEADDR 0x01D00000: ~. p9 J" e4 _4 G. |
#define Mcasp_RXEVENTQUE (0u): S f1 [; H! Z2 @- d( M
7 D+ m8 P; \" W1 o( I1 C; Q b
/* OPT Field specific defines */
3 z( x- K, {# W0 b2 _#define OPT_SYNCDIM_SHIFT (0x00000002u): `! x0 U# k/ v
#define OPT_TCC_MASK (0x0003F000u)
* R; ?+ N6 P8 N0 y7 @' S# E3 s#define OPT_TCC_SHIFT (0x0000000Cu)% k, ]" _! p. D# M @; I5 B6 W
#define OPT_ITCINTEN_SHIFT (0x00000015u)' J" a c% S5 w: L
#define OPT_TCINTEN_SHIFT (0x00000014u)
; F4 I* [ s0 N% Y9 Z2 X) R1 f4 _$ k2 x7 h' _1 G; a& i
char ping_buffer[PING_PONG_BCNT];' c1 _7 X/ Z$ ~$ n
char pong_buffer[PING_PONG_BCNT];
( [* q- a5 U; ?; a6 \0 _4 r
) x% R8 a' g2 v- p/ I$ \% }/ N' E2 g. @
! E+ k. _: G* d6 [% U4 F7 C2 q
+ V: i0 U! }1 k. G/ ^
static void ys_edma3_init()# u1 r/ F4 p; }
{ f8 q4 p& R% C) m q2 T2 M- I- J
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; W2 t/ H9 o$ D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 s9 p+ K1 V- H5 G EDMA3_DRV_Handle hEdma;% f# e) ^4 d9 h6 \6 Y
uint32_t chId = 0;+ D/ v) q% u% T0 P& X/ e4 h; p
uint32_t tcc = 0;
( L0 z6 n1 P, T" q3 U7 i1 y3 g6 e! e' R9 D
print2arm("edma3 driver init...",0);
# E: [' w8 o8 E4 i( L% E6 D2 s2 K0 T, F; B$ n" w9 C7 K
hEdma = edma3init(0,&result);+ i% |- D8 n: w! R8 R& N
if(hEdma) h% [" Z0 f: o% w6 b
{
+ O& m4 E3 y4 R print2arm("edma3init() Passed.",0);
8 p/ U% s5 O3 R, H) U }) F* p5 z' B- m* ^3 e1 L
else
- F2 U) ^! u+ f3 k! v0 d {" |4 l0 } @) h. p* e
print2arm("edma3init() Failed.",0);9 T7 k+ w# P% {& `0 d0 |
}
6 |+ t# R9 ?9 m( R& Q( u4 j- v# v
. M8 R, q5 b3 e8 S if (result == EDMA3_DRV_SOK)6 S' G4 o" `9 Y0 b
{
% B' P+ u& O3 s2 z3 W) f. B result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! v: a% M/ {# k" M$ w* v: I
(EDMA3_RM_EventQueue)0,, D/ D8 \7 f' `. l+ @" v
&edma3_isr, NULL);
! M/ P* i# g1 B4 G }
7 E/ f$ K# x, [3 v1 ~ 0 o6 ?1 u' W8 f( L4 J' f" c: k
if(result == EDMA3_DRV_SOK)" v* _. {% Q! V7 Q& X
{
) T8 e6 O; z$ o) M" o paramSet.srcBIdx = 0;) i, c y0 x( ?! u( D w( l
paramSet.destBIdx = 1;/ K& v2 G0 \ B$ N
paramSet.srcCIdx = 0;
6 U+ B* w4 ` p" n8 r+ K paramSet.destCIdx = 0;
. ^0 x- W; j8 h; Y% H1 l1 z0 ]+ Y paramSet.aCnt = PING_PONG_ACNT;1 F' v, e0 c e' p7 U. A+ |
paramSet.bCnt = PING_PONG_BCNT;
$ }2 u4 K% y6 q, @( h9 ] paramSet.cCnt = PING_PONG_CCNT;2 D4 I6 n" S7 O' W# Z* a7 X
. y$ C# H3 Q& t
/* For AB-synchronized transfers, BCNTRLD is not used. */! ?, H9 h& e! e0 }& W
paramSet.bCntReload = PING_PONG_BCNT;: n7 e9 U' C$ N7 T# S4 U8 Z( t1 H! I
* @( ]( @( K) e# i /* Src in constant mode Dest in INCR modes */
W& |. `( l0 E paramSet.opt &= 0xFFFFFFFDu;
* v" z) X1 w! T //paramSet.opt &= 0xFFFFFFFCu;* X6 E' T7 M1 i9 P& I
, H0 ^6 @ g( q8 d/ ] /* Program the TCC */
2 M3 l1 f! W8 a* ?, A paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ f: U6 D) ^4 T
0 R4 U/ J3 _ e1 m
/* Enable Intermediate & Final transfer completion interrupt */) V" b) E1 x, U, c( ^$ y1 e( B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# g4 N1 Z3 }- s' ^& t- O1 i; { paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);2 l* h. p# {5 T
( W2 e4 b! t: o3 m6 z# ]6 J /* AB Sync Transfer Mode */
8 }3 c2 x: U9 E/ t7 v; m6 { paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% G! K) H' U& P3 z% i! |9 W5 z
' z) x$ x1 W' W
/* Program the source and dest addresses for master DMA channel */
7 C. L; I g# T" k) m, r( _ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);2 `8 E7 e" ~0 h6 h; d
paramSet.destAddr = (uint32_t)(ping_buffer);' l! K+ { B7 E' j8 G M6 }
1 t+ x- Y c% s$ r/ ~ /* Write to the master DMA channel first. */
. o7 U& \! P3 o' R$ \7 I, \* a result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% Z" o0 K& ]' z0 _; Y } ' y v' u0 y7 j1 }: H7 F: v
- _2 _9 M) o6 @0 L9 R
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 X/ U, z! K! F# P
9 N. z9 [ g3 S- Q9 R9 v$ i( A if(result == EDMA3_DRV_SOK) % T! K9 B" D' `& }: z0 |
{
# `8 {# e6 b" j5 \ \2 L print2arm("edma3 driver init success.",0);/ S. \9 b- [ T' [5 a& W1 q
}
6 Z4 i& |6 ^. w, w6 ], |}
( N. ?5 m% d' K- B6 c0 ~ M/ x1 K3 @% W3 X! V$ I% j. [
( L5 {3 [2 L$ m8 ?$ Z8 I
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 Y; p/ d: g" H. k7 Y# x" s
u4 E, K( B3 s Q& g
! ~/ D( i2 j, K0 o4 Q* M |
|