|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:) q l& F) V. c, h! m! P
#define PING_PONG_ACNT 1$ K3 V/ F, Y; L: C. H1 ~- u
#define PING_PONG_BCNT 8*32*40 * J2 [& x/ V$ r: q' c, _1 H! T1 g
//#define PING_PONG_BCNT 1
5 X5 g8 w4 l3 b6 Y r#define PING_PONG_CCNT 1% c Q& Z" H3 z" R \
#define MCASP_BASEADDR 0x01D00000& k9 y) l! v& ?! g }
#define Mcasp_RXEVENTQUE (0u), ]3 V) X' T- U0 V! P' j1 h
8 A4 j. T6 L u! ~/* OPT Field specific defines */
\8 q! N( [- Q9 E#define OPT_SYNCDIM_SHIFT (0x00000002u): u7 d# u; H* g1 S" f. I7 {5 b/ Y
#define OPT_TCC_MASK (0x0003F000u)' y7 r; n0 {8 |
#define OPT_TCC_SHIFT (0x0000000Cu)7 I0 m! \5 b5 L+ q" M
#define OPT_ITCINTEN_SHIFT (0x00000015u)
- V4 d' Z* o* Y#define OPT_TCINTEN_SHIFT (0x00000014u)4 d0 r6 H. Z. Z. V% P' I) n
2 c5 k/ p; k' `# H' T5 v) rchar ping_buffer[PING_PONG_BCNT];
7 p$ a2 {+ m1 ~, Z* f& v2 echar pong_buffer[PING_PONG_BCNT];9 R6 M c" S% G9 F
( S8 O! S) ~3 B, {& {" q, @5 H# B8 v, P5 G6 N) n9 `
' F5 ]7 k' S5 u8 U- c( {
9 G0 _$ u. G1 ~( H" j m
static void ys_edma3_init()
+ n( V! H, U: X% g% I% j4 [) v{! K( n. ~2 N* d7 l
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# }( c1 t$ b8 T) G; }; Q EDMA3_DRV_Result result = EDMA3_DRV_SOK;' Q& U' j4 Z7 [5 T% f
EDMA3_DRV_Handle hEdma;- r+ }& |% x: r+ D
uint32_t chId = 0;' H, C5 r1 ]; x$ ]" M- S
uint32_t tcc = 0;- {) L/ ^7 _) e+ A1 I
( d' x' ]* A, `0 j# L" R1 k print2arm("edma3 driver init...",0);
8 y) A) L k- q
) B# u$ |$ a; u G5 l5 r hEdma = edma3init(0,&result);
4 u, K0 N x( p/ \1 i+ @ if(hEdma)
# K+ ^) Y* D7 C s5 V% q {
7 g% H% @" h4 @ print2arm("edma3init() Passed.",0);
4 p1 Y- g8 |0 @ }. t+ Y- @. k. e7 ]" q2 c
else
( v" ]8 j# o$ O, u {5 V) j4 C: S6 _3 J! [2 P' ^6 m
print2arm("edma3init() Failed.",0);$ E0 f+ Z. y' c3 \7 u
}7 i% Y/ m# z( E, P4 u8 D; e" j
/ N8 k6 L. H6 w% R# ]9 p if (result == EDMA3_DRV_SOK)9 h% [. ?1 }+ G
{- k2 G- o. l5 r# R3 {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ o4 Z9 W. L' ^
(EDMA3_RM_EventQueue)0,& v1 Q6 s5 I, O1 R o
&edma3_isr, NULL);5 |7 s! B n* e S E5 Z& d
}
3 u$ H. B' x7 n& p
: @2 ?0 M5 A# X# b! h) \- n if(result == EDMA3_DRV_SOK)* A% y& Z0 Q6 O$ U1 F7 z7 ?
{
: d1 t! m3 X; I' ?% p5 k5 f2 [' I paramSet.srcBIdx = 0;. B1 h# X3 Z8 N
paramSet.destBIdx = 1;+ n& u$ A1 L6 M6 Q5 d7 t
paramSet.srcCIdx = 0;
0 A% ?( \ I8 m( O paramSet.destCIdx = 0;
% a. i* t1 B- I- r2 @ paramSet.aCnt = PING_PONG_ACNT;' Q. X+ W: a- _4 X$ ?
paramSet.bCnt = PING_PONG_BCNT;
7 o7 V. W/ F) _: n0 p2 U; w2 K" G paramSet.cCnt = PING_PONG_CCNT;% }4 O* Y4 r1 {7 J" L2 l
% m9 F' H/ L& Y* J
/* For AB-synchronized transfers, BCNTRLD is not used. */
% i1 P* n1 N/ T J' r$ r" q paramSet.bCntReload = PING_PONG_BCNT;. P: W& m5 z8 M) f
! C H. M" v: w: V
/* Src in constant mode Dest in INCR modes */+ q8 D& W, X. ~6 D/ v
paramSet.opt &= 0xFFFFFFFDu;
; e& R1 M& ~& k7 D. T9 B //paramSet.opt &= 0xFFFFFFFCu;: n: P" j. u+ |. }; H. E/ N
% A& w- p @" U. j% G. J$ c
/* Program the TCC */
) R6 C" Y! D$ ~! H- _' X9 B paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 k! X! Q3 Q: J8 r
0 e7 j3 r0 }/ |6 v3 g; M& \ [2 | /* Enable Intermediate & Final transfer completion interrupt */: e `" [, s1 a8 U* r% l
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* d% `$ U# m, k/ `! h) m# C$ z3 r- J
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 D. |- w8 u3 n. p3 h! L. Q
8 i/ W' H7 e) E n7 I; s, h3 Q /* AB Sync Transfer Mode */# S& \& P) i) ~) A) J2 p7 T" n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
T$ n4 L: U( J ; {0 \% Z& _$ R2 Z9 I
/* Program the source and dest addresses for master DMA channel */
5 ], K0 M [+ p2 [6 | paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);8 [, V+ X. M) ]9 e* H
paramSet.destAddr = (uint32_t)(ping_buffer);, f; z8 w2 G- D @5 x$ R
5 ~9 F3 X* j' N7 _& x
/* Write to the master DMA channel first. */6 v; o( l) M4 ~' \: Y4 y# _9 a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 ~5 v1 E5 ?+ g8 B; B2 {+ K } + _; a$ ^! k) V3 X
: B4 d3 M% L+ l% j9 ~3 U result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 P: \8 k" I: r& c1 J+ ~) K8 p1 `7 J
# a! k3 g1 Z, D0 W# P& w if(result == EDMA3_DRV_SOK)
" k4 w# I8 b# _1 ^ {
% z# I' h: C% W- J9 P% n print2arm("edma3 driver init success.",0);- o+ M1 U& ^ M9 U. I7 N
}
+ e+ j8 |; t' _2 Z8 O}
7 o, @$ e# B2 p; o; i; }, o3 \" p B3 K/ c0 E
( _! j, }! }$ m6 p6 {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 O E5 q4 q7 v. Z1 z' ?& [
+ l* C( T" h& F" z+ y" c( h) Y7 Q2 F0 p" D' m
|
|