|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 c/ I/ H6 \; N. f4 Y- q; t
#define PING_PONG_ACNT 19 U5 d. U _5 U& b; r, E9 A
#define PING_PONG_BCNT 8*32*40
8 u# g. ^: q. e3 a% Q//#define PING_PONG_BCNT 1 : i% d$ T. V7 F1 m& u
#define PING_PONG_CCNT 1
0 \' c8 I9 h9 X6 S" l* Q& w#define MCASP_BASEADDR 0x01D00000* ^% a$ {) V9 e- j$ c8 T
#define Mcasp_RXEVENTQUE (0u)- [. y, C% M& z( f0 ~- |/ [% m
4 {4 J/ F) {! D& C$ g
/* OPT Field specific defines */- f, p/ }4 S; A. N% q; w& P( G
#define OPT_SYNCDIM_SHIFT (0x00000002u). @' m) K0 s# ]0 y7 k! S
#define OPT_TCC_MASK (0x0003F000u)
8 g7 p0 Y4 Y( B, O#define OPT_TCC_SHIFT (0x0000000Cu)
6 s1 l ?/ q& ]3 c) w0 i" m#define OPT_ITCINTEN_SHIFT (0x00000015u)
' W) s6 A, i$ B& O3 U3 \0 \#define OPT_TCINTEN_SHIFT (0x00000014u)$ Q4 l: W7 V! V4 B" u! Z( M9 D$ n
* j+ x" Y5 o/ e% d4 kchar ping_buffer[PING_PONG_BCNT];
# I' x8 V7 Y9 [! H( o( P7 echar pong_buffer[PING_PONG_BCNT];
3 K3 v* f2 I( [' Q! e, |5 e/ V2 J! v3 P% Q
2 |$ p: Z. r5 i) m. s
9 O! \- W. z' k4 D4 i! ]
% D' B4 I, J7 r C, {/ F, q+ B+ cstatic void ys_edma3_init()! d5 L% n' W( \9 ?% T. C
{% O0 Q. ^, _3 [, {5 @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ O3 u& l( X* \9 k; o
EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 p; Y6 |; n5 J( H' G# r9 z' G; N! b
EDMA3_DRV_Handle hEdma;
, w8 A% \. G) j Z4 D" k uint32_t chId = 0;: ^! S- z! N! p! |+ @( j3 L
uint32_t tcc = 0;
' p$ M5 ^* x; n' O# p/ i3 [! F/ I" N; ^' z0 z* ^# [" O2 C" Y
print2arm("edma3 driver init...",0);
# U0 E* j( i* T/ U3 w! i
* M: q" v4 F2 @2 p; C7 e hEdma = edma3init(0,&result);
% U7 u( Z0 \7 ? if(hEdma)1 F2 T) H- |$ H) N$ p
{
/ Y1 R5 }1 Y1 N. ^0 _& L print2arm("edma3init() Passed.",0);' `$ d( M( o/ s3 i: j- G2 b
}; y* L2 u; p Z7 M0 R
else
/ C. w6 O2 \, \9 B, B {
0 ?9 ?$ a8 ~' ^3 Y print2arm("edma3init() Failed.",0);
, ^/ {* K* y( |. w" f }
: _! R) o0 C: E9 i s
* u# `- U' P$ f ^/ {, Q" p+ ? if (result == EDMA3_DRV_SOK)8 I' c, K% m M. R
{
6 E: J) W& ] g4 q2 _. o8 u result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ w! Y$ h/ ?8 o+ }- l/ t9 x (EDMA3_RM_EventQueue)0,
9 B' E/ _7 O- |/ H1 a &edma3_isr, NULL);
9 l1 d' W6 E7 ^0 K }
. K" _: t) }) F* B; |' p # F5 n0 p9 P% Y& n/ X
if(result == EDMA3_DRV_SOK)
0 h& ?- T7 i. p. n5 \1 R4 x {2 @5 l, d% k! a- w
paramSet.srcBIdx = 0;
8 e: T: K0 f! r, x paramSet.destBIdx = 1;7 `9 e1 @. V% Y
paramSet.srcCIdx = 0;
( @2 t- t7 F! O) v paramSet.destCIdx = 0;
% `! r7 V- ^2 U8 A$ A) S paramSet.aCnt = PING_PONG_ACNT;0 u9 I M. z+ w+ c& h" u
paramSet.bCnt = PING_PONG_BCNT;
; Y. M7 q. N5 r# { paramSet.cCnt = PING_PONG_CCNT;
1 J; n W% X- {, D$ e4 I5 x
: U9 U* ^* r2 M /* For AB-synchronized transfers, BCNTRLD is not used. */0 @$ G6 S1 s \! }$ j
paramSet.bCntReload = PING_PONG_BCNT;
! m8 ~+ I* |% |) p$ Y0 F- p1 l2 p1 V- u1 l) A6 {+ z
/* Src in constant mode Dest in INCR modes */& f R7 e7 Y: M! o! \
paramSet.opt &= 0xFFFFFFFDu;
5 }) T# j' D, Z/ J //paramSet.opt &= 0xFFFFFFFCu;
+ ~5 R: O A4 L$ g/ s1 l5 C
% N( C! K$ b6 S, u7 c& b /* Program the TCC */
2 _% T% T% {' T. n& Q9 c paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# V6 Y4 F, _9 l* M$ i; |! O5 N* M4 a4 ]6 p+ C1 A
/* Enable Intermediate & Final transfer completion interrupt */
, C8 i; V9 k8 B# z6 W paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* I7 i5 Y! F* F; ?/ N paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, q. [. m0 s/ p# {6 z4 n; M
7 Q8 w; D+ y9 m( ^* j; S0 d /* AB Sync Transfer Mode */0 E6 r4 [5 z/ ?" h* @5 `. V3 ^
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 z; p6 N. }0 ~$ Q
7 x1 P1 k7 p8 q /* Program the source and dest addresses for master DMA channel */
! P5 Y4 ~' m% j2 s c paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" {( z& o! P- d/ j) z1 W paramSet.destAddr = (uint32_t)(ping_buffer);
6 I3 ?9 j. `* g( ]! G2 v1 I1 f0 ~( ^4 [2 z
/* Write to the master DMA channel first. */
& }' f: [3 D3 }( c$ [# y& ?( Z result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ |( g1 `4 y. O4 Y } 6 z/ l+ [ K2 j, D
# m# s, k$ Z! O
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ x& e9 x9 N% _9 ~5 s
3 K: M& q- E. }4 F5 l if(result == EDMA3_DRV_SOK)
6 S+ M: {9 n4 _, C/ T! e {6 v: z; ~ P5 [5 |! _
print2arm("edma3 driver init success.",0);5 \. Q+ N. f. V3 a
}
3 w: }+ p( y1 m {8 J7 D}
1 C0 c" E5 A0 ?4 T- U# l$ q4 s) J- {, o% r- [
! L9 s2 N, }! f) d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 P+ ^2 A! z) `
- v" ^( ^% }$ n m3 Z
: b: g& g/ g# g9 T |
|