% ?( Y) D$ A8 g9 n9 u. j! [+ U$ v 5 q7 n! o. F: s; S( k: }: c/ w( K( f
: x( b9 G+ f) [9 E+ dstatic void ys_edma3_init() 1 e | ?4 ]/ Y5 t+ [# _/ V{$ l) W/ J( L5 ~9 }$ z+ b- u. _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; & I8 H- l1 K3 L) E8 o: g W8 r EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 w; j3 d' c% P1 _* }$ L( B
EDMA3_DRV_Handle hEdma;: h4 b% L2 t2 Z3 \. ^5 N) w& A2 {" \
uint32_t chId = 0;2 y( {, ^ r. x! J2 g
uint32_t tcc = 0; ( b. T% R! H1 g% |9 G* V 2 n9 E3 o x8 }: T% p( g print2arm("edma3 driver init...",0); ( T, b% b5 l. z& G9 ~2 x& Q5 [. H1 Z3 j! c4 L' @/ |0 o
hEdma = edma3init(0,&result); 2 Z$ t* N l- }! b0 e+ r if(hEdma) ; ~( S% u. O$ }4 S0 q1 b4 ` {9 u4 a8 e$ I( N7 A( O6 {
print2arm("edma3init() Passed.",0); . i, f5 f( S2 s3 O! M }4 N& w8 U# w+ Y: U# A. R( M! C; E& D
else6 N. D/ H0 y- ]! y' i T
{ 8 }1 F* ~ G/ W3 P# h print2arm("edma3init() Failed.",0);0 }/ I/ h1 P5 m4 I' x# }
}1 |+ I1 @5 }9 K. h3 D
; {, {( F4 H" U- w; f
if (result == EDMA3_DRV_SOK)3 W* \7 H) L* F: Z
{ 5 M. m5 j% s& e9 Q' o result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! i8 T- T) m4 `# Y" G' ?
(EDMA3_RM_EventQueue)0, $ M# h- j! d" v+ d &edma3_isr, NULL); ! `3 N9 q8 h* k$ r, \2 Z/ x! T }3 m0 l* K9 f4 ], d, r
3 U. d" d" Q: H5 ~; s" y if(result == EDMA3_DRV_SOK)2 i V. R1 D7 a( J, ?. _
{ 2 n6 G! d& s# @7 A+ } J paramSet.srcBIdx = 0; ' M- K. f; Z9 z9 R! ~2 d paramSet.destBIdx = 1;( d$ |7 T6 P" \4 M+ z/ \! [( Y
paramSet.srcCIdx = 0; ( |; l; S$ q2 _! N paramSet.destCIdx = 0; 1 r2 O% T5 k% M# T2 G+ W. U+ I% E, X paramSet.aCnt = PING_PONG_ACNT; 1 T |- {+ I7 M paramSet.bCnt = PING_PONG_BCNT;* U& b9 H) ^( ^$ G' D! `
paramSet.cCnt = PING_PONG_CCNT;; f$ G& S4 k; A
. T+ s1 u! [& {/ N% T /* For AB-synchronized transfers, BCNTRLD is not used. */. ~, V- ^8 h$ \" ] @. w# j$ Z
paramSet.bCntReload = PING_PONG_BCNT;* K; ~) Z. P! U, J" ]) b
8 a( N+ @% O0 M" _
/* Src in constant mode Dest in INCR modes */( ]& O- r3 n0 K# S& f
paramSet.opt &= 0xFFFFFFFDu;; N8 g7 |2 P9 @5 f0 p* o
//paramSet.opt &= 0xFFFFFFFCu;* |5 f0 r" r$ x. B* |& i* Z! Q
' e% i ^1 m- s0 o V6 F; J
/* Program the TCC */ 9 e: d( c8 I: b9 g4 q paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); 1 e* i* x- D; J ) F6 \' G3 b1 ^4 @, h4 o& Z /* Enable Intermediate & Final transfer completion interrupt */1 x) @) g5 N8 c) M% g2 p
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); p. S9 L4 \1 g% e4 v
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) s1 A! l3 r; k. H0 e8 E
* L) c) y3 i; D: O f' k
/* AB Sync Transfer Mode */5 I' G; _% y2 g* y$ x1 W
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); # k# a+ B' u+ c$ S; L0 Y6 J; E % |% a1 k0 ?# n* { /* Program the source and dest addresses for master DMA channel */ ; Z; Y/ ^! H6 R' y1 H paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ( c" n$ e9 S9 \" x( k) @' ?: F2 { paramSet.destAddr = (uint32_t)(ping_buffer); 4 I8 T; u( O0 u* k8 N( A8 h$ r+ b8 J; h3 K1 n* L8 x
/* Write to the master DMA channel first. */, }" B0 H$ T7 i& D/ y3 }
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" {4 u' a* y! O6 d1 r
} 9 d# T2 r8 Y2 }
( L4 g) R8 k, l: }* g result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); & |. P* H2 s" j$ ?( E! n / Y3 ?$ E$ z E8 }7 P. v$ T0 ]" W. _
if(result == EDMA3_DRV_SOK) , j. v4 h4 W e, T: ? {8 S4 J( ?2 ~5 L+ |5 i) N
print2arm("edma3 driver init success.",0);- f+ [" D B" i8 O7 k/ T
} # P3 S/ t3 [- i N. k6 r
}& X& d9 x# L# f* D2 Q# u
: i2 J. F+ S6 \/ t( l3 q; V 5 V+ Q( b: h$ x# y! W2 u" A, m2 ~' vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 1 U/ O) w, V0 N' A3 [; L7 h; k4 ]8 `/ Q% E; y( d. D
* S. s: Y3 r1 A% t* Y1 q 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25