|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' y% |0 |- }. H& o# z$ K9 L$ q0 ^
#define PING_PONG_ACNT 1
! `& e$ a# \/ t! B#define PING_PONG_BCNT 8*32*40 0 Y5 [8 G% ~6 H1 K' l
//#define PING_PONG_BCNT 1 , \ Y" S" B% E/ F
#define PING_PONG_CCNT 1; F5 p( L5 Y. I3 H0 Z- S# H
#define MCASP_BASEADDR 0x01D00000
# q( e+ I$ m& k: Y4 w2 M6 S& c#define Mcasp_RXEVENTQUE (0u)
2 R( E1 z* s: M6 N- G( h# f0 y3 f* o: Y6 b/ ~
/* OPT Field specific defines */
4 J d3 g3 V% [+ r0 ~) C#define OPT_SYNCDIM_SHIFT (0x00000002u)
( a4 N, F3 p9 q+ J#define OPT_TCC_MASK (0x0003F000u)! ]# t3 k4 I& u4 N
#define OPT_TCC_SHIFT (0x0000000Cu)
- @6 y3 c/ d$ T( R8 ?3 `; O4 @( e5 ?#define OPT_ITCINTEN_SHIFT (0x00000015u)8 \+ X! L+ ^! }' L9 L
#define OPT_TCINTEN_SHIFT (0x00000014u)
- [( U# u# o& B% K7 ~6 k
; P/ i& N* T7 p% hchar ping_buffer[PING_PONG_BCNT];
! a0 v6 |; I; \char pong_buffer[PING_PONG_BCNT];. X2 Q# e% H9 D6 A9 u- e2 A
; i! K2 Q3 W: T8 p4 A0 a+ W# n
9 V" D/ W5 z3 j) B% K, Y# ]8 \/ M1 V0 v, p0 j/ g. t9 R
2 q! h6 q4 k4 b$ I+ \
static void ys_edma3_init()" C3 m" g2 K) d7 g5 Q0 W; X
{! m H+ f% o2 G1 j& p' H! O/ \" r6 @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& c v$ A( R( q! }# @; t
EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ M+ Q# f- H/ W' _7 t$ P
EDMA3_DRV_Handle hEdma;- ]/ `. I V# I! x
uint32_t chId = 0;
2 A9 O5 G7 ^# t; D uint32_t tcc = 0;
8 t* M1 T+ e# H, t/ C& L4 ~; r' p& l' Y1 p3 e3 Q! f- v- S5 r
print2arm("edma3 driver init...",0);8 U) u; S4 _4 c n& K, t
6 P# K1 _# g8 P- ^! J w+ P0 I4 k hEdma = edma3init(0,&result);
1 }$ i$ m% z; q2 e% g( L7 Q& V4 p if(hEdma): I \6 ~3 F* B3 n9 |& t7 Z, i
{( F8 }1 M* a9 y( n
print2arm("edma3init() Passed.",0);
+ o8 m& V F0 H8 J+ ] }0 g! U: S6 e3 u7 A5 s' V/ o
else
- b2 V) ~+ u e& f {- N% B7 K/ }# p' q# z: I) L/ ^
print2arm("edma3init() Failed.",0);* _3 v0 f- l4 e- e
}5 V! ]3 F! v" r6 {) _7 j) Q3 f
9 J. i! i, X% b7 C% T/ C5 _% Z if (result == EDMA3_DRV_SOK). a7 Q4 e3 h0 H o4 ]5 c
{
8 |3 m W( t% Q1 Q% q+ a+ } result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 o6 j1 V2 O6 W3 Z2 V9 t! n4 m (EDMA3_RM_EventQueue)0,7 J4 V- D! O8 i# G: f5 ~2 G
&edma3_isr, NULL);0 V4 ?8 l$ J% B
}
& T! u$ Z9 M4 q+ P1 m
6 w8 c% l9 b! h9 d) g if(result == EDMA3_DRV_SOK)* G- @7 ]% t# m9 S: P
{
5 x% c; l w7 w- O+ H. T G+ ~ paramSet.srcBIdx = 0;! d& w, B6 L. @. A4 c/ g4 ]' K
paramSet.destBIdx = 1;4 m* k+ U' p$ u2 t: u7 y
paramSet.srcCIdx = 0;/ |, X* @( u8 I% F4 C' j8 @
paramSet.destCIdx = 0;; p$ _1 g$ B7 P
paramSet.aCnt = PING_PONG_ACNT;. I( i% Y; i! D3 A: ^) t X
paramSet.bCnt = PING_PONG_BCNT;
$ p, e+ y' o$ O v0 D6 D& j paramSet.cCnt = PING_PONG_CCNT;
6 r5 l$ r `0 G2 `" p 6 b0 o/ V$ R" I: V6 q! E1 y
/* For AB-synchronized transfers, BCNTRLD is not used. */% l8 c8 B! }3 C0 j0 E
paramSet.bCntReload = PING_PONG_BCNT;
0 Z; o+ E- G) z% F: @) H( K+ Z2 K) i$ K! c! ]
/* Src in constant mode Dest in INCR modes */# v* N- z- T( M7 w& \4 u* ?
paramSet.opt &= 0xFFFFFFFDu;) p# d2 ]- {) m; ?2 E2 g+ n
//paramSet.opt &= 0xFFFFFFFCu;( @2 G3 j% S* y
3 P2 ]' m% J/ v+ {2 R$ s; H) S- @
/* Program the TCC */
1 E: w: N1 a, o7 Z/ P( n* V8 v paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ r! E" D2 n* x% b N8 \$ I/ _
) e' J2 f. U" j: c) | /* Enable Intermediate & Final transfer completion interrupt */
% b& S8 V& u& ~; S7 h! s paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, |2 x. Y4 c. ?6 N3 t; W" f f5 E4 U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. c9 z3 s1 Q6 \: o, v8 i- i9 x6 G1 h
$ d/ }2 u. S3 {8 C' X
/* AB Sync Transfer Mode */
) I. ]; \. ^$ y" v5 y+ ]3 Y/ \ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 o. G3 ^5 g2 S+ s* l
4 m( S" b% v3 z/ W9 v/ k /* Program the source and dest addresses for master DMA channel */
! v7 r& [. r1 T$ M0 I, x3 s paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);7 a$ Y: T; Y# w- v
paramSet.destAddr = (uint32_t)(ping_buffer);8 a+ J n; r9 I& ~* e0 Y
7 F3 S. H: k4 ? t
/* Write to the master DMA channel first. */
+ y) i2 {9 \; b+ K3 W* }* V result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; y: A: P2 C7 T( _ }
! t! w! V6 v% O$ Q/ S; |
M3 |6 h7 Y! e4 n6 w result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 r$ i! u0 u, e2 \4 @4 P
! }' i* \+ B L, B9 M2 U9 u
if(result == EDMA3_DRV_SOK)
+ w z' T0 ^! ^% F2 x! P: Y {
( K- ^7 S0 E, p" }' Y print2arm("edma3 driver init success.",0);9 Q& {6 s( a- }
} 7 a6 |$ M' a4 s# a( {6 u0 S0 y
}
* t6 m2 D; ]. Q5 W, h
1 L( F$ z2 Z: x n8 v& j. n# x5 K$ G0 |, p0 d" O% w5 g, k3 [% r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) u# a" m7 x8 `2 g( Z
1 k" r5 F9 c9 @) E3 H2 q( \7 i, `1 h. E# B" q
|
|