|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ H) ~) `0 J- p: W7 V+ u2 \$ p! m#define PING_PONG_ACNT 12 z, R4 j$ \- h* _: c' j
#define PING_PONG_BCNT 8*32*40
+ E( T4 T+ Y. F) b+ j# \" U' W, @6 H//#define PING_PONG_BCNT 1 & j, z' l! x3 }" Y6 |8 }
#define PING_PONG_CCNT 1( E# y# o0 o6 T3 l1 l0 b, }& \
#define MCASP_BASEADDR 0x01D00000
* E7 a2 `. q [7 ~0 [7 L#define Mcasp_RXEVENTQUE (0u)
- T1 @; P2 Z* D4 Q) p+ D4 m$ N( D' b/ ^7 s# ?( v! r
/* OPT Field specific defines */
1 Z/ C) }/ ?8 ?( l/ l7 Y1 W$ p#define OPT_SYNCDIM_SHIFT (0x00000002u)! A, |; z q2 W. y8 W. V" L
#define OPT_TCC_MASK (0x0003F000u)
6 ?8 s$ ]5 x3 D! j2 Z. @/ P1 K#define OPT_TCC_SHIFT (0x0000000Cu)( t2 J& U. |% p; W- m
#define OPT_ITCINTEN_SHIFT (0x00000015u)6 s0 F4 ^. d8 G, Q- F
#define OPT_TCINTEN_SHIFT (0x00000014u)9 h. }& p- J' M. f
( X. w1 i( l- v* M) k6 Q2 R( schar ping_buffer[PING_PONG_BCNT];& D# I" ]4 ?' L) r- w6 b
char pong_buffer[PING_PONG_BCNT];
8 n. E: U6 V0 u9 v# ] f
' j7 N. |" z& u
3 I$ V* e9 V8 M: E1 l0 @* ~ w# b( d- _! g0 J7 z
/ O0 k, t: P1 d0 E7 A5 d
static void ys_edma3_init()- s% _/ o9 a8 G
{
: H M+ ?2 [. j6 Q b' F6 C9 G EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- T7 h7 X: [( b
EDMA3_DRV_Result result = EDMA3_DRV_SOK;: ~9 S0 G$ ^3 A0 v5 |
EDMA3_DRV_Handle hEdma;
, ^# H, X- P; ^$ K uint32_t chId = 0;
" O7 Q1 S8 P6 r1 y. M uint32_t tcc = 0;
$ B2 M: A. I2 E6 I/ Z r r. P; e6 |6 @' y! c( K0 }& E; |3 F
print2arm("edma3 driver init...",0);; M- f r7 l6 R: g3 d: H- x
$ Y4 h' k8 k: Y' L/ u$ g hEdma = edma3init(0,&result);6 f3 K3 u7 X1 \8 Z* j0 r
if(hEdma)9 f! Y+ O& F* q( d, i
{
8 o. i+ n9 x3 b, W print2arm("edma3init() Passed.",0);
. E7 [. n2 b, c: f- T! I }
! l2 r1 v. x9 V, f! {! ] else# p& n( s6 P6 }* d9 j! I. Z
{5 @7 J* V- S: g( N3 ~8 q
print2arm("edma3init() Failed.",0);0 l3 [ F' @! T2 g% U B
}
8 H( ~# H! W- W/ n. ^7 G$ w4 |5 B
3 z+ z% p1 C2 R- R( [" f8 \ if (result == EDMA3_DRV_SOK)- y5 [% n( ^9 w6 C$ d
{3 T6 p) B8 N" p
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 [7 _% o+ F9 ~8 X2 L& j) q4 k6 D ^ (EDMA3_RM_EventQueue)0,
/ x2 a( d$ H( b" ^6 Q D# A# z &edma3_isr, NULL);: d3 E# ^5 j: m/ E; H$ E
}% S# r8 a4 U8 E$ B
" r$ i9 V% k$ h) a4 e
if(result == EDMA3_DRV_SOK)& l* C; }/ N: ~# `$ [
{
1 ~7 N3 n5 K! a0 c" R! r paramSet.srcBIdx = 0;, m0 F0 Z) c0 B1 D I5 m
paramSet.destBIdx = 1; `- r2 |6 c3 y/ Y9 Z) q
paramSet.srcCIdx = 0;
" c' A4 Y6 S% D, C9 z% B% U paramSet.destCIdx = 0;; w; a; c& \. k7 S( | o: J
paramSet.aCnt = PING_PONG_ACNT;, H9 N5 h! `7 J# @
paramSet.bCnt = PING_PONG_BCNT;& z! L/ G& Q- h4 X2 C# s$ k7 {
paramSet.cCnt = PING_PONG_CCNT;7 W8 i T. ]: A$ m j& m
! |9 D- {1 C; v- n5 U& r j m. W$ x" v
/* For AB-synchronized transfers, BCNTRLD is not used. */
' M) H7 ~: S! d4 z' S paramSet.bCntReload = PING_PONG_BCNT;: q4 I9 n5 D8 n. Z; C& N! Y% `
" x) V5 z2 J5 n /* Src in constant mode Dest in INCR modes */
" e. b3 E( N" ^0 \" v( Z paramSet.opt &= 0xFFFFFFFDu;* D9 l) F5 H, R) e1 h$ Z
//paramSet.opt &= 0xFFFFFFFCu;3 |3 n3 e3 q' \2 f/ D+ `( m8 t" b
1 `& z; ]0 K" {2 J8 E! ]$ {. I
/* Program the TCC */
% f* ], d; D2 n7 k3 q4 f5 i paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 K2 x& {! N/ D8 |3 e8 c
: y8 |4 V$ L& d( c /* Enable Intermediate & Final transfer completion interrupt */
, v! X$ q* q+ k paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
|- |3 i% e/ K% E( J, r2 x paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 o! q" d l4 ^! O ^' j0 y) F, g d& n$ C! w
/* AB Sync Transfer Mode */5 e" O U- H8 C# a1 B1 l8 T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 `3 W0 }+ S. j+ V, E( {- \* F
+ I8 W \' h- P3 I- T; _
/* Program the source and dest addresses for master DMA channel */! @" u# L+ F: `5 P; D$ N1 L4 f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);6 t+ h( C/ i- d
paramSet.destAddr = (uint32_t)(ping_buffer);1 X1 P$ k3 f- @5 j7 F3 k
$ `; i3 F, `3 Z) k9 `
/* Write to the master DMA channel first. */ k# w5 R& ~7 e5 e! |. K* g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);# ~5 @' @# C* Z7 S; |) a) x: Z, b
}
: P- G" x, c0 T+ _ t. j* H9 Y6 z3 S+ k% i
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. x$ n% E0 W. Q9 @
0 G8 O& A6 r, ]" `- f; x if(result == EDMA3_DRV_SOK) 4 A8 c/ F4 g) S: }; Q5 y/ O3 y; D
{& _7 I- a( u/ X( ^( l$ }) |
print2arm("edma3 driver init success.",0);4 A; _8 Y9 v$ ^& H0 m2 D
}
; d% Y) {% [% \}
( I- C* a% Z5 O$ g+ ^) D! T
: p( k9 s7 H4 V v0 \4 U# F2 x6 `1 v K1 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# e+ K$ _" I: Z: J8 j
7 l9 s$ i$ u: y
+ P. m$ |* W# z2 G/ z! @
|
|