|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 ` Z$ g, U: B, s3 w1 i1 q4 w#define PING_PONG_ACNT 13 |4 G( L3 E" ~' W) P
#define PING_PONG_BCNT 8*32*40 9 Y1 U' l- ]+ t! b
//#define PING_PONG_BCNT 1
) `) H" J; i6 [/ }$ R+ e- R#define PING_PONG_CCNT 19 ^) S- t/ o7 C" R1 u- u' [
#define MCASP_BASEADDR 0x01D00000
0 M4 _1 }: u) R' \# O% b#define Mcasp_RXEVENTQUE (0u)% F8 b- O$ m! N8 p
# s1 l! k9 \) g
/* OPT Field specific defines */. ^9 |+ ^8 r8 t6 T$ X- J' `
#define OPT_SYNCDIM_SHIFT (0x00000002u). Q, d+ w, ]5 w# p- p
#define OPT_TCC_MASK (0x0003F000u)" }4 |# e1 v. C/ O
#define OPT_TCC_SHIFT (0x0000000Cu)
O' [, x; ?! q( D1 s* P#define OPT_ITCINTEN_SHIFT (0x00000015u)3 p! U& e+ G2 V6 t2 r7 `' z, L8 f
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 Q; I6 Z1 S; `4 j9 V. F8 W5 J) z0 M( U' C
char ping_buffer[PING_PONG_BCNT];* u$ g( H0 v) A: ^
char pong_buffer[PING_PONG_BCNT];# T' i% d# z* O) I% F+ N' Q0 C9 t8 J
" a" h* P4 j4 D n0 z/ s
* x' L# ?- C# C: \5 V6 h+ h
: l4 J5 x( s, H; L& @% y, B& X
3 R- n- B# g* ^6 jstatic void ys_edma3_init()
% o6 t( ~- v* D{
! b& Y8 U' `& D5 T4 Y/ q- Z2 t EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' j! |! x" ~. F EDMA3_DRV_Result result = EDMA3_DRV_SOK;" _8 }6 V- q! q& T2 N; R: z
EDMA3_DRV_Handle hEdma;
! F( ~ ~, | @; D- a+ a3 o uint32_t chId = 0;8 s# \) j3 O; c. |) t+ B" j( [
uint32_t tcc = 0;; G1 P! h* H5 n7 U$ Y' g
9 T; c- ^8 }9 F
print2arm("edma3 driver init...",0);
/ P! F! F% ?5 R+ M! D0 W5 |
; c3 g% M: x* E$ n hEdma = edma3init(0,&result);
& U( W% J- v$ U% f9 a if(hEdma)( y X+ q$ A0 Z; u* n5 `4 o7 @
{
|, F$ H: ~' ?5 {) d print2arm("edma3init() Passed.",0);! F) G- D' k. i% j, r+ E" J* y
}7 x' u5 }& ]" } @6 o: n, H5 M3 R
else
' M/ [6 [& Q6 ]+ o* e t {
0 H5 [% Q: c7 y# l/ {" Z( x* Y. c print2arm("edma3init() Failed.",0);6 l: g; Q4 G) ^7 `4 a4 J4 ^$ ~
}
; L' O/ x! m; s* S$ @
M$ P1 H1 Q0 y* \8 D% }3 m% R if (result == EDMA3_DRV_SOK)5 Q+ f" `& p$ f" p7 M6 E
{
3 b; u, Q. s" H( ~" V result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 s: {9 z1 E( h& S: W! X! v! y
(EDMA3_RM_EventQueue)0,
9 v" f$ }" p( H9 f$ N5 M1 F! s& L &edma3_isr, NULL);5 e3 b- l0 T6 E9 ^9 _
}" _9 v' t5 }3 G! J2 _
: s% \7 m# x( h- A/ N3 e5 A6 T if(result == EDMA3_DRV_SOK)5 U$ i+ u; U( P" S v
{ s6 _ }0 G& L4 p/ I; Y5 t9 O
paramSet.srcBIdx = 0;
4 R% F4 S3 b# b* H3 I: D( n$ U paramSet.destBIdx = 1;6 o5 s7 k6 m" R* K5 z
paramSet.srcCIdx = 0;
+ V& U1 ]5 j: N- T paramSet.destCIdx = 0;
. ^# V& D& G4 I7 k o& r* j2 p paramSet.aCnt = PING_PONG_ACNT;
5 X% I( ]4 h4 y( W. @" @& H2 W- O; b paramSet.bCnt = PING_PONG_BCNT;
" V+ R0 j G n* x2 D paramSet.cCnt = PING_PONG_CCNT;% ]+ N& A) O: S* o) k
- R( Z! X& x* t# I3 o- s# I /* For AB-synchronized transfers, BCNTRLD is not used. */! K$ k- o5 A2 ?6 K
paramSet.bCntReload = PING_PONG_BCNT;
- b8 A, u8 z+ N8 _4 K: H( b
) `( Q/ u: Z6 ~3 R& L: j* L /* Src in constant mode Dest in INCR modes */$ K* m4 U) {& T3 [9 j7 |+ |" E
paramSet.opt &= 0xFFFFFFFDu;& T* P7 z, L2 \% Y( f
//paramSet.opt &= 0xFFFFFFFCu;
2 U+ o1 c4 G+ H9 S; _- S3 w W3 r% Y. m! ^4 A3 V
/* Program the TCC */
' g0 M9 k8 L. q: W' f& Y" r' W& { paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& L- F0 d }/ N2 C
! Y1 s4 p) m( B- c/ y
/* Enable Intermediate & Final transfer completion interrupt */! h8 R1 n( q& Y: H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, H6 m1 n& }3 C& F; d, o paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, ~( b y9 t& G. s
. K4 w. k3 B( g6 b8 ?. c9 e /* AB Sync Transfer Mode */
8 q& G, P9 J8 F" O* S7 `* m/ D paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 K4 v6 b5 b/ G2 a+ H9 n
9 u0 K. b4 ~- S% s; t$ Z2 ?0 B% M /* Program the source and dest addresses for master DMA channel */0 L; E0 _. b1 d0 [$ C" f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 E( | k. I! r' y k4 q6 G' [4 H paramSet.destAddr = (uint32_t)(ping_buffer);
8 y- c' C( Q: c. M- { Y( D
8 Y9 v+ n0 t7 A3 Y. t$ X& d2 I /* Write to the master DMA channel first. */
: F# G8 l2 y/ H& r) H result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);2 t6 l, R/ J3 M
}
; l1 t, h5 R9 e0 \: B& L& b
p6 ` D2 E* _( P1 u: g. Q result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. Q/ r+ g% [1 r( m/ t2 B/ c- b * o; q. u0 l- b5 `
if(result == EDMA3_DRV_SOK) . M% X5 C/ `% |( g1 b0 W) Q
{
1 c3 p% x' I8 q9 u& n print2arm("edma3 driver init success.",0);
3 T( [" i0 d# S } 7 @2 c/ v! @7 t9 H. t
}
7 D* _1 R8 Q7 j; f( S( R0 w# }; f9 Z! s: t# z ^7 A
$ C; U+ ]& [; ^$ q3 | sEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ J. e& H; G8 N$ @8 c
. H* q+ s* N* a2 k: p. G9 b5 D" Q$ `7 _+ k6 ?0 Z! r ?% S
|
|