|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( I" [ ~; l1 s4 I! {
#define PING_PONG_ACNT 1
6 c4 Z) e* @% n& D: L$ P2 m#define PING_PONG_BCNT 8*32*40
) s" q; O m9 x; b: x4 k' P+ d X2 ~//#define PING_PONG_BCNT 1 4 a' C$ t- E" t% W: s
#define PING_PONG_CCNT 1* B& ]& s7 g6 W; P9 y3 t
#define MCASP_BASEADDR 0x01D00000- O, e4 p# r. O6 P1 r
#define Mcasp_RXEVENTQUE (0u)8 p2 T ~ R N5 b! [
: b2 ^* l1 T9 n3 O7 i/* OPT Field specific defines */' x0 b/ z" R' f4 X8 I( Q# Q' r
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 _* c4 g- d) N+ ?" ]#define OPT_TCC_MASK (0x0003F000u)3 ^7 {$ I. s7 N- w3 I, F1 e
#define OPT_TCC_SHIFT (0x0000000Cu)
# u9 h0 u- t2 g4 i- `! X7 I: E. [- g3 ]#define OPT_ITCINTEN_SHIFT (0x00000015u)1 [4 E- l% b/ T. i/ L
#define OPT_TCINTEN_SHIFT (0x00000014u)
( M b" v- f A# ?& x0 X+ y6 o: T& N2 j8 D
char ping_buffer[PING_PONG_BCNT];' [& W a, w4 p% {. ?! W4 S1 i |
char pong_buffer[PING_PONG_BCNT];
( a: X4 `1 a L4 f! ^% d; P0 r. G+ J( j; s* L6 p! ~
( O4 U( T( l% ^ B9 s# b( r# f& V5 U/ B6 J% _2 g
@2 q+ M; V$ I( O, Istatic void ys_edma3_init()
' ]( g' H6 ]* w9 V& E1 q. N- y{: H! {9 x8 i$ U/ M4 a2 P3 T$ n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( t2 J* I9 g3 b# m7 B+ A+ H
EDMA3_DRV_Result result = EDMA3_DRV_SOK;( F0 @$ T4 e$ Y
EDMA3_DRV_Handle hEdma;" ~- |& j/ K& f, X( m: `1 h" t
uint32_t chId = 0;
' W) r% z# f4 ~* B0 @ uint32_t tcc = 0;- q) P4 W6 c; @
) l# k q! S; g print2arm("edma3 driver init...",0);
& ~1 } P# `' F1 n. P- `: Y% g( C; X L' L% H7 C V3 y' }
hEdma = edma3init(0,&result);
% G) T5 J8 b, g$ ]% A1 O if(hEdma)0 E' e9 t: q, \9 Z! M. y
{
( M7 b/ ]7 a. d* t+ c6 b print2arm("edma3init() Passed.",0);0 a( X/ d4 M4 |0 o0 Y8 s1 r
}
R4 w3 O# c+ S' ~* S7 e9 V else. M. h% P& H+ J. h+ O
{
; h+ B7 C' t; G! S print2arm("edma3init() Failed.",0);
5 c6 t6 G8 _, U2 P }
+ o \( o) `9 q! T9 d3 s; B $ u5 ^4 d# |2 t" {( N( K
if (result == EDMA3_DRV_SOK)/ f4 c2 H7 R: p. {! H
{& t6 t5 h, [& p6 Z3 h
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ [( g4 P! K0 L& g' N1 A+ J' j
(EDMA3_RM_EventQueue)0,. Z3 A( j* R+ O( Z) A6 _
&edma3_isr, NULL);
v! _- p1 k. b }$ r9 ~0 q; g" s0 ?5 W
* v1 V0 u1 c& C" u5 c' C
if(result == EDMA3_DRV_SOK)& g4 A1 ^/ N: d( L
{5 j) o: C' m) Q. C
paramSet.srcBIdx = 0;
) P! d# J% D7 {6 @ s: i' a" H+ M; l paramSet.destBIdx = 1;. O4 Q' t2 `8 t/ Z9 C- |5 P" U
paramSet.srcCIdx = 0;
/ H9 S/ w3 |' T8 u( K paramSet.destCIdx = 0;
8 @! }7 t' ]+ C0 W. c4 u' \ paramSet.aCnt = PING_PONG_ACNT;) b! \$ ]6 d: e# v7 O9 `4 A
paramSet.bCnt = PING_PONG_BCNT;6 c7 o/ X% X4 g# N" W
paramSet.cCnt = PING_PONG_CCNT;5 E4 j D9 \: p2 a& L
" h7 Z( H v& n0 K* y /* For AB-synchronized transfers, BCNTRLD is not used. */
' p& ^9 b8 n. z1 z: ?0 H paramSet.bCntReload = PING_PONG_BCNT; i- I$ h" o1 X7 L
3 A6 K. z/ \: `, T' q7 r
/* Src in constant mode Dest in INCR modes */5 K- d& Z/ C. d8 F
paramSet.opt &= 0xFFFFFFFDu;! V) x5 y9 |5 y3 U; D
//paramSet.opt &= 0xFFFFFFFCu;
, f6 I5 `4 G! L 6 _1 C5 e) g. d: x
/* Program the TCC */$ d; ` m8 s- k! W; W; A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 L8 A' u* z) s. s
; F/ I$ \ [6 b, R6 v9 ? /* Enable Intermediate & Final transfer completion interrupt */
1 H1 S; u( q" V& D \ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);& ~% \& }0 p0 g/ h' Z* E
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% q" ~& z( ]6 j/ K$ [! j
& ^& e, j- m8 D0 d5 S+ O1 r0 r /* AB Sync Transfer Mode */! C S: K o4 A. L9 K& l3 j/ ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* Y: a1 W A6 N$ L0 b: Y9 _3 }8 G
) ]" n2 f- G7 h; c9 s3 l8 U2 p /* Program the source and dest addresses for master DMA channel */
4 Y. B5 I4 ~" @' U+ y paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 z. D) o$ S; n3 N9 Y! p( W) F paramSet.destAddr = (uint32_t)(ping_buffer);; e3 x, |( B+ ^7 t
3 j) u9 K D# u /* Write to the master DMA channel first. */4 r' m. [" K) }! p2 |6 f0 v
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% O% r. d% w w/ G6 M }
; _7 n, ?7 `- J: Y! U- V8 J0 ^! l9 |( \
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% u; k8 o6 S0 F: G
/ c' Y9 ?) ]' Z( r6 g if(result == EDMA3_DRV_SOK)
B$ t7 Z; p$ O8 L9 z' ], A- }% | {
5 C& F, V" r! H1 {' ? print2arm("edma3 driver init success.",0);5 a2 p/ ~. r& P9 r* }1 S1 h
}
- B) y# p1 _2 [; p: P' Z! m}. h1 R" | O* c4 y* L
$ _0 ~* d! Z8 }9 R6 e
+ T5 d4 ?3 b0 S+ i7 U- z" x" LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* k8 {3 R( ^! s$ b3 ?0 r
: O, d# P; d8 L* Q
/ t7 h/ I( I' A0 x9 R" J9 R
|
|