|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
m' k0 x0 f; h- z7 }#define PING_PONG_ACNT 1" @2 d/ A; n" D' W' L/ f
#define PING_PONG_BCNT 8*32*40
- b' |- o6 Q& m& S- Z! _% l' B0 `//#define PING_PONG_BCNT 1
& T3 Z9 C8 c3 P) W! G#define PING_PONG_CCNT 1
1 d$ ?! K7 @. V5 i#define MCASP_BASEADDR 0x01D00000
0 Y1 m3 D9 |; V6 ^/ w7 b#define Mcasp_RXEVENTQUE (0u)7 R5 v* ?; {- `# N3 x/ R
0 u1 |* B5 v" Z7 t O( N1 \/* OPT Field specific defines */ }2 t8 e) n9 M' U; S
#define OPT_SYNCDIM_SHIFT (0x00000002u)0 L8 _- M: e, j& r
#define OPT_TCC_MASK (0x0003F000u)1 Y: y# K' D( U2 R$ h' ^
#define OPT_TCC_SHIFT (0x0000000Cu)
3 G9 O+ T4 j% P" y S/ M9 E4 O8 g& [#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ N" B9 b) P+ I3 L) E1 ?2 t2 e. B#define OPT_TCINTEN_SHIFT (0x00000014u)2 c: T, d8 u! A6 a m8 X
" t! A- b M! F. y0 s
char ping_buffer[PING_PONG_BCNT];$ f7 E0 |$ a& N
char pong_buffer[PING_PONG_BCNT];
# s- o, Z% f% |6 i9 [
* N. H$ V, P, g& c; K' T7 t- k9 l+ Q
% I8 h; g9 e( Q
, x# [0 b3 G- v* D9 }2 J* O5 k, A
- K! X9 _) v' N9 J( C6 `4 }static void ys_edma3_init()
8 |% H5 b: c, E7 ]4 l9 g& N{
3 b; u( P* Q/ b- Q3 A# [ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; T* r6 H: U+ [* i EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ i+ z$ o1 K& H* t6 r' M2 Z
EDMA3_DRV_Handle hEdma;
' T/ R9 u! S1 p' H% \8 o; N uint32_t chId = 0;; u& J3 x: K7 T+ i! } J3 l2 [
uint32_t tcc = 0;
( \ K+ L: G7 i* D2 q3 ]& y
5 x5 l3 R& A0 `& f( S% x print2arm("edma3 driver init...",0);
" z3 Q {4 \. ~+ a4 C
/ h, V. ?$ }( }" G6 ~. c7 m6 ` hEdma = edma3init(0,&result);
. k6 P8 _+ e1 G/ ~ if(hEdma)+ Q b( T9 _0 \$ ]+ D m3 X- A. s! _
{! B. Y8 c) E* a( t2 P
print2arm("edma3init() Passed.",0);
" W+ t/ S* [; e% w! j' \3 x9 ^* W$ T }/ Q, ^2 S6 k- Q L, r1 T
else; @8 i0 ?7 v3 z) l
{
% O$ r4 M( ]# T7 R( e. E" v! \ print2arm("edma3init() Failed.",0);4 c$ y% T# ]6 L) i1 k
}: k) e8 C4 W8 h
1 }& `/ ] A$ T4 {. q if (result == EDMA3_DRV_SOK)
8 \) s. T& y" b8 I {
/ P$ t4 v' v! H& {% y$ z result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. q. G) a) E! [
(EDMA3_RM_EventQueue)0,. T6 |* T5 D0 A: O" M$ ]4 t
&edma3_isr, NULL);8 U# P# D' X" S' Z4 K7 [
}6 g/ @6 n: W& \3 U
& c7 S( \- r/ {. Y8 m if(result == EDMA3_DRV_SOK)
]3 Y9 L2 k/ {7 k: q {1 P' P ]9 N% S4 x, e
paramSet.srcBIdx = 0;
5 O$ G ?- z0 o% W8 V: U paramSet.destBIdx = 1;' m/ c. F( m- z" J) b6 c
paramSet.srcCIdx = 0;
s& Y0 S) E; V: E: Y( E paramSet.destCIdx = 0;) Z) J0 a/ O! u) f$ G
paramSet.aCnt = PING_PONG_ACNT;* l0 D5 w, V9 M3 ]
paramSet.bCnt = PING_PONG_BCNT;
0 ~1 k+ L4 E/ `/ m$ d& L paramSet.cCnt = PING_PONG_CCNT;
' `" T3 x" A% f
8 h( n2 S: ]6 G7 F) B$ h /* For AB-synchronized transfers, BCNTRLD is not used. */
! O, E, {6 u8 j& z) n6 G% U paramSet.bCntReload = PING_PONG_BCNT;! W+ b, |) \+ b' i6 T
0 B% J' Q! |" e5 j1 B& [; |6 x
/* Src in constant mode Dest in INCR modes */
0 S- c8 L6 U& h; {: u paramSet.opt &= 0xFFFFFFFDu;
7 U1 f/ N1 F( W8 M+ m- E9 m3 v1 m //paramSet.opt &= 0xFFFFFFFCu;
9 d& \- I7 K5 n- e) Z 4 P' k [1 y# g+ y
/* Program the TCC */) O4 i& S2 [7 m3 X2 q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: a5 K T) m; X# Q
/ c5 _; A+ b1 q" t7 e. X /* Enable Intermediate & Final transfer completion interrupt */5 C7 ]: k2 B6 B/ [% a' a
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: C& s) Z: E2 ?+ Z. G2 D
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ P2 u0 ?# b" {& j7 U# ? j4 ]' g, G! @: ~
/* AB Sync Transfer Mode */
+ B/ ]' F/ Y6 ]) J$ r# k/ _$ b paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" d/ s& D9 ^# ]* b' ^6 v 8 | x- y/ o5 h' v
/* Program the source and dest addresses for master DMA channel */5 E$ j; @: D4 {" K1 w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 A; Y* }" R1 H# {' g3 f- c paramSet.destAddr = (uint32_t)(ping_buffer);
4 t# J% W' G: y) x' O6 e, Q; d7 x* V. H# a/ O3 ]4 e$ K N
/* Write to the master DMA channel first. */4 {5 Z9 }1 N, F8 V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ g( [1 ]: @2 b" |$ {8 W } * n% H4 I) I9 k; {$ b* l
: ?' G K9 J0 ^5 G' } P0 m- Q result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! x! E& D' K8 \. H" }/ h 4 y) F# a: k$ v: Z% ~, Z/ K
if(result == EDMA3_DRV_SOK) 1 ]- X' _6 V2 c* Z8 [
{
$ H* Y7 f9 M! J# y; d/ g print2arm("edma3 driver init success.",0);0 t3 h3 a/ J, j u; X1 n; j
} |7 h% n) h! d9 F; A
}
( R: i2 k6 I" W& n/ z
+ T8 w; K$ N2 W( e u9 c5 e& F4 I
9 E$ F } z6 Z8 O" g* }7 QEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 W" R& z1 }- [: C C# `! K! i8 Q/ U
3 k: C( z8 Q2 [' F: G8 h: C |
|