- R& R; o3 `/ S/ \: H7 xstatic void ys_edma3_init()' x: b7 D- X5 A+ o
{+ L& X# A6 t3 X2 ?1 L' p+ ~- a
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% i5 ~' J U0 [; f- w; m
EDMA3_DRV_Result result = EDMA3_DRV_SOK; ; ~; |3 x4 w6 W* r4 `& g EDMA3_DRV_Handle hEdma; 2 q) N( `* M* z6 B. y uint32_t chId = 0; % j Q5 A, f, d5 d+ |- L% r uint32_t tcc = 0; ! c( b/ I% L) b C; D. e w# A0 a
print2arm("edma3 driver init...",0); ) [' g" ~/ Y# f- W! }- N5 | R0 L; {% e
hEdma = edma3init(0,&result);8 n3 ?0 d5 {1 `; M3 T5 B/ S* M
if(hEdma) 3 |: A2 O+ a, O( A0 ] { ; Z( V; k/ b, y5 R print2arm("edma3init() Passed.",0);# ]/ m' e% D- y0 L2 ?. n7 s1 G
}# p3 `: @( M' o! Z
else $ A$ ]1 `! F, r5 w' `' O6 a {" z" P# G7 p( k6 N/ ?: V
print2arm("edma3init() Failed.",0);- b, @6 T2 w L
}: e# T" x1 E2 P: P7 r1 {9 h" M
) I/ P6 P3 B3 v: N6 \( B
if (result == EDMA3_DRV_SOK)- H/ D) K$ j( S2 L! i- F: ]" W
{* l2 t7 J$ U8 O2 _ m2 y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, 3 ?4 B; o' l0 x (EDMA3_RM_EventQueue)0,5 a& E% [* L6 O7 r; m8 \% u
&edma3_isr, NULL); ; Z) E# g e0 p6 H( W } 8 n- b0 {6 t- e1 K9 K8 b' @% w # ~- E( j* T2 g* o3 x3 Z! Y if(result == EDMA3_DRV_SOK). x1 {+ a" A, j
{3 O$ j7 O" i- t, [4 N2 I' ?* @
paramSet.srcBIdx = 0;5 \3 { `! _# s0 U
paramSet.destBIdx = 1; - ?, |: o; I& h) v8 W: l# a paramSet.srcCIdx = 0;! n# g1 j2 ~4 y, N
paramSet.destCIdx = 0; # d! s3 W6 d" g, q( `$ J/ b paramSet.aCnt = PING_PONG_ACNT; # Y& E2 }% v0 k1 ?, T- f4 a paramSet.bCnt = PING_PONG_BCNT;' V6 _" N6 C$ T" x- {
paramSet.cCnt = PING_PONG_CCNT;% {+ |- U0 F J2 r! ?/ o
& E7 W& h- Q: w4 t" i) n3 `
/* For AB-synchronized transfers, BCNTRLD is not used. */ 8 H" b R# |! S( p& H7 B' c' P paramSet.bCntReload = PING_PONG_BCNT;- u, R4 V$ q" i v1 C9 ~# [
! C; s+ z2 }# L3 Q+ V4 w, n' l- i8 y
/* Src in constant mode Dest in INCR modes */# U4 M* {- I! D) ~% F6 {5 p
paramSet.opt &= 0xFFFFFFFDu; `/ \! Z1 Z2 o) C //paramSet.opt &= 0xFFFFFFFCu;; p0 V/ ^( O0 i' t" K4 R# I9 ?2 r5 G
) @" `# W# G' r b7 O
/* Program the TCC */: M- [0 K+ g9 p f; Z: @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); 3 B- e$ b9 F( {" a. p- |1 u. |; b" o
/* Enable Intermediate & Final transfer completion interrupt */ ( O$ ]' @7 Q" \6 t8 U" X" \ N paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* ^) o: K5 z- M- R
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! n1 _& r8 w, a" t+ G
4 t3 l* t; Q/ r' H8 E
/* AB Sync Transfer Mode */7 W7 o. d9 D- o- j4 P) w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); 3 x8 c( d1 x9 o! v6 d: u5 K' t5 l: p ' j, Y6 q/ |6 l; h6 Q; R0 U5 C
/* Program the source and dest addresses for master DMA channel */# q2 Z7 G; S0 B; o W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ' m# m W* n& j5 b( i# ?# v2 o3 m paramSet.destAddr = (uint32_t)(ping_buffer);* m% C! q2 a+ A0 q# n6 s/ A! N$ k
) U2 h. }: W3 ~7 O6 A- z /* Write to the master DMA channel first. */, i f5 O$ ]" L# o6 @2 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); , i. }, f3 w k% O9 y+ K5 {4 m } 4 R1 x- s0 U. ~. r* u' U9 d- D
- Q) `; I4 N( [5 w result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); u, Z+ ?4 F; R u4 A( q% f " ], J+ q* n1 q% k) n3 U6 ~7 r# e
if(result == EDMA3_DRV_SOK) 7 j. v; a" ^$ g7 M: R: N& [# y
{ , H1 ]1 {; V1 B print2arm("edma3 driver init success.",0);8 l( O; w& }/ r$ d
} 7 ]" O! Z: C, w+ Q; e
} # A: {2 H+ W1 ` ! w1 y% P, h; }4 h ?3 `: S' n" I7 ^9 g3 g: OEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 : d. r$ _ s$ t. b' V3 O/ i1 ]. R( v& m7 Q- R* }% q: z F
5 P+ O3 }" Q1 K- }. ~ 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25