|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% w; j0 K4 Z* @5 _8 r3 F#define PING_PONG_ACNT 1' a1 q. O' s: w, T8 r
#define PING_PONG_BCNT 8*32*40 / z! ~1 K9 R6 x7 T
//#define PING_PONG_BCNT 1 2 F5 i5 t# Q7 L1 p
#define PING_PONG_CCNT 1
" b: ?' W3 l% r- `& G* |#define MCASP_BASEADDR 0x01D000006 M/ k' j" q( R, k* R* x
#define Mcasp_RXEVENTQUE (0u)7 S$ C" {" n: e% `* [
* i# x4 B" S0 t% H# C; ~* x. S1 v/* OPT Field specific defines */" G+ N2 A8 X1 b' P6 g
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' }* h; ^1 W$ F$ o# P#define OPT_TCC_MASK (0x0003F000u)
. R3 h2 t+ `# q#define OPT_TCC_SHIFT (0x0000000Cu) p1 [2 d6 s& B t4 U
#define OPT_ITCINTEN_SHIFT (0x00000015u)- W! C' @$ k4 d( _( s
#define OPT_TCINTEN_SHIFT (0x00000014u)& ]( \; k8 a0 K U# K
$ {% a! q( \; mchar ping_buffer[PING_PONG_BCNT];
( j( b/ P6 L' f( Q, j! ychar pong_buffer[PING_PONG_BCNT];
$ J( j$ t0 F9 |. w7 _% {9 X! n9 T8 I4 r# i
2 {3 @; d9 w" C% |
, n/ C3 N {# i: R: ^0 h* j# M5 z
static void ys_edma3_init()
% ]* z# G1 L1 Z5 b4 P{
3 z; n7 S4 _+ O9 _: W3 z5 @ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 t& E2 C" s9 x3 d
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. g- G& a' F# ]; h! { EDMA3_DRV_Handle hEdma;# q! }2 Z( l" }5 W7 }
uint32_t chId = 0;
( `& j" _+ |& _7 H# X6 m8 b uint32_t tcc = 0;: A6 U5 `' o7 `" Y! t0 |! J
4 q" j8 i- N2 @4 o* G, P7 l; _) B+ B: @ print2arm("edma3 driver init...",0);! P h0 ~& z3 |" @3 u0 s# q
3 }# B9 G$ a2 P* i
hEdma = edma3init(0,&result);: N W/ s" _0 F- y+ ]3 C. w) x
if(hEdma)
0 C k" I1 M! H2 i {4 h2 M. F( J$ t& L( l3 B/ B
print2arm("edma3init() Passed.",0);
1 o3 s' B; J* f! }# ] }8 Y/ i3 s$ @3 l( W2 D/ X- A
else9 ]6 _, }. Z) u9 V/ Y/ k. D# [& ]
{
) t. _- e, }6 ~3 g: ?, C print2arm("edma3init() Failed.",0);
" I/ @1 `' d' P* B$ O }* S p j; H. c, [
4 B" K& d% c, S: O O9 _ if (result == EDMA3_DRV_SOK)! N! @% j9 a' q/ a- Z
{# D4 s; E/ Y. T1 z! L$ D: B k! ` o
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ A# t# h; ?$ V7 y% D
(EDMA3_RM_EventQueue)0,8 S* |: X; J( i, R6 z! ?7 N
&edma3_isr, NULL);! k# u; }! e7 M9 A; U
}: H' S' ?) O9 F* G6 e" Q4 x
6 c" L) b4 J1 O h- y% P+ x/ y, S if(result == EDMA3_DRV_SOK)
' F/ H' _4 W3 M {, E. _- X; o) ` l/ E
paramSet.srcBIdx = 0;# I6 B3 a$ V. j4 C, e- Z
paramSet.destBIdx = 1;
" Z: g. Z% T% Q& r* t& d& b9 ~7 { paramSet.srcCIdx = 0; R) t1 U4 g8 k0 G& E6 ?$ z# G
paramSet.destCIdx = 0;4 w4 z( p8 Q, u4 c8 y* l& S
paramSet.aCnt = PING_PONG_ACNT;/ A( [1 U4 x9 W1 s; [" \
paramSet.bCnt = PING_PONG_BCNT;
9 {7 x G: R8 Z& S2 b$ M3 A) s7 Z paramSet.cCnt = PING_PONG_CCNT;' A2 M' R! ?5 y7 I6 K8 O
0 n/ u) O1 o- E x9 r /* For AB-synchronized transfers, BCNTRLD is not used. */
: Z* s, T( w" s5 F' S: P0 c paramSet.bCntReload = PING_PONG_BCNT;6 ^# ^9 h$ m# H' G4 f* f' D8 W# H
; D2 R l) o* ^
/* Src in constant mode Dest in INCR modes */
, K6 o! O# Y5 `6 B) a$ k9 ~# A3 J paramSet.opt &= 0xFFFFFFFDu;% S. Y9 b9 W% n( o6 C
//paramSet.opt &= 0xFFFFFFFCu;
- M! z: S9 G8 h: ^$ H* m- g) p5 _3 B : m, s9 @, S' p/ ?1 U- ?
/* Program the TCC */
! ?4 I3 Y- Q+ D9 x2 t paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
y+ v3 a$ u5 L ]* ?) p0 `1 k. C: w
/ P/ P7 ] F8 g: ?6 } /* Enable Intermediate & Final transfer completion interrupt */. ?6 q' a4 |- a- \2 z& e- ^; c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 `9 p: ?; _2 ~2 |0 a2 Y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 ]4 S0 V5 A9 L/ G( e' j' Z+ o) H5 p2 N% w
/* AB Sync Transfer Mode */
4 Q% j$ x& x1 S: p# F1 q c paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 C4 N. ?, | s/ B0 ^* E . c1 l% ~: O$ M
/* Program the source and dest addresses for master DMA channel */
I5 \$ {8 p4 F1 `- i- Q paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);8 a/ K& C) f$ o$ T1 ~7 h; ~( T
paramSet.destAddr = (uint32_t)(ping_buffer);
z0 A" d$ A/ f7 E. u! @3 Z* m0 `. H3 Q2 R) o
/* Write to the master DMA channel first. */
& }$ L3 M1 C: Z# F+ t- u result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 _( _7 a" u, M* E. g/ l } 5 X% u3 M4 @! Q9 U0 r
( `$ l7 ^+ q& ?! x result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 n4 o! \0 f5 ^% T: R . F6 l) c, c( e! ~" T: z
if(result == EDMA3_DRV_SOK)
' M, l6 Q( B s8 i" r. ^ {
3 I9 K, y: _3 I* e2 u print2arm("edma3 driver init success.",0);
5 I/ M7 n* h* y } / t' A4 @! w) \- j# J
}+ t" d# g1 B6 p; c# Y0 E5 J/ k
: C/ t6 A' t5 |9 C* P# n/ v6 l7 _: u" d, D# p. S) E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) Y7 M; x1 I: n' ?; N2 ?1 {
3 d. O9 v0 f4 {( j
3 C) Q4 @. Z, ^5 ~( j |
|