|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' m2 P8 C3 q& w
#define PING_PONG_ACNT 1
, j. B% n4 C F# \. z+ O {! w#define PING_PONG_BCNT 8*32*40
2 \( C% x+ d( J J0 P/ L9 z6 w//#define PING_PONG_BCNT 1
8 N4 M) r3 l6 }#define PING_PONG_CCNT 1
/ g/ g9 w/ b% S& ^, j, Z3 ^#define MCASP_BASEADDR 0x01D00000
- O7 ]: G* N7 v8 [4 j/ J: C6 v#define Mcasp_RXEVENTQUE (0u)0 ]5 O$ M7 H1 P$ W4 Q" z- f7 Z
0 G4 y: H* q1 l2 u' j7 S! D
/* OPT Field specific defines */
' D$ P+ @4 W# \& x& @& G#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 Z& @6 Z+ p# a. c, [0 T2 M3 ]( W9 ?#define OPT_TCC_MASK (0x0003F000u)! q o! G1 _3 p% v1 ~
#define OPT_TCC_SHIFT (0x0000000Cu)
+ u1 b. ^8 r/ I6 K#define OPT_ITCINTEN_SHIFT (0x00000015u)1 x0 F% k7 L- c3 g( w0 E5 ?( z5 v
#define OPT_TCINTEN_SHIFT (0x00000014u)) i* ?+ g$ q( d/ l- ~# A
! y& h. `, Z6 B! l/ ~4 x8 W1 F
char ping_buffer[PING_PONG_BCNT];$ B. @* M4 n0 N2 ~ } Z2 l
char pong_buffer[PING_PONG_BCNT];
) x- n! \* L# _6 z' D, \
! ?. a+ r' O- v0 S! _* [2 g5 ~0 U
5 Y) W+ K- Q8 h
) u5 j3 X3 P) {$ a- W3 T/ f4 T P6 d9 h+ k2 M' h
static void ys_edma3_init()5 |- u3 u& x/ F+ {5 L5 f
{1 m }# t- w: r
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ W# S. g9 H/ f( D1 s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;; ?0 d7 I8 i1 e+ R7 _9 {0 D
EDMA3_DRV_Handle hEdma;$ _5 k$ y w% W) B5 J) X6 p
uint32_t chId = 0;6 ]. d }2 o) U
uint32_t tcc = 0;6 @. t! ~- d$ c" i
! f ~ s! M3 w- i* \! \
print2arm("edma3 driver init...",0);
1 F0 i( T: ^0 v8 u% A3 H9 N1 v1 b+ I) `' c
hEdma = edma3init(0,&result);% {% v" s P9 K2 ^
if(hEdma)
; F0 u5 p+ H6 f6 O R3 q# b; A {" @+ l# f* U+ d7 b+ ]
print2arm("edma3init() Passed.",0);! u1 P8 p/ N# ?! R/ T
}2 G# @# K- f/ ^# W3 d0 |3 L
else! q+ b, m; i& Y3 N3 @! g
{& f4 `$ W/ \4 A/ e+ d- V% Z v
print2arm("edma3init() Failed.",0);/ L: h$ m. ?* A
}
* e1 }; y0 J# l& {( D0 ?
7 n$ y* r' l* U0 X& ~' ` if (result == EDMA3_DRV_SOK)
! a1 O# {) }1 N C% ]7 z- Y5 F T* W4 q {
6 ]( ?1 s' e* v$ N' G" d! d% V9 u1 G result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 t; e+ ?! s$ l" k; m4 a
(EDMA3_RM_EventQueue)0,4 X0 }3 d% y5 s' B/ y. O
&edma3_isr, NULL);
# K# G) R$ D# ~! `7 |9 n }. B& i# S' \% @" z- P4 F
2 ?* \, f' w5 X2 W6 H! N if(result == EDMA3_DRV_SOK)! a. f# A$ U6 n. G$ V
{
0 a3 I4 B$ w- \" ^ paramSet.srcBIdx = 0;
! P2 }" r# Q: F: c paramSet.destBIdx = 1;5 s7 T" q3 x8 j( N) ^ l F [$ \
paramSet.srcCIdx = 0;
$ F* `, `0 a4 ~% C, c- Y; _, M paramSet.destCIdx = 0;9 C" S: c2 I9 y5 ]8 @' {/ X" P/ d2 `
paramSet.aCnt = PING_PONG_ACNT;
6 U' \5 L6 I: z2 \& V paramSet.bCnt = PING_PONG_BCNT;
' N* C' o/ F; s4 p7 }" ^; g paramSet.cCnt = PING_PONG_CCNT;& V) E: e3 u# w# ]$ u& p! y
/ n) C% a. J1 [; z+ Z; d /* For AB-synchronized transfers, BCNTRLD is not used. */! Y6 E# X# Q* v8 |' ~8 W3 ~8 f/ T6 x
paramSet.bCntReload = PING_PONG_BCNT;
$ a! W P- X1 X: u% Y b \+ A" k( {( H
/* Src in constant mode Dest in INCR modes */1 G; W8 k5 ?2 C4 n
paramSet.opt &= 0xFFFFFFFDu;) t0 l2 h" @( o9 g! J+ N L
//paramSet.opt &= 0xFFFFFFFCu;
! _. {; o( h/ q" B3 h- F6 e4 o9 J 4 |: w$ W: H5 _7 u- w" H7 Z
/* Program the TCC */1 J5 l D& P1 s! `3 w. j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: [$ \' u5 a- y5 [
$ n! q/ C& y6 ~% h
/* Enable Intermediate & Final transfer completion interrupt */
, ]: D# N3 t8 k1 v" J paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) r" e5 D8 O. Z! \. \8 ^/ Q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ h4 Y0 v6 V |0 u& l9 e0 Y
/ `! m# X& ]- D5 e /* AB Sync Transfer Mode */5 c6 R/ {! L, n$ G& h, Y( T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; U6 i1 N8 m! ~
# }' n* \' y* P. v' ]1 s$ Z2 } /* Program the source and dest addresses for master DMA channel */7 {, J5 p5 }, H1 }. N6 B0 j3 j' |
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);' X5 c" X; H( Q _
paramSet.destAddr = (uint32_t)(ping_buffer);7 Z2 m8 P3 c6 Y
" q, b6 |+ [. ^/ m6 _- X% H2 ~: {
/* Write to the master DMA channel first. */
' ^4 w# ?+ j. l4 Y8 X3 Y result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);9 q3 Y/ p3 _0 q+ C: x. P0 e
}
; A* g) T$ y& y* C* X2 s9 P
; z% ?- V# I/ [5 S result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- b+ |+ R' H( v* r
) P% m! k5 |: z4 v+ l( C if(result == EDMA3_DRV_SOK)
0 j4 Y: p/ c1 Z+ Y7 U1 [ {
+ m! w& M' O+ H" D8 ` print2arm("edma3 driver init success.",0);
5 L2 m/ q3 U1 p) L }
- L8 b# R) V, Z}
( o% B6 C( W: a
& X* J0 z1 t' ^: v6 d) H( {
* w% o7 [2 ^' u9 }9 E$ O! p5 U4 OEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& ]; V6 X3 f) k0 n! J1 I7 m& `
3 V( a4 ^+ R8 g
6 S. M. Z/ s _; F$ ^7 J) t! u5 D
|
|