|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( |: m/ f$ z: R# x5 R- q
#define PING_PONG_ACNT 1' c7 S" @8 d4 L, e" m
#define PING_PONG_BCNT 8*32*40 - `& e, Q0 L G2 l h! G: D
//#define PING_PONG_BCNT 1
6 |7 r- C4 q9 w#define PING_PONG_CCNT 1
7 y0 j6 ?4 B( F#define MCASP_BASEADDR 0x01D00000
( G0 T" f/ i$ O7 e/ v9 E#define Mcasp_RXEVENTQUE (0u)
: ^# j: a8 Q6 B4 E8 J
6 \0 t" ?6 s: v; A6 x! ~& _/* OPT Field specific defines */
- z4 G8 W& Q- b#define OPT_SYNCDIM_SHIFT (0x00000002u)% V- k4 C- z. U, [3 b: [; A
#define OPT_TCC_MASK (0x0003F000u)
0 L* {3 E: s* J! V#define OPT_TCC_SHIFT (0x0000000Cu)" I3 R2 ^5 b t1 l- s% Z; }
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 V. o( I- h) {. k# y9 ]4 B# n Y- q#define OPT_TCINTEN_SHIFT (0x00000014u)
9 t6 f: H3 a# V" X7 g) Z
V& B2 L) F X$ w) @char ping_buffer[PING_PONG_BCNT];$ L0 b E8 ^: _' Z- |$ e
char pong_buffer[PING_PONG_BCNT];
* x9 E# E3 I' {0 X( N% Q! `) \5 i5 }$ P4 o) C8 x0 \
+ ?8 U& E. b: y% [
7 l7 S6 T! W4 V* S$ M
4 p4 w; S/ U% o J& d; Mstatic void ys_edma3_init()
. t* E9 R0 y+ q; B4 Z0 y8 B- v{
, h L: q( w/ G! a( z5 f* y" @* P EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 F0 S- O& U' D/ C8 } T EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 L4 \* z' G0 V3 q EDMA3_DRV_Handle hEdma;$ r4 x5 g( z9 f) k3 C
uint32_t chId = 0;
9 L; R0 ]$ Z9 a" @) P6 @% e uint32_t tcc = 0;
5 I# n1 P1 R$ a& l5 a; O
4 I w7 b7 ]; {: I, {0 M/ r print2arm("edma3 driver init...",0);* z) Q% F, L: @6 A, T
3 `+ q5 w( ~0 j hEdma = edma3init(0,&result);
5 c ^& F. e; N$ Q" `! T" q7 A' r! J if(hEdma)
; C- {8 ]: T0 V) k- U {
% o. ~7 k& G! n# s print2arm("edma3init() Passed.",0);
7 N0 F4 W$ F" D$ Y2 ^6 _/ Z }/ T2 Z2 W7 |, q+ T3 U" j
else
$ j0 `6 d6 X/ E. m1 d {
% r. Q; B( f4 z) J( v% @$ D [ print2arm("edma3init() Failed.",0);5 K% q$ O6 s6 C. R
}, S6 f+ M, l$ v( p
# D8 q- U! W1 n& N if (result == EDMA3_DRV_SOK)
! s! P& W6 w' v2 o& E {" \/ y/ T/ ]" u/ Q: w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,+ X! S: T/ I' s$ B/ R, K
(EDMA3_RM_EventQueue)0,+ ?- R1 @2 D! Y. `4 p) F. E' p
&edma3_isr, NULL);
2 H9 h9 b1 e7 l2 J* l+ D }7 H( m" \/ E% A
- c2 N# f& m' c. r& d! U$ A7 A4 o
if(result == EDMA3_DRV_SOK) P J7 V: E) `) D
{4 V& r7 t7 z' m( z4 n) c* t0 ?
paramSet.srcBIdx = 0; n( ]$ Q/ x2 U
paramSet.destBIdx = 1;
) r7 [5 P. f; } L paramSet.srcCIdx = 0;: b+ z# J$ e3 h4 B8 J
paramSet.destCIdx = 0;
% Y) t3 P1 [; s/ R; x0 ] paramSet.aCnt = PING_PONG_ACNT;
7 D' m9 B* c7 w paramSet.bCnt = PING_PONG_BCNT;
- @5 ]! Q P/ [( U6 i+ ?: t6 ? paramSet.cCnt = PING_PONG_CCNT;
c( E7 Y P! T- j ) `- q' V% C( Z9 `0 d
/* For AB-synchronized transfers, BCNTRLD is not used. */
' V* O9 [( l, L2 m( C$ Q paramSet.bCntReload = PING_PONG_BCNT;
! C8 H7 h3 O* J, ] Q/ U8 T, s% K. m
/* Src in constant mode Dest in INCR modes */8 B9 z7 I6 k4 \2 U* H
paramSet.opt &= 0xFFFFFFFDu;
& q* G* \+ b6 s3 ? //paramSet.opt &= 0xFFFFFFFCu;- F( v. j3 ?" D. D+ P9 K0 @6 |
+ y& F' W M7 ?/ c- \- i' b; h
/* Program the TCC */
$ l3 D& {: _2 t: \) j paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; U7 P ^2 r4 H; M6 _
" `% y/ H" D: a" y3 i
/* Enable Intermediate & Final transfer completion interrupt */1 @' ~! G, f, W( G8 d
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 k7 }2 C: Y2 }; ~: d9 t paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& w' B$ Q/ w9 R9 `" K a$ w
5 _/ U7 \& n" R4 d /* AB Sync Transfer Mode */0 A3 N- Q. F8 k* ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 v- M! }2 @$ Z$ |4 Z : d& m) e* K% r8 W1 I- l
/* Program the source and dest addresses for master DMA channel */- K4 z& D/ [+ G% n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
v' f \9 A/ K% b, J paramSet.destAddr = (uint32_t)(ping_buffer);- e0 r0 X" f4 i$ S9 i
3 b+ Q' |1 I0 A
/* Write to the master DMA channel first. */' v6 n) o# B/ v- u9 g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 l' I, q- B! ]$ W } ) O4 {. m8 |- x+ ^ V* s
- \+ v# w" e7 i4 G4 ] result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& W6 z" |- x4 p# l+ S# p, a
$ J# T* n2 J, l! ^ if(result == EDMA3_DRV_SOK)
1 q! e& a9 K, ]. e: U8 o1 C7 e6 B {
7 S6 Q ~& O7 y) i3 r8 P1 A print2arm("edma3 driver init success.",0);
# m' A; m3 _' w- P0 x+ P& O/ U } 0 t7 d" e+ l1 k
}0 i& L( I2 h! `$ x
8 H3 ? ^9 v) E
4 O# V0 I& H( b' v9 w4 d5 Q+ T1 M- L aEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: \ I' m2 q# c- V- J/ K
0 n3 Z) I' p4 A l8 J: I; G8 z
5 p4 Y1 M ~5 f9 O |
|