|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. @- U8 ~3 P9 i( d#define PING_PONG_ACNT 12 w( P, i6 \: {7 D8 T
#define PING_PONG_BCNT 8*32*40 2 Q( O* R. C& r; f& Y1 ]4 @$ c
//#define PING_PONG_BCNT 1 ! _- e; g) G. v! F6 B r
#define PING_PONG_CCNT 1
' ]. h, n# P3 I3 k6 _( z* h#define MCASP_BASEADDR 0x01D00000 u* X' p" g$ Q+ U
#define Mcasp_RXEVENTQUE (0u)& u' q' m) W1 I' @5 O" |: |" ]
. Z' k# x* y( k' t) [5 A8 \/* OPT Field specific defines */1 E! S6 t* D5 a0 j/ J. Y$ k
#define OPT_SYNCDIM_SHIFT (0x00000002u)8 X5 R+ A/ p2 f0 K. T. i
#define OPT_TCC_MASK (0x0003F000u)
- J$ X! _2 U& L& j7 n#define OPT_TCC_SHIFT (0x0000000Cu)
; ] q8 S4 b5 G7 ^/ a#define OPT_ITCINTEN_SHIFT (0x00000015u)5 G/ H E. R1 U7 g& ]- E6 O/ K
#define OPT_TCINTEN_SHIFT (0x00000014u)) v0 Z. t4 E& w: }$ E
/ o6 p* E S) F0 L& b
char ping_buffer[PING_PONG_BCNT];1 R3 m. P6 V! Z5 S* F0 ]3 Q& n
char pong_buffer[PING_PONG_BCNT];
! g' ?7 l$ @( k% k" H5 @3 A0 x! ?, y+ T) w! }2 m3 w
4 c9 v6 G9 j: \" L5 }% k+ `# T
. e1 f' x1 p& |% E& b' f
' d; b; _* y& g! n$ P+ o: G
static void ys_edma3_init()
7 q. q' S! P+ Z& E* c{$ U# t8 }. `! l# S- x7 G3 d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 a3 k1 X3 w% g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
^4 p, _9 S6 n) t+ D4 a EDMA3_DRV_Handle hEdma;) P. ]' j) L! O6 {* q0 L4 ~
uint32_t chId = 0;8 @4 S# n% y0 G
uint32_t tcc = 0;
' X ]1 L& { |+ s$ Y
. ~" L8 c- u8 W* U+ U: Q) U print2arm("edma3 driver init...",0);5 F: g7 r8 s5 {) p, ^0 O: K, R# z
! |, k$ m. k7 k3 K7 R* V: ~6 c hEdma = edma3init(0,&result);
1 k* @: W# R: c O. n e2 \) ~ if(hEdma)4 v! t3 u7 U Q9 K4 ~5 Y" R
{ x5 g! ?9 _3 n5 y3 F2 K3 e
print2arm("edma3init() Passed.",0);
% D2 b/ b4 K- \4 Z }0 V- _: \ e% b
else
0 w' M; i p" Q5 o" N {
: `7 v! E. v: e$ ]. { print2arm("edma3init() Failed.",0);" r; u2 P4 ^! K8 t* W+ s, _ p
}- ^. [5 K0 N' e
# {5 y3 A( z& a# h/ Y6 W" K4 I if (result == EDMA3_DRV_SOK)8 z' f4 r& ^5 E- ]" O/ j. O
{5 n2 `- h5 n. P; Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 f+ H& R# L$ F
(EDMA3_RM_EventQueue)0,$ ~$ w! Y' m# k- I
&edma3_isr, NULL);
, U$ [6 f/ q; E$ y( }& b }
6 D; w% x, x4 L5 [6 w% _
1 j q1 b2 J$ S, ~) G if(result == EDMA3_DRV_SOK). g& W0 k9 p+ \4 I! d7 B
{+ f9 X3 @: Z1 l7 L, I6 |( v1 j! D
paramSet.srcBIdx = 0;
# X$ b- H9 J5 A* A8 G paramSet.destBIdx = 1;
1 Q/ M$ {& s0 J3 F paramSet.srcCIdx = 0;
* a5 h0 E3 y* P6 N" M& ? paramSet.destCIdx = 0;: \: B, e9 f) H3 Z: l' p
paramSet.aCnt = PING_PONG_ACNT;
' x1 d3 }6 i/ V) _. U2 v. g paramSet.bCnt = PING_PONG_BCNT;
; @+ {7 g7 d' y4 i1 | paramSet.cCnt = PING_PONG_CCNT;
4 _3 x7 v/ |4 L% j, j
1 Q7 F2 R* W7 `# I' b /* For AB-synchronized transfers, BCNTRLD is not used. */2 E, Z" Q* p+ E& P) O" \# i( ?, c: O+ P
paramSet.bCntReload = PING_PONG_BCNT;
, Y$ _3 v8 v y2 l j( J5 f0 F, T# C# W$ l/ U# `9 z
/* Src in constant mode Dest in INCR modes */
% ?* v% Q7 l, q1 O( o" d paramSet.opt &= 0xFFFFFFFDu;+ {& h, _6 N) ~$ l* u
//paramSet.opt &= 0xFFFFFFFCu;
- {: ]6 F6 X% y
$ G1 Q& R( {$ E /* Program the TCC */! k6 D. O. K* r2 [
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 Q' i6 ^0 w0 w
( P0 Q& L- l+ Z6 U) h2 r
/* Enable Intermediate & Final transfer completion interrupt */
, o4 S2 M+ F! s! i5 i2 h paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 Y" i. X- k' r9 [" R/ G) b. ~ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);3 @ R ~+ h" v# I
% T* N3 j J5 Z: R
/* AB Sync Transfer Mode */) g [. s4 @: l+ S% E; u( j
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ F4 W: J" V2 E; {9 e3 C
: B: B( s$ ], L /* Program the source and dest addresses for master DMA channel */
( P8 W9 ~, C3 \& S# H# M0 p paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" E2 b: p9 s3 A! m6 ^2 s paramSet.destAddr = (uint32_t)(ping_buffer);/ V" e. h" U9 W
5 T, j9 n2 b- y, a /* Write to the master DMA channel first. */1 n* S B" J0 G" n9 w, ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); H1 @) v* i. g1 K4 j
} , O& q; ^- N) Y
6 t# g& ]7 ]; {% l; ^) m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ F5 n- [1 j$ U# Y* L
! [. d& _9 {, y: J( L% s2 @' ]2 k if(result == EDMA3_DRV_SOK)
' h6 t2 q* Y' \ N U {9 ]8 E) L6 Y9 C" K
print2arm("edma3 driver init success.",0);
3 F; N- g _) w! A( q! V2 g- z }
f+ `3 `8 ]6 Z* s% G}! A$ c* r: u# a) k& J8 F' L w
7 j3 E5 G% h; A; Y' d1 L* F9 X! g/ K% b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。3 w3 U% B2 K; @) @8 n
, J6 c# J" b4 |' d& e) _5 M( K0 v7 d
|
|