|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ S8 w2 m) y t& [" y6 a#define PING_PONG_ACNT 1
9 _/ d3 X+ e) A6 d#define PING_PONG_BCNT 8*32*40
7 _; v2 v v" Z3 c9 E//#define PING_PONG_BCNT 1 5 s( ~* ~; [* W0 v/ C" g
#define PING_PONG_CCNT 1
) D1 y o8 H. b2 {2 z#define MCASP_BASEADDR 0x01D00000, S4 O3 E2 f& ~# I
#define Mcasp_RXEVENTQUE (0u)0 K& k$ s$ z9 Z& D& H
$ U5 `! W# x \9 G
/* OPT Field specific defines */
) Q# l( A! V E8 V#define OPT_SYNCDIM_SHIFT (0x00000002u)- @" @8 K$ T4 G! ]
#define OPT_TCC_MASK (0x0003F000u)
4 |0 ?8 g$ F' o. a( H; t#define OPT_TCC_SHIFT (0x0000000Cu)8 ?+ C8 ~5 P4 i$ e+ O
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% Q2 ^& B, t E! e* {' ~#define OPT_TCINTEN_SHIFT (0x00000014u)( y6 } B( l% _- h. y; l0 N q
! ]; b0 y ~8 `7 A! G2 Bchar ping_buffer[PING_PONG_BCNT];4 j2 o, E; }* G
char pong_buffer[PING_PONG_BCNT];
8 g( k: E& N, O& E3 b2 m) ]/ w" I3 m* j: J
3 T8 [. e% u, D" h) y& L+ [
: O6 G$ S6 Y; t1 B' k, `
' L* ?% o' i/ a4 {static void ys_edma3_init()0 T; l3 ~/ n1 [- S/ }7 F5 ?& _
{* h% E- I3 x; t/ G
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 U+ ?; P* H+ ]/ F
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 \. b3 f2 _: V) {; z% \; R( p0 r& Z EDMA3_DRV_Handle hEdma;
6 y8 {3 w2 A( } uint32_t chId = 0;
$ w' u/ n0 A7 ?9 F uint32_t tcc = 0;! n% C1 `& y( m( p! q
+ g4 I+ h! X% T2 b0 r print2arm("edma3 driver init...",0);) s' x* z: e; Z; x6 G
& }- b1 }0 g9 n/ M
hEdma = edma3init(0,&result);
1 C' h. Z2 V" ~0 U if(hEdma)
* a0 _ Y N' I. d5 j {
' e; C) W9 e8 W6 q print2arm("edma3init() Passed.",0);0 Y. e9 A0 a: i5 `& c
}4 O! E$ v- p& r3 q/ X# }- Y1 z5 H
else
* u" }+ c9 r8 Z# l2 o {: @5 Q2 b: y; w- n
print2arm("edma3init() Failed.",0);' A: S# O6 E9 t+ \. _5 w1 F7 V
}
( q; ^6 v& q% [6 c ( v7 t( `- V$ C7 L3 S5 y$ ? k
if (result == EDMA3_DRV_SOK)% B) S6 y% j+ T
{
; ?3 Y0 a" D' I; j3 i result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( A+ B( j- h/ O
(EDMA3_RM_EventQueue)0,
- ~0 b4 ]7 i3 S/ h &edma3_isr, NULL);# J3 q! Z% t9 v. q
}
* E& }1 g5 l; \5 B9 ^3 j2 v
: }0 F9 S' V) Y7 y# K if(result == EDMA3_DRV_SOK)
8 B3 a; c7 a, G" C1 G {2 W3 ~9 ]9 I, R0 C
paramSet.srcBIdx = 0;
+ c6 k7 h4 ]! E paramSet.destBIdx = 1;
S' ~! Y4 U, x& E& p paramSet.srcCIdx = 0;5 ~# P* O. d* S. N4 p6 ^
paramSet.destCIdx = 0;
" x& v, u% f; q) o1 Y" p paramSet.aCnt = PING_PONG_ACNT;8 G- L$ i4 ]2 o5 O- J+ R# [7 B" d
paramSet.bCnt = PING_PONG_BCNT;
$ p7 e4 ~+ T- L2 O# q; g3 o6 Z paramSet.cCnt = PING_PONG_CCNT;
1 i0 P: P6 ^/ b, d' V- ^ ) [0 s8 @( [4 h( O& `
/* For AB-synchronized transfers, BCNTRLD is not used. */
% F7 L( ]+ a) w, C paramSet.bCntReload = PING_PONG_BCNT;
6 R& o0 A/ z& m5 j' a/ t( M1 W3 @+ }& d; ^' W* S
/* Src in constant mode Dest in INCR modes */3 @4 h# Z9 }; ^+ A' E6 O% R
paramSet.opt &= 0xFFFFFFFDu;4 x6 V0 c/ m% l3 _2 w4 C
//paramSet.opt &= 0xFFFFFFFCu;/ Z' y8 e) t( z- f# |
- j( T% h0 C8 t( o% d9 ]; q* P
/* Program the TCC */
& j) s* H2 e1 h6 ]" b4 ~4 i7 h% Q paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! b4 j. o9 H. ?4 f
" ^2 A7 ~7 F* c" X /* Enable Intermediate & Final transfer completion interrupt */- j+ Z {4 T1 x: H7 ^3 V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, j7 U& W# `( F! }" Z. w/ w4 X. l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 m' d# X6 {( H6 Q7 d# w/ u% j: M- Q. L
/* AB Sync Transfer Mode */9 ^3 V8 `" b( S5 _) c' l
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: G0 W" E% G6 d
+ |4 t% U- M7 |2 r5 }4 S$ h
/* Program the source and dest addresses for master DMA channel */
1 ~3 {# r: Q# F2 W' f# D" u, c paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);4 v" h- R: A0 h. Q) B
paramSet.destAddr = (uint32_t)(ping_buffer); M7 L, A8 A3 a9 i8 t8 Q
' P' H' N, |2 R* E1 h
/* Write to the master DMA channel first. */
' i; s) D2 Q: \5 f' c9 c result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: s+ }4 ^& z; |9 J. F } u# C: x X- m ?
' P9 e& P. _; C9 t8 Z0 l
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);* c9 s6 W4 d2 y5 w0 l V! j2 Y* P
$ e2 _( D" K7 D- Y if(result == EDMA3_DRV_SOK)
$ U* U) {/ t3 n+ P {
4 ?) s9 v) ^3 \; q* K print2arm("edma3 driver init success.",0);0 f5 O" _4 I& N1 \" ]4 Q
}
% e& z/ F" E7 a+ P/ a, l}
/ k1 f% L2 Z/ s$ K' F+ S7 p% r' d9 I' B) G8 {0 }% Z
3 `3 R1 a* _4 v! B; f% l/ C# ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。; e0 u3 F: \9 P0 l: H
: U5 p: K- y2 w2 r! l6 I! a* G4 s9 |. v0 d/ B) m
|
|