|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" d$ `: p8 }4 a, R' f6 t) H#define PING_PONG_ACNT 1
* |, T6 s/ D4 t: T7 O& k/ a( ~, E& n#define PING_PONG_BCNT 8*32*40
% L( G/ p8 v0 g/ i3 h//#define PING_PONG_BCNT 1
# |, \" D+ j P$ m. G5 X% X#define PING_PONG_CCNT 1* }) K1 x ]' j* l8 @5 _
#define MCASP_BASEADDR 0x01D000004 S7 [2 I( c6 J9 r) v, R
#define Mcasp_RXEVENTQUE (0u)+ W2 H: b/ o2 K0 ]1 b- h' d
% f7 {. ]; l' D5 F
/* OPT Field specific defines */1 `% g5 q3 V) ~! P, [
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: Z; v9 ?' X- `0 p6 |0 L#define OPT_TCC_MASK (0x0003F000u)$ B% s8 s. U6 A {- j5 z
#define OPT_TCC_SHIFT (0x0000000Cu)
" E- d4 b5 o& }/ i H. e% G: z2 g#define OPT_ITCINTEN_SHIFT (0x00000015u)
k2 ~4 {. g6 T$ R% M#define OPT_TCINTEN_SHIFT (0x00000014u)9 I) K4 q1 x w1 V
$ {7 D: L1 t/ T8 U; [0 ~/ a+ tchar ping_buffer[PING_PONG_BCNT];" D( n; A. a _6 z' T
char pong_buffer[PING_PONG_BCNT];
/ r: |) r1 N7 W0 k0 {% C
/ _. D3 b/ Q# s( l0 T8 l l' Y) v% t, z- r1 h; j$ Z5 g
$ v: E7 _. G% H
0 R4 d( W* O0 k3 |static void ys_edma3_init(); j3 o# X" f( |. R
{
, p4 b. I/ l8 P2 h EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: W F+ G, M$ f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 T$ k: s9 P0 r* M" \' T9 y Q EDMA3_DRV_Handle hEdma;' N5 |$ d4 b8 A% C: Y
uint32_t chId = 0;, E2 t3 Q7 s: r
uint32_t tcc = 0;$ {/ b- O' ]# T1 E8 F! D- E9 J% p* y% ?
1 u1 o/ F c- B# r7 ~
print2arm("edma3 driver init...",0);/ a& Y1 G* S1 w3 f' q3 d
$ r) y0 c+ }( J# v2 N( R
hEdma = edma3init(0,&result);
0 i- r0 r2 ^& V9 ]9 _& T if(hEdma)
9 t, P; h1 g: S1 u! m8 w5 \ {& {, z) K5 \# a/ }1 G, A
print2arm("edma3init() Passed.",0);
$ E, L6 o7 h1 Q! N' s. @5 \# M }
1 O2 Y- m/ A( N. B1 q- t else. y4 i6 r, G0 q# S( d; r* L
{0 T0 v6 q5 M Z& |9 D$ R! w
print2arm("edma3init() Failed.",0);& _# ?8 G1 j/ Q" d
}
' d7 N' e: P. {! f. ]- q* Q : A v3 C. P5 h
if (result == EDMA3_DRV_SOK)
* \3 H& `( h0 s2 [- T {/ {0 O% E( F' p( `" @8 \
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! `. M# V0 W$ @* J/ B! i (EDMA3_RM_EventQueue)0,2 D1 j4 p0 P' B% C1 h8 Y
&edma3_isr, NULL);
& T* u( \6 ?+ b5 G! e6 P }
; l% u" V1 l& g% |' I9 G
1 {/ j4 C/ f2 v" P( p3 d if(result == EDMA3_DRV_SOK)* ?4 b" {* l, G2 t; D
{
7 P$ |0 {) h. m# x; K t paramSet.srcBIdx = 0;
* a2 M3 q( n& u$ H( `. b paramSet.destBIdx = 1;) I$ c' x. s8 O5 p' d. [7 C
paramSet.srcCIdx = 0;4 y4 T! }: w" r! ~/ c
paramSet.destCIdx = 0;
* m4 c" q; p5 { paramSet.aCnt = PING_PONG_ACNT;0 G4 z( j& ^ ?$ ~: M
paramSet.bCnt = PING_PONG_BCNT;4 r# K2 {4 P, O" G
paramSet.cCnt = PING_PONG_CCNT;7 g; k4 ^$ d* R5 A5 Z
: m9 H0 R) K* I$ L f5 q+ t
/* For AB-synchronized transfers, BCNTRLD is not used. */+ K) n1 ~# Q$ y; ~- g
paramSet.bCntReload = PING_PONG_BCNT;* f/ O( y/ C6 w+ w# ?/ [
7 i# ?" N9 ]* Z+ d9 r6 k6 Y /* Src in constant mode Dest in INCR modes */
+ C8 B0 u3 { g* ]$ K/ C. ~8 E paramSet.opt &= 0xFFFFFFFDu;4 q; n" E. {- }3 m V: w* h
//paramSet.opt &= 0xFFFFFFFCu;
, H+ q5 i5 @0 @; q
' i. n3 X8 }4 P+ F! A /* Program the TCC */
0 X; ^+ t# _8 x9 s8 F paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 F8 @. @/ U" O* o0 e( Z( A/ ]
: {7 j7 Y8 f A /* Enable Intermediate & Final transfer completion interrupt */
0 w; b$ D9 a: q+ }% ` paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 n% M# N3 _3 l5 `" T
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 l& y$ | G* [! ^1 a9 d
! Y s* Q5 R% U3 p1 @" T
/* AB Sync Transfer Mode */ ?' O! ^8 ?, \' ?$ F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* i; T2 q$ t5 I. M! Y
3 ]* n+ v% L# m1 O /* Program the source and dest addresses for master DMA channel */
7 [8 n5 J5 f! x+ J& v paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% d: X) E: _. t) f/ O paramSet.destAddr = (uint32_t)(ping_buffer);
" x9 z, L5 t/ o$ Z: b4 e; m3 @1 a
4 D' R" p1 P" K- P* A* q /* Write to the master DMA channel first. */% l1 i$ N }" m9 B
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);; a z" k( i1 E# f
} : U: i& N$ A! h4 A; {( t* t
8 u& H/ u1 ?$ a5 t/ p' p) t( L result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; k% U T9 \3 L4 f " H- |6 t, L; l% M! j) }2 e( o
if(result == EDMA3_DRV_SOK) : e5 }8 u) U" i1 j
{5 u' v: d# F2 y }* c4 v
print2arm("edma3 driver init success.",0);
+ H# L) i5 O9 m, l }
. u3 ^. |% M/ {- A}# e( K8 }6 {7 F7 b6 ]' }% d
; I: R: K" p5 ~2 ^0 W$ ^+ I3 @8 W, {6 E
6 c8 p! T* C, {2 y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 L( M1 l% P. U+ t, D6 j- }) n
9 p& l7 n7 ~- E$ B! [8 I- p( }( g
1 v: e) R6 C F |
|