; z$ H" V1 w7 r# F3 I/* OPT Field specific defines */ 8 p+ k: E/ P V/ j#define OPT_SYNCDIM_SHIFT (0x00000002u) 7 c* |' z# {- p5 b: [#define OPT_TCC_MASK (0x0003F000u)5 W. s* B' V; s" {2 H0 e% p' y
#define OPT_TCC_SHIFT (0x0000000Cu)* C, _5 Z. {. ~% m
#define OPT_ITCINTEN_SHIFT (0x00000015u) # ^! b, e. j2 G) d#define OPT_TCINTEN_SHIFT (0x00000014u)& N3 s; B5 n8 A: ?$ ]2 o5 Z- j$ x
# U- [/ d9 z0 c6 S9 d
char ping_buffer[PING_PONG_BCNT];7 X' }1 |9 T _( O% K) G
char pong_buffer[PING_PONG_BCNT]; 7 D- H6 W) b$ U+ M) ?9 b4 ]! e% R2 I. r. ~& N/ f# ?
: z- r/ k* ~% U0 l9 e) k
1 \; w6 |% @. K4 v6 r9 o& }! p z
* u# i8 F/ }7 \9 _) R# |static void ys_edma3_init() 3 S6 y$ w+ k# ^* K{$ l* H+ }% b2 `1 N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};* }; v; ~# j) J
EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 A- [* z }+ m: u) H* S
EDMA3_DRV_Handle hEdma; $ h) b" {* e# U1 l. w2 A# G& _ uint32_t chId = 0;8 G* ~! `, W# m& C
uint32_t tcc = 0; 4 }% W4 f |2 {8 S( h$ [ ' d+ D% Y& Q& ? print2arm("edma3 driver init...",0);$ X, M8 M7 G9 [' w. _9 J. X6 G
/ Z$ A' t% ?; {1 v- V7 ]
hEdma = edma3init(0,&result);, P/ {) ^: M' k' r1 c* M+ E, A
if(hEdma)6 ^' x* l) O3 E* q$ u% J2 H
{% \$ Z( G* W5 T* ~
print2arm("edma3init() Passed.",0);$ b; I4 A) g( } k1 w. X
} - q+ z* {( N9 N1 Q: h9 b else! O7 t: ? H$ u: g
{ ) P3 P; t5 ~8 @% T' `4 N print2arm("edma3init() Failed.",0);5 u, |4 \; V7 H
} ; u( w& j6 s K; o - O) u( y9 }, {& C if (result == EDMA3_DRV_SOK)8 g3 w' p1 w8 ~, P- M( g+ u: T
{, v- p# f) R [3 p. ^' F
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, $ A j" a2 r. G (EDMA3_RM_EventQueue)0, ~! i. ~) N5 q' h+ T
&edma3_isr, NULL); 3 e5 O0 T1 I" A- P& x3 |9 d; Q }5 f, [& F* U; k" n! l% P
. ?# z' e1 g( ^9 u# t; p
if(result == EDMA3_DRV_SOK) 7 t& I5 `8 w4 V/ ?8 s { 5 w" A5 i- C' x- T paramSet.srcBIdx = 0;, M2 q3 ?+ M8 k8 T: `0 L
paramSet.destBIdx = 1; 4 Z! U. q, r4 ?: w' B4 r paramSet.srcCIdx = 0; 8 Q( ~; x6 ?* t4 U paramSet.destCIdx = 0;: S6 M1 C, u$ z; q/ ^
paramSet.aCnt = PING_PONG_ACNT; 4 d1 | H8 k1 D# i6 W paramSet.bCnt = PING_PONG_BCNT;( `, w/ z6 J9 ?. C4 g
paramSet.cCnt = PING_PONG_CCNT; 2 K* Q5 H2 u) n0 z! C2 L8 f L * z: T4 B2 }! d
/* For AB-synchronized transfers, BCNTRLD is not used. */* i4 @+ f* C; ?" J4 {1 S
paramSet.bCntReload = PING_PONG_BCNT; 2 o# _8 n' h, d0 Y- ` , v/ o9 L) z0 m8 J4 v" I/ q$ f /* Src in constant mode Dest in INCR modes */ / n" @. y$ w& l c0 T- _3 X paramSet.opt &= 0xFFFFFFFDu;; n! B$ H- _. G- v7 E7 h
//paramSet.opt &= 0xFFFFFFFCu;3 Q! v0 }. X; r1 ]
2 U1 i, O7 q- Q* N- V) {6 Z /* Program the TCC */% C! k$ I# D& D! Q) a% O& P
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); ( A1 m( Y1 Z/ n! I) h2 T1 q# j z% e, n' n# K% s
/* Enable Intermediate & Final transfer completion interrupt */ # }" Y$ I6 k; }* ?9 ^8 Y; R+ w- v paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); / [% ^( t/ e/ p; W0 ~4 O7 _/ c paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 t6 X+ @( v; Q5 ^3 \
+ ?: ?* L) z r" I" c2 o! V0 V /* AB Sync Transfer Mode */) E. _4 O. [7 [6 T% r# x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);, j* z- w' P9 Q6 z: {
4 D' g* f: R" V5 r6 z) d. _& w /* Program the source and dest addresses for master DMA channel */ 2 s6 I8 ?* Z/ N4 l ~ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 2 V: G2 s4 i. } paramSet.destAddr = (uint32_t)(ping_buffer);. D& [' W3 s3 b0 j( i
8 X+ r: I, {1 O1 J/ f0 s) Z& g /* Write to the master DMA channel first. */ 1 r/ g* n+ o+ W9 Q" Z! n4 k$ r result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- N( l' d' I2 n: ^: _6 X
} d1 D- O$ ~ v5 r8 ]. g- Z# W% E$ G9 a6 i6 |
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 _+ b1 E( x1 {+ T
# _1 z1 r; H# G if(result == EDMA3_DRV_SOK) 4 ~+ i) ~2 Z+ ^1 H { ( m1 c2 ~: l- e6 X5 F, ~ print2arm("edma3 driver init success.",0); 2 N6 r: b [ e1 }- G/ ~ } 4 e7 t: z m0 O; Z
}/ E* E0 \- o, Y; k* }! h
: `' l- i$ N' d6 g
$ z8 _1 a% ]; P" X0 ]
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 ' C: d8 N3 t6 ~- n# ~" B- X' E5 p