|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 \- E4 c N8 R. l3 b
#define PING_PONG_ACNT 1
5 _. x. c8 ]( ]+ s+ e N5 l; n3 O3 D#define PING_PONG_BCNT 8*32*40
; |# {/ N5 M- O/ }//#define PING_PONG_BCNT 1 X: P' |% u, s6 K& C7 q: I' _
#define PING_PONG_CCNT 18 j7 g" s; M- h! ^
#define MCASP_BASEADDR 0x01D000006 q" B8 O& s6 e/ ?) H& B: ?4 H
#define Mcasp_RXEVENTQUE (0u)
6 N% _. g, ]' o" v- n7 [
4 g' A8 L, {6 |- M) T$ C/* OPT Field specific defines */
9 y* _/ t" V4 G/ Q, ?- n y#define OPT_SYNCDIM_SHIFT (0x00000002u)
i$ a6 z+ i! Z( B$ r" h( T#define OPT_TCC_MASK (0x0003F000u)2 O/ v/ i* [% D; L8 R7 L7 D# h S; H
#define OPT_TCC_SHIFT (0x0000000Cu)
! Q X& b" N9 m#define OPT_ITCINTEN_SHIFT (0x00000015u)
( `3 ~0 g' ^1 L/ O$ {#define OPT_TCINTEN_SHIFT (0x00000014u)+ o# @7 E7 m# G, j% a z5 T
/ J+ o* M5 w& g0 M4 B. ~1 F. T, _
char ping_buffer[PING_PONG_BCNT];
9 B/ e" r' m1 q' M3 c8 [char pong_buffer[PING_PONG_BCNT];
7 M4 b$ |) E; b
9 \1 ?$ W+ f, S$ j' @/ v
7 r$ z W1 B5 X l( ^2 H( f
3 }" ?0 l& W: T* E7 f- l% C
# a; x! h# v2 x3 sstatic void ys_edma3_init()
0 w+ l% g; h, _' F- ]+ y$ |+ s{
9 Y. \3 c7 H% \6 q2 B EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" l/ x9 u; o# e: E* f* p( p* o EDMA3_DRV_Result result = EDMA3_DRV_SOK; M9 R9 v8 T+ z1 d2 U$ q
EDMA3_DRV_Handle hEdma;+ B9 L. H* A* Q& D7 H' d" _
uint32_t chId = 0;! R( S Z; C) O
uint32_t tcc = 0;
( _; C6 N0 _% i, {+ N
6 W# o0 w- S) Y) N9 l' C5 b print2arm("edma3 driver init...",0);' h. W3 y8 f( w; r/ K( h
* M/ E9 z# m% d& | hEdma = edma3init(0,&result);1 Q- U) }! F. r1 r
if(hEdma)
# \7 u" u8 b% }% p4 e0 n {
) ^& `5 |( U7 M print2arm("edma3init() Passed.",0);
4 G& D1 E4 i1 i5 s: e2 O }, w' V. o- J- a4 {. f+ d4 I, ]+ K0 n8 |
else: e$ c6 w0 l9 k; f9 y" i, s8 d( W
{% e( a' \; W5 s
print2arm("edma3init() Failed.",0);
5 i( Z+ Y7 ?$ o& l }3 f0 y: ^1 H, Z8 [) N$ Y6 N# _
v7 u0 w* T* ~( o7 w4 @ if (result == EDMA3_DRV_SOK)
, p; b3 O6 X/ d) w1 b! d5 k' ^- z {4 { L$ `9 n) G
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ g/ b. x5 g4 s( \+ |
(EDMA3_RM_EventQueue)0,4 ]6 ?/ h- e4 O* F' m1 f8 p. `
&edma3_isr, NULL);
v/ i8 ], e. C) w$ { }+ v4 B6 s; X2 |# s& Z1 n/ g8 g
/ Q$ M6 J, t8 N; c
if(result == EDMA3_DRV_SOK)
4 H; B: q5 p( J4 j( W {
1 X2 P5 z8 B8 J) J2 ?8 I/ V paramSet.srcBIdx = 0;
9 a4 m7 P( E2 B/ o9 W4 b paramSet.destBIdx = 1;) k8 i4 |4 s+ i, i# K& W
paramSet.srcCIdx = 0;
1 W- X6 u* O8 d2 u- h; R5 ~( R paramSet.destCIdx = 0; ]% Z" g! D/ O+ p5 e$ O! o
paramSet.aCnt = PING_PONG_ACNT;- ?8 U0 q) \. d6 ?- c
paramSet.bCnt = PING_PONG_BCNT;
1 T% j, h+ h* b# T8 K. H paramSet.cCnt = PING_PONG_CCNT;
4 y) E- ~% {2 I: L6 U8 l
8 h d0 h0 ]1 _' t2 l /* For AB-synchronized transfers, BCNTRLD is not used. */ ~! m5 N! D0 z5 }
paramSet.bCntReload = PING_PONG_BCNT;
, p7 ^$ U% X: ?9 L6 ?$ l8 X, g% T
! T$ x2 N _4 R /* Src in constant mode Dest in INCR modes */2 S' a8 j" {3 v' W; E; j/ D
paramSet.opt &= 0xFFFFFFFDu;
- l; q1 M& M$ w9 X //paramSet.opt &= 0xFFFFFFFCu;5 l6 k1 |8 c! ~$ E" M
& s1 |- @2 X# J9 D
/* Program the TCC */9 K1 t& g1 l A+ F5 p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# z( `8 L: k# I+ B/ O/ U4 \5 z
& e7 d, K y$ i9 `/ ^ /* Enable Intermediate & Final transfer completion interrupt */* ?) t: @( W, [6 g- ?- H' D G) A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ?' Z5 B) ~/ P7 u4 K2 V$ o+ \ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. J( w) A: \% ?
I. R, F% [ `% L. [8 Y/ _ /* AB Sync Transfer Mode */
* @; ]! i; H6 `1 f4 {( b paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# `2 q: ?1 I, n8 @4 E
& x& T; F* J& \# N( W/ Q* ]
/* Program the source and dest addresses for master DMA channel */
* x! i1 i& [. J: d" d paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ v1 J( w5 ~9 e paramSet.destAddr = (uint32_t)(ping_buffer);+ {0 ~* P: ~! f, \ G$ V' w
9 ^3 {' x% w* s/ _8 \( e /* Write to the master DMA channel first. */* y/ F$ \6 a _
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, S# ?+ B4 [: U( t. e
}
( u5 o1 r5 c$ [) A0 R" q; F3 c2 u, [: E* X* {( K7 L+ h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; R8 y; b. @6 S9 v2 E- b! x
! a6 y, B* T4 u* ^0 z if(result == EDMA3_DRV_SOK) 2 f* S4 g# N# r4 S( y3 N
{' b5 @4 Q% ?2 G+ u! W. I. Z
print2arm("edma3 driver init success.",0);
# c8 Z( Y! e: b: q. | }
+ m% U3 i+ w( L! Q; Z}
4 P* T& l- R, j- E( m2 w0 k; _4 S3 J$ [0 ^/ P9 V4 N6 |1 S# k
% x9 J' C; h$ NEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ P) ^4 l# {; j7 `) N F
5 w- S) x% `+ |, J3 |+ I9 \& h) y( H7 q* ~5 E, A" Z8 K) F5 E: S
|
|