|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- |/ b* p) P! u0 B# w
#define PING_PONG_ACNT 10 \5 d9 w: B4 ?& s$ ^$ c. U
#define PING_PONG_BCNT 8*32*40 ( L7 K: i' x% s
//#define PING_PONG_BCNT 1 : F3 L1 g- O" ^; O
#define PING_PONG_CCNT 1
& I% ]2 U$ V' b$ n& l+ w4 _9 l. H#define MCASP_BASEADDR 0x01D00000
0 z& z( }4 {5 f# N* j#define Mcasp_RXEVENTQUE (0u)9 A9 k% j% n3 X4 Z
2 N% E Z' C8 ~- Q+ j6 Q, e/* OPT Field specific defines */- W* {3 h1 C1 O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. U( ~" k' `. G9 N% y! R P7 \#define OPT_TCC_MASK (0x0003F000u)8 L6 Q& Q/ S w- c. }
#define OPT_TCC_SHIFT (0x0000000Cu)
9 |0 J9 K) Z- M0 k) |#define OPT_ITCINTEN_SHIFT (0x00000015u)! Q5 h( |; S0 o7 [$ Y
#define OPT_TCINTEN_SHIFT (0x00000014u)1 f) W# t/ `- L! j" o, b& }& L! [5 d
, e. v* p% S: q9 d6 I2 J4 L2 Ichar ping_buffer[PING_PONG_BCNT];' l/ M% _* A+ k% ^4 z! T" w; G
char pong_buffer[PING_PONG_BCNT];
1 ~% X0 K+ ~1 r# y2 V
4 f7 H: k+ p" v/ J7 q$ Q
. X* _( Q6 @" O
# s7 T# ^0 F( J% E3 z( J) |. t4 j& q. r) o9 k+ N2 l( A' z
static void ys_edma3_init()
8 _& `+ N2 q4 ^% T" Y{
: x3 J! n, c6 _6 R* Y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" B4 `5 p9 G. ]5 L EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. V/ z. l2 J. B* V: e) Y- O+ a EDMA3_DRV_Handle hEdma;9 \( g9 z% T" O9 j E9 i- \
uint32_t chId = 0;
, w. g! D$ D6 R$ Z/ g' a uint32_t tcc = 0;
0 D* R4 }: Y8 i Z+ H. z$ M: x3 W/ u, d, F- N- s
print2arm("edma3 driver init...",0);5 N5 `' y( l, c7 h' b4 G
0 m, M7 l+ ]' g& |+ D1 u hEdma = edma3init(0,&result);7 G9 J6 e" J% R6 j% N
if(hEdma)
% ~' c' l6 o5 n8 j/ a$ O {8 Z( w2 i3 r5 t. E$ S
print2arm("edma3init() Passed.",0);
, T3 w/ ~" d. U* {" I6 x- ~0 I+ B. @ }
) Z5 n2 h# V( N5 v# P else0 J+ n S4 E) K. r2 o' I6 `) }# q
{# _6 p. J4 d3 E) C
print2arm("edma3init() Failed.",0);5 B% W- T$ r \: T9 `
}3 x3 e! t' Z: v* Y3 C
- d* W; q2 O8 d7 V$ k
if (result == EDMA3_DRV_SOK)
! O6 D" {0 N' _% z {8 V1 N) o |. Y& j" a; i( T; ]! J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! Q$ Z" ]5 q3 u& W8 i2 z (EDMA3_RM_EventQueue)0,( s/ r: y' H! Y
&edma3_isr, NULL);
" r- n( `2 D$ f% o6 V }
$ ^6 `8 J% |* v! p1 @+ E: ^, c9 K$ ~! s ) H7 S, a5 U8 W7 W
if(result == EDMA3_DRV_SOK)
2 U9 G( T! {8 I; K! h {( X& t; n5 G) Q A+ H& h
paramSet.srcBIdx = 0;
$ N' j# t$ t! ^0 A$ Y) i" ] paramSet.destBIdx = 1;3 S" |$ H8 M7 |9 }/ Z0 o
paramSet.srcCIdx = 0;
& M5 l+ _; [" V paramSet.destCIdx = 0;
1 D* f8 L7 T U1 n9 k paramSet.aCnt = PING_PONG_ACNT;* L! n4 {: Q# z, }7 S
paramSet.bCnt = PING_PONG_BCNT;0 A; N2 r& h5 M \1 j* s
paramSet.cCnt = PING_PONG_CCNT;
! N4 u) h+ }% x7 \& s: e + {$ S7 \7 w7 K. z* s: o; T
/* For AB-synchronized transfers, BCNTRLD is not used. */7 v9 A* a8 L2 h. }" V
paramSet.bCntReload = PING_PONG_BCNT;
a! ~7 I: {. G/ r0 F& K% m9 r8 V4 K7 z$ _2 ~
/* Src in constant mode Dest in INCR modes */" a1 M5 @8 a+ _# t% [7 Z5 W
paramSet.opt &= 0xFFFFFFFDu;/ B. t2 \4 b X
//paramSet.opt &= 0xFFFFFFFCu;
5 s0 h( m- v6 O: A- t' H* O 9 t# f% o% ^1 a) j
/* Program the TCC */
4 C9 A, p) Z* U. S- m& h paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# w4 v' R- Z0 f/ p9 h3 ^* ]
7 i1 r6 R y7 l% P% _" y& m$ v /* Enable Intermediate & Final transfer completion interrupt */
0 x# T P& U7 Y2 T7 N paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 |% |" m0 J) j2 @4 j paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 N9 `# Z9 t% P- Q7 ?
: z7 O$ M( b8 F, I$ b
/* AB Sync Transfer Mode */
: u K6 _: z; U- c$ I6 j) i paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: P5 s6 Z# d% G% N/ F. R& M, R( _
/ ]1 {# l# q# s3 L9 a
/* Program the source and dest addresses for master DMA channel */
7 S; N2 `4 F6 j8 `" `% J! ] paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
T' G2 @2 b0 }* D% \) Z* E paramSet.destAddr = (uint32_t)(ping_buffer);7 }4 z' B4 B0 B/ p: J1 U3 ]6 R6 G) Q
' M' h" {6 [) d& M, J8 q* o
/* Write to the master DMA channel first. */* Q2 m% H, m. Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" E/ g0 I8 {& y; l } 5 B5 s; V5 Q4 {6 a7 U
& X" ~3 l x% k: O+ |
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! R" I2 K- a6 M# U$ h: _
c8 }+ y$ `! W. w- C( O if(result == EDMA3_DRV_SOK) $ i4 B$ W. D- L6 ~1 ]
{
" r7 x% k+ \* q" O* V print2arm("edma3 driver init success.",0);
6 O2 W- `& a/ I4 I" g' [ |1 K } # ?( o* c5 G! C% n! d2 c7 l+ X
}3 S( X( L4 E" {3 P
9 N. k! `3 H" {* c8 b- H3 k, C a% X. w- y. q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 T( ?! S& X! r
; s& w2 [# T9 @7 [& B6 N2 |6 V; m8 T3 X1 y* U' n
|
|