|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 C& Z$ S) r6 ?) ^/ t
#define PING_PONG_ACNT 1
; }2 G0 X7 p5 \9 t7 q5 j#define PING_PONG_BCNT 8*32*40
& L1 K% _( z1 a//#define PING_PONG_BCNT 1 5 A( E, f- _: P& T+ H& b9 b
#define PING_PONG_CCNT 1
0 V# r$ n1 W' \* P# @5 e#define MCASP_BASEADDR 0x01D00000
5 g' ?, h+ T9 b6 v$ r7 y# G#define Mcasp_RXEVENTQUE (0u)( r- A8 J" B% H8 q1 o7 J
3 _1 a# I9 d' u- w8 ]/* OPT Field specific defines */4 ]) x4 k, Z- O& n: p7 k9 J
#define OPT_SYNCDIM_SHIFT (0x00000002u)+ [$ q7 _4 V5 i) H- \- ?
#define OPT_TCC_MASK (0x0003F000u)
$ z4 I) [- f( z2 v8 j4 V+ R6 A#define OPT_TCC_SHIFT (0x0000000Cu)
7 ~" ^# ?+ Z% ^- D9 p, w#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 I4 s0 u. X7 X; d; r#define OPT_TCINTEN_SHIFT (0x00000014u)3 |. R3 _( Y F+ L5 r* C: J: q+ x
( N: [9 t# {# k, D
char ping_buffer[PING_PONG_BCNT];
7 r; p* W0 r/ {% w% j% qchar pong_buffer[PING_PONG_BCNT];9 a* Z1 s! W" ^0 x6 I7 a
" f1 S1 `' }8 R6 r
" T1 P9 G: `- S1 T D/ r
7 b( C, [, f0 c2 a4 |& h
6 I7 S- w0 b" P+ i7 g% rstatic void ys_edma3_init()1 K* S- ~8 v) E b2 ]% L5 p
{
! ], F* `# t8 } EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 x& l3 t( e, `0 q& j. }0 K& U$ V EDMA3_DRV_Result result = EDMA3_DRV_SOK;- B% q8 v0 A* G; g/ V4 Q% T
EDMA3_DRV_Handle hEdma;
; _6 W8 c2 r2 C) a0 p6 _ uint32_t chId = 0;
% e- [: C$ `1 H* G/ g% t uint32_t tcc = 0;
L- Y) m+ R' [; y
" i% l. Y9 k" J print2arm("edma3 driver init...",0);- V* }* O7 C2 W! J
' b- ?4 d2 t9 X) E hEdma = edma3init(0,&result);
9 @* }' c2 b M if(hEdma)
; }+ z4 N# Z9 D C( O {& j& C1 B3 I# |7 @& B7 A4 U Z
print2arm("edma3init() Passed.",0);. O5 u9 N9 G! Y8 ~( c7 r% |, u
}
( E- l- g0 `+ n/ u+ d5 _2 m* f else
! M' \; N5 e& U {
$ |; d! }6 C7 }) t1 s0 R print2arm("edma3init() Failed.",0);
# X7 A& b9 \9 Z( p) r0 M+ Q }- t4 q+ N( y3 E! Y
' C: e, t k1 L if (result == EDMA3_DRV_SOK)& I' p7 @3 \+ m; x' X" h2 h
{
3 \4 s' U1 K" r9 Y3 C( _ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# B; d7 A$ h% d1 N
(EDMA3_RM_EventQueue)0,3 W1 L9 S. O. E& l' P6 ]. v2 R: t1 P
&edma3_isr, NULL);8 ]/ _( v/ f6 F* g5 |; h3 u+ r: j
}
. h% v3 Y- A- h $ G( y L7 |/ n% i9 F9 x
if(result == EDMA3_DRV_SOK) k9 x2 U4 F9 v: A
{
, f4 F0 a. J3 z/ L, h3 U paramSet.srcBIdx = 0;
3 y2 H+ X4 _1 L& T) C paramSet.destBIdx = 1;( S* S% Y& W( ^: Z' T
paramSet.srcCIdx = 0;$ z+ q( i9 N. K+ C- N
paramSet.destCIdx = 0;0 a+ S9 p: I% N
paramSet.aCnt = PING_PONG_ACNT;
! x9 L/ @& N2 F/ C paramSet.bCnt = PING_PONG_BCNT;
9 {: T s$ X0 p8 u! m0 ` paramSet.cCnt = PING_PONG_CCNT;( }5 b% k7 Z$ V6 h2 k8 Z$ K/ U/ X
, o1 x8 T6 I" O1 c) | /* For AB-synchronized transfers, BCNTRLD is not used. */6 e% q( P# J0 |, C4 ]+ i$ S
paramSet.bCntReload = PING_PONG_BCNT;
* ~2 E P. z- a
& y7 c6 z$ P# q8 I6 q+ ? /* Src in constant mode Dest in INCR modes */! u0 P7 @* o! Y6 o1 O
paramSet.opt &= 0xFFFFFFFDu;
0 j+ A5 t# a/ U; M //paramSet.opt &= 0xFFFFFFFCu;7 }1 L$ R$ [0 Z# | V
# A' c$ ?1 r7 F1 V/ n
/* Program the TCC */
$ \% |5 U' ~% d1 C8 _ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! `' q8 k0 m5 b: A( l5 M% T
1 B1 ^ v0 r1 O4 \0 U: ]
/* Enable Intermediate & Final transfer completion interrupt */" n+ s4 n% I, C" z) V3 h
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; j; [. H4 x! P) }" _4 ?; O4 y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 O/ m% a; J/ |' r
3 D0 w% m; v" ]' D' l
/* AB Sync Transfer Mode */
/ x3 a9 E6 R2 U paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ ]2 W! w3 E& y6 g5 K- M
# [! w# n2 s2 i1 E& u
/* Program the source and dest addresses for master DMA channel */: Z/ C: L/ h" P3 L' q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);5 E* L4 m2 d) @4 q y9 ?
paramSet.destAddr = (uint32_t)(ping_buffer);: ^; J- w& u, U/ h& |3 S% L0 r
& b0 I' z( L- n$ v7 S- g1 _- A" R /* Write to the master DMA channel first. */
# l o8 A8 z( v+ f9 Y% k: G: j! [ result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);# G: B- S2 \2 X; s* p4 t% [
}
, u& W1 e6 |- x+ K7 v' z& \6 H) x7 F' m" e$ E- u4 h7 y" k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& l# b! ?) q3 v' X' a( b/ F# V
, P' w; y& N3 r! U$ E' L' `
if(result == EDMA3_DRV_SOK)
. R3 \+ R: V; J. E; w8 ]7 @% a+ _. v {
, t( l P! x6 S9 l print2arm("edma3 driver init success.",0);5 P: T. g# e' k- {
}
: v; U O. w& @$ ^}& w) a6 n9 `; l. Z( y
$ u- o/ ]9 X, d8 b# h5 M* j# }( z, a8 p9 }' p z4 A" z" N
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ k+ {+ k/ S. l
/ |( v# [ V. h1 a$ o
' M2 |6 Q% W1 s. u- A |
|