|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! K8 d1 l4 n8 V( Z; d. k#define PING_PONG_ACNT 1
8 _6 D9 E. n# S- X0 m7 M. v2 I#define PING_PONG_BCNT 8*32*40 5 X9 J/ k, W; S( l B& N% w
//#define PING_PONG_BCNT 1 w, S8 ?( C, k0 Y% Q
#define PING_PONG_CCNT 1
: K1 c7 N, t! \9 N# |#define MCASP_BASEADDR 0x01D00000
8 Q, D1 e1 q3 k; D% `! E, Z4 g#define Mcasp_RXEVENTQUE (0u)
8 ?& ]+ J4 m" G, D% V% B' @$ Y. h4 ^/ G' R/ ?! C8 |
/* OPT Field specific defines */
: T: W) q- w' |$ N- n# }#define OPT_SYNCDIM_SHIFT (0x00000002u)! u2 @: |2 f6 j5 d* g0 f x
#define OPT_TCC_MASK (0x0003F000u)' Q, J0 f7 L2 b: I' o* X: a
#define OPT_TCC_SHIFT (0x0000000Cu)+ Q( I8 q0 t9 p0 H9 N: q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 w" o3 J/ A" { \& c& D$ q& Q' h#define OPT_TCINTEN_SHIFT (0x00000014u)
8 P, X E0 q9 P. q
8 L! V8 Q# [' R Nchar ping_buffer[PING_PONG_BCNT];
% Q. I, T" t* f9 I( Lchar pong_buffer[PING_PONG_BCNT];* {4 c. j& S' l! @5 _+ P: {
6 H2 M* B/ C/ p) N( ?
! m, k6 c1 D2 a* h
, ?# G9 T5 e# { K1 J" F; } c5 W+ B1 N. Q0 D/ R" u( S
static void ys_edma3_init()
+ V1 ]5 @0 V2 ^4 N{
; P8 x! f2 B( [) t# t& |& ?% d. i4 s EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ T {2 r8 f1 ]& w2 Q c ?5 c
EDMA3_DRV_Result result = EDMA3_DRV_SOK;- V5 ]# B" k4 L3 x. [9 c
EDMA3_DRV_Handle hEdma;7 }% P, R6 |' ?3 v$ x4 Y1 {% W1 K
uint32_t chId = 0;
, t, i9 [% d% z9 A- {5 @ uint32_t tcc = 0;& F3 v$ _( M9 w% L5 s
- {1 E! ~3 d3 S; o3 z( G
print2arm("edma3 driver init...",0);" b0 g: u! e6 R/ M
6 W6 z3 k l! I; H7 v; |1 g hEdma = edma3init(0,&result);! l. N+ J# s: ^% k* F' f
if(hEdma)
8 w( L k1 D; p+ f$ q7 ^9 V9 s$ ` {
3 Q8 I$ f2 ?' y! R7 l print2arm("edma3init() Passed.",0);
; k% j( i8 z; H# j; F4 _9 } }
0 {$ Q$ h! e# y' P7 W else( y" R; s0 {2 x3 E& e: t% }
{2 z3 j3 v& Y% b' w
print2arm("edma3init() Failed.",0);
- h! d* c0 Y5 n, ?# }$ y' M }( [9 n+ y! y) U8 t4 q
0 u- [1 S ^ M' s; v
if (result == EDMA3_DRV_SOK)
2 F! v: h- }; P: Y0 @9 v& i {
1 y% y, ~7 ~" Q% P- Q result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# j7 |# j( E1 i
(EDMA3_RM_EventQueue)0,0 N, R& x$ T( T) g
&edma3_isr, NULL);
' Y9 V# i4 m9 U% [, E" _ }
9 U# p. \5 r" k. `+ n5 [8 d* O$ M 4 t1 F5 O: `3 f* t+ b/ m% ^2 C1 E, Q: O
if(result == EDMA3_DRV_SOK), {& b p7 u$ e O4 t
{
: {' Y$ n8 V- m! g, I3 D' r. e$ {" Z paramSet.srcBIdx = 0;0 l6 L0 q: y' }0 a* N/ U, _
paramSet.destBIdx = 1;
' s/ V- ~, P* B& Q paramSet.srcCIdx = 0;$ z' E- A' F: n- ^( Z2 W, [- A9 Z
paramSet.destCIdx = 0;* m p! X! J/ B$ j
paramSet.aCnt = PING_PONG_ACNT;
, `& O \6 R, N) X: Q9 l; V" N* K paramSet.bCnt = PING_PONG_BCNT;; f- B' B* U7 p5 D( u4 G
paramSet.cCnt = PING_PONG_CCNT;/ a* [' U+ c& v$ l* [* H5 a" K
( v7 M( }; F4 w& p' I: v* F- b
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 `/ v) K" `) Z% W1 U) h4 { paramSet.bCntReload = PING_PONG_BCNT;) X* L% D3 i! _/ L
/ k, e! ~) n: D% |
/* Src in constant mode Dest in INCR modes */
; E4 e1 p& q* y2 }: d paramSet.opt &= 0xFFFFFFFDu;, d9 D6 B( ?: y% W( q9 ]+ o m5 y
//paramSet.opt &= 0xFFFFFFFCu;
# t6 i# @4 L1 x3 @, P # R# o5 | K* V; G" P, |0 l
/* Program the TCC */
# _# k/ g" S/ c$ x9 q paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( ?, `! \5 d' w, Z A1 u1 h" I* K1 ?" X, f& O5 I* W
/* Enable Intermediate & Final transfer completion interrupt */9 y' S# N$ v. e5 A; W# s
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. ?1 h' c) |& Y/ w paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! ^" m1 g2 h8 U( `& L3 y) b7 Q& v5 K+ O: J
/* AB Sync Transfer Mode */
) C. u& n4 r: l+ }3 f paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ L6 k7 C1 v) j
' E: K# Y* V3 d* `
/* Program the source and dest addresses for master DMA channel */
6 Y1 Z: d4 M( Y+ _ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- D8 G9 Y$ C7 t! H paramSet.destAddr = (uint32_t)(ping_buffer);% }. ?0 a5 Z) s% p1 H
H! i2 e1 e8 _2 B' f /* Write to the master DMA channel first. */
* y) t) [' j: i- j" p7 r result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' P) ^8 Z# l6 m% P5 j- l% B8 |/ |
}
! A) s" D: i4 f& ~! G6 A( [8 P/ @4 |
0 i" u% a9 |9 w V5 ~ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 }/ t: R" e& D; K L
: k# `0 q3 M& k5 S6 J& M if(result == EDMA3_DRV_SOK)
% |- { r5 b3 M3 d0 L5 T' D {
0 T' X& g0 P" j, i# H7 m6 S print2arm("edma3 driver init success.",0);
* O; G' o1 X5 d& w* r* Q j# B }
3 S- [: N/ I) e0 }; z9 i}
- d, j& n# _/ F0 l( v
) T2 n7 u7 B8 Q! q8 D$ ^ O: k: Q/ G4 E0 h4 x, D1 K: V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ Z1 p/ E8 X1 M* {. S) w5 g$ R; L! S& ?
. v( P' c; A3 |7 r8 Q1 B |
|