|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# g9 C; Q( l- D5 k5 k
#define PING_PONG_ACNT 1
. l# K. d' b9 \) U; [#define PING_PONG_BCNT 8*32*40
! M$ w! |+ W# ]( s//#define PING_PONG_BCNT 1
# k' ]2 f6 x# t l8 x% @2 H#define PING_PONG_CCNT 1- D; I# {8 m# I. g Z1 V1 o% \- ~5 Z& \4 Y4 S
#define MCASP_BASEADDR 0x01D00000
) y+ m, Y8 r% C* N& X( p#define Mcasp_RXEVENTQUE (0u)
# V: Y9 h I7 f- |" N/ _- s- {
) r5 t* v9 ?- j; U7 f& N/* OPT Field specific defines */
0 ` q1 y1 W+ A- q( n) w5 X9 ^#define OPT_SYNCDIM_SHIFT (0x00000002u)
* I( e4 ^& C$ M; {#define OPT_TCC_MASK (0x0003F000u)
( ]7 K# H3 E6 x4 ]* P# X#define OPT_TCC_SHIFT (0x0000000Cu): R9 e. Z$ h$ B( M. i: \' ^+ j( U
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% \; P0 o* Q/ j#define OPT_TCINTEN_SHIFT (0x00000014u)! D$ ?4 u8 O- a
. {7 B0 G: [' `+ n c9 ~* tchar ping_buffer[PING_PONG_BCNT]; h0 X7 `- N' ]
char pong_buffer[PING_PONG_BCNT];' G) ~- q( S: s) P2 J5 J8 t
. u8 ]0 n& |8 b- S, _0 j9 b1 v' r9 ]( S, p0 t: _& E; W3 ~
1 a! R( d# t! L& r' K! ]% M. u) G# M, x9 g, z6 H5 j3 L$ i
static void ys_edma3_init(), q1 Z- t2 R- L7 v3 P! p. J
{7 ~7 T- _4 k, _' `! H% d1 V" W$ e
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 L+ x0 }3 J: J' h+ S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& `8 a$ E' m8 S3 ~. F+ c4 ` EDMA3_DRV_Handle hEdma;$ l! d# e9 C: r/ ]2 G
uint32_t chId = 0;
" |0 d) R% j( b7 s8 i3 c- y \ uint32_t tcc = 0; r' N; h9 N! m( |
/ j3 q& _6 r( P% T' o" c& G! i
print2arm("edma3 driver init...",0);
) f+ h, V% o' o( i
/ B$ r5 |& u1 x9 l. P hEdma = edma3init(0,&result);
$ P9 H2 ]5 ^3 J! I! {' U% v3 R if(hEdma)7 @ Y; V- ]1 w, l% w/ Y
{% t8 Q* }/ M( B0 t8 M4 k
print2arm("edma3init() Passed.",0);5 g! g: k" ~4 [3 | c6 f; x
}
! Q8 s" i3 H- T1 S1 y else
7 c& `# {" C' j6 F& L {/ N4 C+ k# Y: c! c# I; x
print2arm("edma3init() Failed.",0);
: G$ m9 Y: R, v. _ }9 v: Z! _& b6 _5 U. F3 y
+ P8 O! @8 h2 m4 O
if (result == EDMA3_DRV_SOK)- c, O4 u- f( H2 j. @
{
3 a1 K$ f8 i6 z T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 N% k! ^* C6 _- Z5 e' Z
(EDMA3_RM_EventQueue)0,
3 |+ A \. I9 Q# o &edma3_isr, NULL);/ a- q$ |2 `4 a- u1 W/ Q4 j- }! P
}0 W1 Q4 n+ J# `
: Z0 ]' d( x9 U" g7 q5 M2 P
if(result == EDMA3_DRV_SOK)
3 _7 i2 W5 `9 e1 h {) K) E* u+ k8 |4 o2 k
paramSet.srcBIdx = 0;* ?$ M. P0 ]2 ]: E
paramSet.destBIdx = 1;3 k: c4 \* {, H0 v+ J, H# _
paramSet.srcCIdx = 0;; C* ~$ L( @4 ?$ a) ~% T
paramSet.destCIdx = 0;$ E2 q- q$ X6 _
paramSet.aCnt = PING_PONG_ACNT;
9 F8 u2 H* x& y/ N7 T9 W paramSet.bCnt = PING_PONG_BCNT;. q8 w P \4 }# x* v% |/ J- n
paramSet.cCnt = PING_PONG_CCNT;& g* M; p9 T, v [7 C
* f4 {; A- c; M D: d" K8 c /* For AB-synchronized transfers, BCNTRLD is not used. */. n( o/ l: d7 a+ s
paramSet.bCntReload = PING_PONG_BCNT;
- [/ R0 H" A/ A
3 Z7 \5 r! T E/ N: s /* Src in constant mode Dest in INCR modes */0 e) ^; Q2 h1 j$ H* A
paramSet.opt &= 0xFFFFFFFDu;. w) v- P5 ?6 t2 G
//paramSet.opt &= 0xFFFFFFFCu;
8 v; |6 \, z9 M( ^) I; |7 M
" M) S& s2 B$ ~ /* Program the TCC */
K* h6 y% N) M. ~; L. d0 u paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; T6 D5 }+ a7 R+ P* X, a! o) _
% R5 q0 b( L* V, o( v /* Enable Intermediate & Final transfer completion interrupt */
5 _4 [) U" I0 u) e2 ~ _% M" ] paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( c& v" ~3 [* \( E2 b- _2 ? paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& U5 v# D- x! g8 j/ T
" T/ `) C: w6 L+ w# z# l+ i: [ /* AB Sync Transfer Mode */
- X" w U( t, D# u$ H% ~ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 R7 E3 }2 z5 @& r4 G
1 r$ _- |' H9 ~6 k% O( j5 y1 G /* Program the source and dest addresses for master DMA channel */
6 r! v4 l! W$ u0 X' J paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: X$ p3 n, P" G paramSet.destAddr = (uint32_t)(ping_buffer);
: M- N5 J7 t5 g5 Y: R) N- s4 `: W3 a9 S2 I" Q
/* Write to the master DMA channel first. */
4 a7 j! O+ |( \% Z result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); D2 y8 ?$ D9 ^/ x
}
" Z+ j" [7 r, c
9 V7 }4 }: g5 f+ _' ?1 l. _2 Q result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 l5 D# y( `( a% d
}* p8 c6 C' e0 c4 T if(result == EDMA3_DRV_SOK)
5 w4 K% L4 Z8 j4 \" L. x/ X" \ {( k+ }& c# @- ?4 j* R* x
print2arm("edma3 driver init success.",0);
' q; D" T4 e5 O$ J8 \ } & Z Z9 r3 t" a9 ]1 }
}7 f0 r% o8 d' s$ C4 f' _' n
* k, x2 Q; d$ d5 N* O
; r% M! y1 G; b- qEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* T; n- R" m0 [5 U
4 K5 G- L' U) ]4 Q6 c5 m- K( P: K9 T3 A2 `8 N; x
|
|