|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" A5 O, U3 K# p+ j- \) H
#define PING_PONG_ACNT 1
$ h. u: ]9 [% {4 Y" T#define PING_PONG_BCNT 8*32*40
, i& i& q6 M) k- l//#define PING_PONG_BCNT 1
?5 r/ |* y: n7 G2 d+ v#define PING_PONG_CCNT 17 i7 j+ y; e# \" ?) Z
#define MCASP_BASEADDR 0x01D00000
( e8 d0 O- j& R/ L" g- S: O. d#define Mcasp_RXEVENTQUE (0u)
% D6 J% v! l: A$ v" E
- ^" f0 H+ U! a; v7 r3 N, p/* OPT Field specific defines */- z8 C1 @2 z" v/ T: Z2 q6 e7 r
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- x( S- t1 v* U5 h#define OPT_TCC_MASK (0x0003F000u)2 N1 |7 M+ O* y7 H+ p
#define OPT_TCC_SHIFT (0x0000000Cu)
; S; b: w% M! T; h1 x+ `#define OPT_ITCINTEN_SHIFT (0x00000015u) c# u6 J2 U# s# q( g$ s3 j7 j
#define OPT_TCINTEN_SHIFT (0x00000014u)* b6 q6 [ l# C0 [: D6 v
' j) U# F1 H( f! l* T7 e, ichar ping_buffer[PING_PONG_BCNT];
" ~* [( H0 X$ H1 M. H" zchar pong_buffer[PING_PONG_BCNT];
+ I0 z! Y5 w, D* F
6 [6 G0 }; D2 u9 x/ t7 |( q; s; c: w2 u! w! d; Y
/ P0 S& W2 ~1 a
" ?) W" F3 S s9 Q: V# @! Q7 hstatic void ys_edma3_init()
7 Z) y, U$ O Z' O' [) a% D0 Z{/ K! [3 h+ d; i) \ u4 W
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 i) A$ T/ g4 w: N5 }# M9 [ EDMA3_DRV_Result result = EDMA3_DRV_SOK;' [4 f: Q8 O& K4 N( J
EDMA3_DRV_Handle hEdma;
0 _6 Z5 g v2 i( e, {: X) f uint32_t chId = 0;
7 l& ]" n- _* m0 }1 e uint32_t tcc = 0;
. o6 L; r3 `0 Y
8 z" i& y+ a5 @2 b print2arm("edma3 driver init...",0);
5 s9 v R$ ^& v$ [9 w# h6 q! M/ f' e
hEdma = edma3init(0,&result);+ c6 \" ]5 S |# ]! C
if(hEdma)
% d# f8 c$ J8 C. S {
. _. R& T$ b) d$ h* }, J0 H print2arm("edma3init() Passed.",0);6 ~( I* L$ N4 `) k
}
8 X! |: ^3 y4 B {+ f" H else3 o; q" M: Y, |
{
1 Z/ a0 @0 L' d0 d9 z- v print2arm("edma3init() Failed.",0);; G/ n7 w: N% P" p' b3 a3 i
}
9 ^2 Y3 |* E6 C2 H2 {# ?4 w8 Y* u6 X( m + c3 V( J2 H& ?( Z% L! ?( @
if (result == EDMA3_DRV_SOK). O- D0 V3 ~( [7 Y# X6 `1 C
{
0 M! k |) ]8 h( v# D result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 K0 l% L$ q/ o0 }) a (EDMA3_RM_EventQueue)0,. n* Q' I. {8 q7 M! A1 `+ f
&edma3_isr, NULL);
/ o9 a, }+ I6 c: {$ J }: J2 G; }. k6 I. f
4 T9 p! c+ D3 A if(result == EDMA3_DRV_SOK)# {, X) E* D" e6 w+ g$ i" O9 {
{9 \# [# B: L1 Y. R: Q1 ~
paramSet.srcBIdx = 0;
' I) r! i6 o# `- Q paramSet.destBIdx = 1;* c$ j& a- f: w8 j- L2 C9 ^
paramSet.srcCIdx = 0;
* G; m+ z4 F- x5 o" B! r paramSet.destCIdx = 0;
) y+ T0 H$ f$ W, z& I9 H paramSet.aCnt = PING_PONG_ACNT;
% [' A' @- d; S2 K6 ?" G$ M4 e. Q paramSet.bCnt = PING_PONG_BCNT;% n; ?% Q- m/ l
paramSet.cCnt = PING_PONG_CCNT;9 o. e/ g5 U& y2 q
% r) o* U1 o+ {* I0 J
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 v S. p( W9 ~* U( q1 R0 E+ J paramSet.bCntReload = PING_PONG_BCNT;
6 E, Z- p8 m$ z; N; q. M3 E! g' C' L2 X# @/ y
/* Src in constant mode Dest in INCR modes */) U) `5 g1 I& `" R2 K( b
paramSet.opt &= 0xFFFFFFFDu;
+ d) [5 x$ ]/ Y7 Z! H //paramSet.opt &= 0xFFFFFFFCu;
+ z& l# x* A# L3 I+ b ) U" _! K% {0 B1 L2 _4 c2 F, p' D9 F
/* Program the TCC */7 x/ p/ i3 W6 o
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. A4 ~9 h/ q9 ]" q f/ A5 C0 V* h
: o H+ v& x' j8 m; i. i9 y /* Enable Intermediate & Final transfer completion interrupt */
* o! k! ~& i4 w+ _# _ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 ?! H3 L. E" O5 d/ a% _' m# g! n paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);( O! X9 G: B5 F
9 J, u% u9 c4 M [/ t /* AB Sync Transfer Mode */
3 `, H9 |0 D7 s paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);- E3 C: }4 U0 P
; I# f5 N/ x; ]7 R
/* Program the source and dest addresses for master DMA channel */
8 N6 z2 {; F' u; K* ?* x paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);. [- i% N% F3 t, y. @
paramSet.destAddr = (uint32_t)(ping_buffer);
# ^5 i1 D& o4 r0 ~) s
/ D( d8 e: X$ g* K% n /* Write to the master DMA channel first. */" X; S! r2 S) @) j, [% _
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); m. p1 v0 x" D
}
7 J7 L/ p+ [8 z
9 t' x5 V3 v" L3 T9 ^7 ?2 y result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 t& h! m P+ `
9 g: P# R* G& t2 f7 ?* H if(result == EDMA3_DRV_SOK) 9 w# u( C8 H, |4 h% A
{4 ?2 D! {9 i; N% F& O
print2arm("edma3 driver init success.",0);
1 I, f" l+ a$ {, i( B8 j- s } & n' f7 f5 F# `' U! b" P" C+ g, b
}
1 T( K( F+ L w7 m5 Y$ T5 w2 l0 G. q# g& S0 c. A' {% D
" {" A3 |) J- D3 @" C6 bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! S# }# l0 M8 i/ e
# }7 o2 f! R0 w# e" H, G9 f/ t4 R/ r
|
|