|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! p. d5 H. w3 c( }* q7 b( p$ {
#define PING_PONG_ACNT 1
7 T9 S9 U9 U$ b2 q' n! X#define PING_PONG_BCNT 8*32*40
. N) I, T# `8 m7 w- `" F j//#define PING_PONG_BCNT 1
. Z2 Y0 }0 j% b3 F8 h' F% N8 M#define PING_PONG_CCNT 15 w5 P2 ?5 A# W" B4 `! S
#define MCASP_BASEADDR 0x01D00000- _$ ]5 n: s; W
#define Mcasp_RXEVENTQUE (0u)8 g. F: Y6 g+ `+ ]7 C) O' m
$ B, @8 r5 j, y9 M4 m; o+ G
/* OPT Field specific defines */
# y# B: F( j. B' J1 h! m) @$ L" S#define OPT_SYNCDIM_SHIFT (0x00000002u)
& l4 N3 Y& s: U, o0 W#define OPT_TCC_MASK (0x0003F000u): L' T! r! y' Y5 Z' a; E
#define OPT_TCC_SHIFT (0x0000000Cu)
0 g l6 H' Z) B9 g2 V& o) ?+ Q#define OPT_ITCINTEN_SHIFT (0x00000015u), l$ U' H3 `. f2 U
#define OPT_TCINTEN_SHIFT (0x00000014u)7 n r' ^) I4 `6 O0 t- c, g
$ b, d q: p$ V. Q4 h/ Y: qchar ping_buffer[PING_PONG_BCNT];
7 W2 }% F+ J9 {, D- pchar pong_buffer[PING_PONG_BCNT];
1 N0 X$ H# C- I+ t" }6 ~- ~9 b& d/ W8 ~' J
# [# Y! ^4 T+ K9 H& q
4 [5 R9 J# e: B) j% r1 q
7 e3 u5 x/ G9 Jstatic void ys_edma3_init()$ u) N( U6 y9 n) \6 n x$ C) f
{8 F& t. h* B F$ u
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 P) i. b8 a8 O+ g/ L EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ \' s: j* x( [4 u# P5 A4 V EDMA3_DRV_Handle hEdma;/ ^/ ~6 z( w1 [8 Z" S& H1 D% G
uint32_t chId = 0;
; i: K4 } F5 _* ^ uint32_t tcc = 0;
* A3 E3 F/ C( k, |$ M! W: s1 ?
0 @8 M* O& r/ F print2arm("edma3 driver init...",0);
: ?8 ^; a# d @0 u- I2 c
% U- p0 ^# S2 ]! _9 N+ d, r C hEdma = edma3init(0,&result);: s7 o9 ^) z5 U
if(hEdma)
# v4 _( v5 H+ J5 z {
% n/ z8 c# V. P# f6 \( B% u) r/ N- k print2arm("edma3init() Passed.",0);
# W+ @6 g4 h5 F, w }
2 o% \ u, ~ _- C V$ Q4 L% G6 K else
4 ?6 }( ]$ [+ V6 y# S3 V { `3 V% V5 c e9 ?
print2arm("edma3init() Failed.",0);0 J9 c/ I9 D/ J/ K9 t- ^* B- l
}
c5 \( C1 E7 g) U$ D, ?; e. `2 H
2 L8 N1 {+ v$ W0 D, q if (result == EDMA3_DRV_SOK)
; A2 k: @( [' K* I {* L2 q4 K4 _1 d" j9 C( C& V
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- o6 N+ L5 S9 w) {0 u (EDMA3_RM_EventQueue)0,( o" X1 ^2 o" V' c# M
&edma3_isr, NULL);
2 A. H$ @0 T) ]) [* Z) M( A }
/ r0 \& n( r2 s7 l( r
3 `+ R: j$ t. c* n4 A, l if(result == EDMA3_DRV_SOK)- Q4 m, P6 W" `
{4 w/ L4 P! v; s. C5 x# |. C
paramSet.srcBIdx = 0;( V; e1 C$ N+ q, M0 N
paramSet.destBIdx = 1;; s5 W% `0 u7 e8 Z: h
paramSet.srcCIdx = 0;( A2 e6 P2 n( i( L0 j( l7 b
paramSet.destCIdx = 0;
, O! l$ ?7 d% P8 i! ^' V Y paramSet.aCnt = PING_PONG_ACNT;
# ~) b5 ]6 h7 A( {! c! { paramSet.bCnt = PING_PONG_BCNT;# f$ M# B, O6 ?- O
paramSet.cCnt = PING_PONG_CCNT;
* K2 s) b$ Q( z2 j# d7 P7 X2 V+ k
& V7 v2 M& N, l0 [. W /* For AB-synchronized transfers, BCNTRLD is not used. */ S, s* ]/ l3 A7 g1 q- p
paramSet.bCntReload = PING_PONG_BCNT;& c! F* ]. F3 H
_! }0 z0 ? E, A" P* y- } /* Src in constant mode Dest in INCR modes */
1 V/ h9 }7 |! Z* a+ b paramSet.opt &= 0xFFFFFFFDu;
% ^. b3 O- c" i" |# _1 D //paramSet.opt &= 0xFFFFFFFCu;, l. V' B" r2 O
6 J9 X4 U K- L9 o$ f, Z
/* Program the TCC */
, G, A4 A6 A$ h/ h7 s" X paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' y: \" U! a9 l1 {0 E
* G x7 A+ z3 @+ M$ O5 W/ w" C /* Enable Intermediate & Final transfer completion interrupt */; |- r/ P7 i# z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 [! Q% ^5 t- M+ T" t% J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& ^: C2 h# m# h4 o" U* V, H Q2 P0 e+ Q j9 C, G: A3 B
/* AB Sync Transfer Mode */
, f; R( T9 q1 v# }4 L* {; Z, x4 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 O4 J, A4 T% Q/ l
7 _& u' y8 [. n* [5 { /* Program the source and dest addresses for master DMA channel */
4 E3 W5 q( ?, Y- C3 e- t; `6 r paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);% y' |% D; D3 j: I1 r# ^
paramSet.destAddr = (uint32_t)(ping_buffer);
7 x {) y2 C; J3 r: ~
. h' \: M4 a/ L /* Write to the master DMA channel first. */* D1 }7 r; v O# U1 c6 T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, W$ R4 w- v# b( e, Z% @ m
} ( F" J$ P: a1 d. Z
5 ?8 u. R ^+ d" H2 T result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
q- C" Q$ a% @" j! _% A ; r+ l; M6 I5 e2 P- L- u7 @9 a
if(result == EDMA3_DRV_SOK) * L' m; [, `& x5 t
{" m% j, U4 {; H2 X; B
print2arm("edma3 driver init success.",0);9 w% {: \/ f# T0 o4 k+ q! w
}
& V; `# Q+ Y* m. n9 m: Q) ?( {}
7 a1 `# Z! c; u$ B1 e; A# J+ B4 ]! z+ I. L) ?
2 P! w u5 D* p/ [" [, {9 g. X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 a7 t$ R, i3 Q, N' t
5 r$ g, C* P& g/ Q% R3 _
~# t2 k& D1 I |
|