|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( C& \/ K9 x3 ~2 T* X#define PING_PONG_ACNT 1
* ]/ E, v) b) i" _+ Z ^# w1 I: n#define PING_PONG_BCNT 8*32*40 , [/ X7 G; Z0 N' C( e
//#define PING_PONG_BCNT 1
9 I* B" b* N9 ]' ]#define PING_PONG_CCNT 1( l$ Q8 }" o* y F) x: t
#define MCASP_BASEADDR 0x01D00000/ Q H/ C+ Y. O+ e' Z) K
#define Mcasp_RXEVENTQUE (0u)& i9 ~/ E ?/ Z. ~$ M
. o8 V3 e! d; {1 ~
/* OPT Field specific defines */' w, G2 x; p' v. C7 I+ V: s: B
#define OPT_SYNCDIM_SHIFT (0x00000002u)1 C; [3 j: [; P) O
#define OPT_TCC_MASK (0x0003F000u)
) |9 E6 Z3 R" Y/ s#define OPT_TCC_SHIFT (0x0000000Cu)) w0 o. V, v9 ]' t! y3 R
#define OPT_ITCINTEN_SHIFT (0x00000015u)# N# Z, v; ~) ?0 G% Y: _ b
#define OPT_TCINTEN_SHIFT (0x00000014u)
" k) Y6 d/ f* m6 b2 R% c4 _& q
8 ]) t' J# K; A0 s* \0 W! Schar ping_buffer[PING_PONG_BCNT];* k3 G' E. q. A+ {. [' Q: {. P
char pong_buffer[PING_PONG_BCNT];
, G/ o O! n/ }& h9 W. C: l, m: T: D3 d
, G# w& J8 ^" L& J% u
+ p+ h; w' F4 M( d, S5 u$ P/ n u
static void ys_edma3_init()7 A/ o2 m0 L0 S- h
{) Z, S* n' l5 Y- Q) e
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ t- A7 a6 |6 X9 y7 y5 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 w, r' G% `2 |! e/ G2 r+ C EDMA3_DRV_Handle hEdma;8 W# _8 n, [: t6 H' y* q( o
uint32_t chId = 0;
* t& o2 m7 w8 ~+ h) ? uint32_t tcc = 0;
& S0 c7 u7 A9 y4 C
' E9 E0 K, g: Q k. t, _ print2arm("edma3 driver init...",0);
4 j; X8 @5 @% y" v# V; l4 v
, t3 r# o& \, N# { hEdma = edma3init(0,&result);0 a- z- R! k2 Q/ Z0 C
if(hEdma)
8 ^; V0 g4 a& {- S2 T5 S2 x$ v9 ` {2 j! |/ _( f. P3 n7 W
print2arm("edma3init() Passed.",0);6 s& j G) e6 i. Q7 Q8 u+ p
}
3 P7 j9 {2 i5 P, ]( m `$ Q7 V else
4 T$ v/ m/ a4 L# u0 G; h0 {6 l {
. t! i, b' @0 x9 e- T print2arm("edma3init() Failed.",0);
7 w* P4 W; y5 O2 W# `. g9 v }( K' d0 \/ \4 D5 z
4 l/ j; i2 U) p8 v: f$ L c
if (result == EDMA3_DRV_SOK)/ e: C4 U {6 X% @! {# y9 q
{
8 O8 I4 J* [; `4 i) U( a! Z result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: z' w6 a! `. _% O' _- b, d (EDMA3_RM_EventQueue)0,5 i' o% f: o+ h" h: q9 `! r4 s
&edma3_isr, NULL);9 x- F% X" S; N* @3 o/ x
}
V" J) W$ s8 ~8 H" m4 Z" U
9 t9 q* Q F# M% }. H# K. j; Z2 L if(result == EDMA3_DRV_SOK)
+ i! A, d9 t( M2 ]& }& E {) ~ X/ v+ m) D {
paramSet.srcBIdx = 0;2 v* I! V/ l: b0 K7 r
paramSet.destBIdx = 1;6 f' u, m, J$ u8 y5 a: Z( Y$ k! w
paramSet.srcCIdx = 0;7 B& J* P) m6 x2 Z1 ^: R+ |
paramSet.destCIdx = 0;
' E( c: b- o2 A+ u1 g paramSet.aCnt = PING_PONG_ACNT;) a( f; S. {7 `6 F
paramSet.bCnt = PING_PONG_BCNT;
. l4 M* V; s: N2 b( y( ]$ s* ]; Z; w paramSet.cCnt = PING_PONG_CCNT;
8 G& _$ d8 |) r! X5 y* U! X " C& ]! Y' N2 z% j
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 E7 y+ V8 d( n) A7 u1 Z6 g paramSet.bCntReload = PING_PONG_BCNT;8 G4 G5 w* G' ]2 C8 p7 D- o1 O. P
: H6 {5 `2 { n) v" K) E /* Src in constant mode Dest in INCR modes */
4 f* _' u8 J/ y0 K I; Y paramSet.opt &= 0xFFFFFFFDu;+ `' T+ r5 K5 W0 y O
//paramSet.opt &= 0xFFFFFFFCu;( A9 p( G& `8 o2 o
8 x2 f2 X: K" o& ? /* Program the TCC */
3 I9 E1 H) p# K" p paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); G3 L; r8 D2 |/ u
( c: P. r2 f5 A6 Q6 S h, i5 o
/* Enable Intermediate & Final transfer completion interrupt */; a* U6 ?% j6 V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. J7 ]2 d6 I' i/ I paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* S5 d3 U% d* F, m4 z y/ T- q+ k$ f+ U) |: p1 R
/* AB Sync Transfer Mode */9 M$ l5 P& y. {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 M! b. [3 L' [5 c6 w; Y) e
" A1 j4 x$ o4 K3 Y3 ^* Y7 Z; `1 }! h# B /* Program the source and dest addresses for master DMA channel */
$ Q( N" U( h$ x _& a k0 f4 n paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! ~# M3 Z: S* z6 I paramSet.destAddr = (uint32_t)(ping_buffer);
! N9 ?# R: H* {% h, m
* H( U: c" G4 C4 D: N8 ]9 D /* Write to the master DMA channel first. */# M8 d- g+ t) E: h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' K) H! e" C+ `8 _# {6 ]/ p
} + C- ^ m' P* s8 S8 ^ p4 ?
2 X6 y6 h$ _0 o; I8 l- r0 N result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 C: l& a" h9 d0 C 4 c4 b+ C& q3 ~
if(result == EDMA3_DRV_SOK)
1 E- q) G, V5 i- Q! \0 I3 E {/ s! S5 M! ^9 H! X9 G
print2arm("edma3 driver init success.",0);' O# z$ P) _7 r+ D
} % y) ]1 ^2 H( e3 p' k) f; N
}4 P" V3 h( w$ l" J( n& }
" ?$ U5 L' `# b& p
& O' K* J- g4 @# O1 C" t* {EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。5 d. M( Y! Q5 N$ o' b0 T
: i7 C& a. a; f/ U) A
3 R- F& x" r$ U( l/ e+ D5 ` |
|