|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 [0 {" `9 |& \% u! h#define PING_PONG_ACNT 1; T& j( k& c5 L) ?& \! d
#define PING_PONG_BCNT 8*32*40
h5 M. ]9 o- f6 i! F//#define PING_PONG_BCNT 1
6 H1 U* _% K4 H. g& c* Y#define PING_PONG_CCNT 10 v* {" m1 a0 M4 A
#define MCASP_BASEADDR 0x01D00000
9 u! t4 x8 k, N; U1 r4 O: N! J#define Mcasp_RXEVENTQUE (0u)% k" e& _6 S2 S& H
- c' j x, n, O% c
/* OPT Field specific defines */
$ B7 T/ Q# {! ?+ U4 i' d* Z#define OPT_SYNCDIM_SHIFT (0x00000002u)
; S; i9 x; k! l#define OPT_TCC_MASK (0x0003F000u)' E, k9 S! F# D/ Z
#define OPT_TCC_SHIFT (0x0000000Cu)- \4 o+ f: }+ K ^" i
#define OPT_ITCINTEN_SHIFT (0x00000015u)% [5 X' L4 O+ E1 C' ?8 Y; ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
: j* x4 q, }6 h$ r8 d+ x: W9 Z0 X; j5 W. o0 B3 v
char ping_buffer[PING_PONG_BCNT];
1 A+ Z' g9 k# }; c' dchar pong_buffer[PING_PONG_BCNT];
+ g4 l, s* H0 o) K1 h& }: z; L- I( }8 c3 Y/ c
3 X' ?4 r w1 y! A/ a
2 e- f- [: d: d: n, e4 P/ D- J- k7 T+ C, k
static void ys_edma3_init(); z1 V; p0 h. u" a. l) s
{. J) g4 g. Q" R" \$ `/ {; X, F
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ _" l! E9 n# O0 @( I( ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 x( o$ z; N7 [( Y EDMA3_DRV_Handle hEdma;% y* x# O' s S( V& s4 r# g7 c
uint32_t chId = 0;- K% Z+ B9 F5 \9 D& H7 n( g4 y6 z
uint32_t tcc = 0;
: H; g* G2 R* w6 C9 y; q
m2 D' ^) |5 h/ Y print2arm("edma3 driver init...",0);
" Z, M( y: \" O2 M! l( s' l+ X" q: P
2 K6 ~7 u4 X" C. v7 b8 }; w) _ hEdma = edma3init(0,&result);
9 y( Q6 U- O" _' E9 s if(hEdma)8 f# P2 A+ D. O8 u0 I* v! x# \
{
& Y% |+ I& j" l; \ print2arm("edma3init() Passed.",0);+ p) {- S) B" v( g3 u' m' N4 E
}
, K/ C5 G% |6 T8 N' c else0 j+ l* U2 A0 M
{
6 K) N& E( y# E$ Z: @7 k! C0 C print2arm("edma3init() Failed.",0);2 A% B( a9 i5 v5 k) ?# ^" k
}
6 O: E4 I$ N3 W6 U0 ~# k
% W9 i5 @9 t( ~( y/ ? if (result == EDMA3_DRV_SOK)" ~* u# o$ c( o3 X, B
{- S6 C0 `9 |0 L* f3 t% W% t
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 d; _5 b' m0 j
(EDMA3_RM_EventQueue)0,; S* A2 G+ H: i# s
&edma3_isr, NULL);& u6 s0 A: \/ \9 }5 j$ B d
}
+ U% @; x+ p$ H5 [- ]% j . i+ p3 m$ n0 A% K1 W
if(result == EDMA3_DRV_SOK)
/ b4 F y& c. f: F {! d- j% R6 H& K) v, B4 h R
paramSet.srcBIdx = 0;
$ r5 z* m2 I5 z% ` paramSet.destBIdx = 1;7 g( K$ w/ k: g# O+ Z
paramSet.srcCIdx = 0;3 s3 V G% G1 j8 b
paramSet.destCIdx = 0;5 a& ]6 D( H9 Y! ?! M* l8 l! R
paramSet.aCnt = PING_PONG_ACNT;' A7 P% r* Q5 w/ O
paramSet.bCnt = PING_PONG_BCNT;2 E: g3 S* c* C. q+ `/ }
paramSet.cCnt = PING_PONG_CCNT;
3 s( K g5 O: h
- [; r8 E7 {1 [$ ^$ J. K- g. u' K /* For AB-synchronized transfers, BCNTRLD is not used. */+ V0 [7 G2 Z: t+ ?8 \
paramSet.bCntReload = PING_PONG_BCNT;! F! R4 `+ }- \7 `: x
' f+ N' |9 B; M; {; c /* Src in constant mode Dest in INCR modes */
% L6 A0 S/ Z g# \" u2 g8 I paramSet.opt &= 0xFFFFFFFDu;
' ^- S. |5 d F' r+ J //paramSet.opt &= 0xFFFFFFFCu;( M& R3 x) Y; J& k+ V
0 ^% r( G% _% w7 A/ | /* Program the TCC */6 w8 x7 b6 P6 S" I. ?
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( q. @% J: }3 I( g$ k) S3 \1 E% ]. l* A
/* Enable Intermediate & Final transfer completion interrupt */
; c( P5 t/ I2 r5 l1 o' h paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 P, F5 x$ r% W8 Z2 M8 A paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! o/ m: o0 g% L1 S, _
+ E, X. ^# d2 E. }2 o. J5 x
/* AB Sync Transfer Mode */8 v! z- p- @; B. B% E/ G6 D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: ]# r5 m2 i9 I9 h; @- [
: v+ M! |. r. x) w) m! G# U% ` /* Program the source and dest addresses for master DMA channel */
, ~$ Z' h5 P$ d. n4 J: Q" h paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); o+ i0 z/ I8 `$ y
paramSet.destAddr = (uint32_t)(ping_buffer);
9 y1 \& g# |% Z+ Q; u$ ~0 U
& f8 e/ A$ w. U0 K3 i /* Write to the master DMA channel first. */2 n& b* `$ g% Q$ B" g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- g" G% q3 v+ Y1 L0 h } / E, \- G3 P3 t5 F/ I
; U2 C; I5 ~7 }; H# x+ h# ? result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# D9 T/ Q7 u! U2 Z
7 V: s3 J, g& N @2 k if(result == EDMA3_DRV_SOK) : E3 |% c% v! W, B5 W! P8 }
{
( y. |* L ]! G8 f5 Y/ a6 L print2arm("edma3 driver init success.",0);
n, v) y2 j/ I& W }
& \1 W! O0 m' \5 _1 H. {5 u! e}
' `% T) }% @3 [; F+ b1 L8 g, ?9 D7 ^# Q5 e( l
9 @. O/ b, S( Q8 V+ j- |: i
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! Q, N6 u7 R: D) [- v& E8 h0 q, L: j* ], Y8 w# ~! S9 \0 o
1 L/ {& p2 z0 i7 O% f# z8 u |
|