8 L7 N8 U5 y) i2 H0 j % r/ N) ~* ~; C. e( Astatic void ys_edma3_init()3 V. x, \1 M1 f/ E8 k
{( _: Y. a. r4 |2 J/ z2 t5 p7 U2 v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, @; }, u, S* P5 U v3 S2 K
EDMA3_DRV_Result result = EDMA3_DRV_SOK; 6 N2 v V9 [( j8 s8 v. x* U EDMA3_DRV_Handle hEdma; A+ C% {9 k+ A0 J# \! j8 Z uint32_t chId = 0; . a' U# B. i0 b0 s% d+ y uint32_t tcc = 0;' T. Y @/ ?3 [4 a) m* F6 P
1 `( N1 i( ~8 }% a) h8 \ print2arm("edma3 driver init...",0); & |4 b Z8 u9 y ] Y m # b& M5 m9 F# O4 ?& m5 G% v hEdma = edma3init(0,&result); - L5 ]3 f- A9 z# o) q2 D if(hEdma)$ [+ T2 f- k# a& Q
{ ! Z5 K* u" E* I! \$ c! l3 U print2arm("edma3init() Passed.",0); ! J4 }* v( V2 a. n } 7 C+ B3 C4 @# c/ ~' H else, c3 h% w4 l' |. A
{ % e4 d/ K! w1 V6 m( j- n- P& c6 P print2arm("edma3init() Failed.",0);' L: f/ A) f T( g' u
}9 N" j2 n4 I6 f% I4 _$ ~) u
# }7 R/ x* k1 w6 `+ e1 k
if (result == EDMA3_DRV_SOK)8 h/ ? q9 ?0 o/ X6 y$ h
{ " V! n+ X% y+ q2 A( }+ F result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* P4 F& |; w+ r. L3 Q
(EDMA3_RM_EventQueue)0, , @8 U4 R. E5 J$ d; T m &edma3_isr, NULL); 0 q: M5 |$ x0 }7 m8 E8 ~ }0 o& |6 \- P9 [+ k
* @% z8 j( A4 j a& _
if(result == EDMA3_DRV_SOK)7 l2 z$ o. s, ?& V6 T# r
{+ j& w7 V2 t8 [
paramSet.srcBIdx = 0;# q! h- y! f- v
paramSet.destBIdx = 1; ' y; x. S2 R3 w I4 o5 y7 A- A/ M paramSet.srcCIdx = 0;$ K( O1 J R" ]' f( `
paramSet.destCIdx = 0;* [& d# P' m& Q! C% D& |3 r7 d& {6 s5 J
paramSet.aCnt = PING_PONG_ACNT;6 F. ?3 V7 ^7 \2 N
paramSet.bCnt = PING_PONG_BCNT; 8 H; ]: _5 U5 c! ~+ I! b paramSet.cCnt = PING_PONG_CCNT; ; [9 v4 D: g8 A4 X8 ?1 m + z, X7 `7 s8 ? /* For AB-synchronized transfers, BCNTRLD is not used. */1 T2 W( x2 A8 L9 j4 c; y- |9 s
paramSet.bCntReload = PING_PONG_BCNT; ; Z; e" t4 L' Z" ?* a0 ?; Q8 `% p : o: J/ n9 y: }1 h5 M& `2 ` /* Src in constant mode Dest in INCR modes */ . m5 X3 ]) ~6 @9 X* V9 i6 Z paramSet.opt &= 0xFFFFFFFDu; 5 u/ _5 ~2 P9 |7 o1 r. E* J0 O //paramSet.opt &= 0xFFFFFFFCu;) }2 U: T+ g5 \! K
8 I0 i- {- V2 a+ H2 Q1 f
/* Program the TCC */$ h( q) b0 W/ A# U# q3 G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); . ]7 x! ~) G: Q! V' ]5 E . U/ b4 a! P( H4 w /* Enable Intermediate & Final transfer completion interrupt */ 2 l) ]" ]' B0 k# {7 d+ C paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ! [5 T4 N5 z7 R! z, S; f5 E paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ i0 [% `4 }+ G6 ~8 F0 ^
) |3 ?5 a9 U+ L% g /* AB Sync Transfer Mode */. H) \& |8 l! H& g
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 F+ x9 a2 E9 T/ Q9 ~
' E) w" f: ^) \, y/ l /* Program the source and dest addresses for master DMA channel */% Y0 ^3 p$ }( U8 r4 e
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);" h' \ a& N* x7 c; w! n
paramSet.destAddr = (uint32_t)(ping_buffer);9 c7 T% s. X5 b0 C' j* d7 I
6 H3 `0 K1 @ D- c3 \$ X: s- I
/* Write to the master DMA channel first. */ % j. r7 y* a6 h( @( l0 V result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);4 A) ^' G$ o/ g
} % {' r, q+ J2 u, A+ T
3 p8 b8 c9 j: Y& v6 t! Y result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 w* v5 F8 V0 L7 I, P$ n# ~% y1 W
& z& h9 d& i0 ~* t
if(result == EDMA3_DRV_SOK) 8 l0 _/ V* P' r8 d$ u& Y* a- G
{ 2 |8 ~9 b- Y* g6 O, l" [ print2arm("edma3 driver init success.",0); + b K+ z% Q9 M } + t; |& d3 X, M( L8 B* o1 Z- z
} * b( z: r* x4 k0 n5 Z I& J7 O2 `7 m# Y1 t; ]! v7 Q
$ s. ~+ w! h1 K& `% w6 J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 7 C. N9 r4 _' a; V* b: C3 @) O; h2 |% C. n/ `) q