|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:, \, U: I7 v q
#define PING_PONG_ACNT 1 q7 |" i4 @8 N2 ^" u& ]
#define PING_PONG_BCNT 8*32*40
3 B# v; @, ?, P/ g+ `$ H0 z//#define PING_PONG_BCNT 1 9 H/ Q! `0 O, Q3 v. F
#define PING_PONG_CCNT 1
' B3 @0 `! X/ E#define MCASP_BASEADDR 0x01D000004 H( r6 A: P, g* m
#define Mcasp_RXEVENTQUE (0u)9 e5 s' N, h7 M0 p( C- Y3 w/ U
2 G3 Y/ j0 R/ P5 L' k- e/* OPT Field specific defines */! ]$ g: }" R. a* s$ C; ^* i
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) _& b' t) B5 n) ?. b#define OPT_TCC_MASK (0x0003F000u); r( l3 Y0 I: J7 J
#define OPT_TCC_SHIFT (0x0000000Cu)
6 H ` m- y# h#define OPT_ITCINTEN_SHIFT (0x00000015u)/ [9 z9 S8 V8 h* O+ S
#define OPT_TCINTEN_SHIFT (0x00000014u)5 `+ @/ s* f" h
+ r/ T7 Q+ u, X' I w' n
char ping_buffer[PING_PONG_BCNT];
! x" L( f) U9 ~/ nchar pong_buffer[PING_PONG_BCNT];" i b" b, U: `( C9 H, Y
3 w$ z3 h* A/ K: ^8 }' S. e4 b' G( ]* R, m: `
- _7 R" {- P& X
4 X4 X, q6 e3 J- Y1 x- Jstatic void ys_edma3_init()/ [8 ]. K# X; S, s0 y% g; R
{
! z/ |7 p2 _1 c' i6 N6 W, c9 E EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( L: u+ K2 ?5 e8 e+ @* U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 e8 i5 }# M: D. T: W EDMA3_DRV_Handle hEdma;
, w8 ~" \* w* G* L& s3 Z uint32_t chId = 0;
7 X X O- m# t$ ~ uint32_t tcc = 0;( I( B1 G c7 |
* ^3 N6 M5 ]) Y4 P5 ?% v+ \+ i
print2arm("edma3 driver init...",0);
* D% u7 W2 F8 V" n5 w
2 M: H" Y9 z+ W/ T: D hEdma = edma3init(0,&result);( W5 e9 m9 l, r) _2 L$ T; V) j
if(hEdma)
: l3 }1 n; S" h' R {" z* H4 ?+ T8 H
print2arm("edma3init() Passed.",0);
5 N: P# w0 X: E7 Z6 J& P }& g: M9 B1 S; w6 z/ T
else
A8 ?3 i7 R+ I, U! n6 |5 Q' Z+ O {
# e) W" x( j5 @ print2arm("edma3init() Failed.",0);
& }+ y3 `! r1 X* i/ a# x }! `, S7 l8 a+ r
8 _3 N! j0 ~1 P4 }4 h! w if (result == EDMA3_DRV_SOK)
$ t; E& y' ^9 Y; M {3 J2 m* N# ?1 }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 p% W/ r" x" ~' I2 v" V (EDMA3_RM_EventQueue)0,/ e6 ]0 W4 o: H# D/ i( Q
&edma3_isr, NULL);- z, s: u& r: s2 k) e# d/ S) @
}/ m5 H' S- Z* @: I3 \& y) Z* r7 R1 u
) g6 w l) U- k+ P8 d
if(result == EDMA3_DRV_SOK). U* z' j# c$ {" Z' e" H
{: ]* A2 \' v% q
paramSet.srcBIdx = 0;
8 b, [4 ^+ Z. ^ paramSet.destBIdx = 1;
9 t7 X( M* g# \% p# M# L paramSet.srcCIdx = 0;8 A5 m2 l( d& k! _% N/ f$ B& ]+ M
paramSet.destCIdx = 0;7 ~/ F- R5 K& r% U# U' [
paramSet.aCnt = PING_PONG_ACNT;' p+ F) A. ^. L! @
paramSet.bCnt = PING_PONG_BCNT;. i3 }! Q, d+ ]3 c" |2 K3 n
paramSet.cCnt = PING_PONG_CCNT;9 M. M9 O- m! }% e/ Z& Z
# o# a: b8 o* z4 c0 v1 ?
/* For AB-synchronized transfers, BCNTRLD is not used. */: p9 P% j" N9 n) z. g6 A6 H
paramSet.bCntReload = PING_PONG_BCNT;
. N* o, v9 ^3 F- \4 z2 ]
! v/ m% _5 X6 E5 p: p) g" Z5 Q7 O% N /* Src in constant mode Dest in INCR modes */
" j! m8 C4 _; w7 p4 ` paramSet.opt &= 0xFFFFFFFDu;
0 u* U- k" W% m3 l+ E4 M4 u //paramSet.opt &= 0xFFFFFFFCu;" C$ z3 p9 h' n9 o/ r# H
; _! w& a" e, m, `( n9 C /* Program the TCC */
d5 |0 D `8 u# O7 k$ {1 T9 \' A0 `' F paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" v5 D' g7 V# \/ D! _+ h
7 Z- K7 u% n& M+ N+ V, a9 \! u /* Enable Intermediate & Final transfer completion interrupt */& }6 h }' A4 g3 [
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 \7 p2 a2 D8 z4 Y' y$ s paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' P- u& e0 J. a* q- _ ]' p
7 q/ @: h- `0 v7 S$ }
/* AB Sync Transfer Mode */! M) X/ E* ]1 y6 D. b! y. C0 {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 J6 Q. w$ _/ i+ f% I& r7 E6 E; n
. k5 |4 j7 a/ s+ S /* Program the source and dest addresses for master DMA channel */
# u7 y6 I4 \( t) K4 f paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) i' Y3 _8 |( ^- R0 Q' H& L$ k; l" E paramSet.destAddr = (uint32_t)(ping_buffer);
* T( X6 Y4 H: f+ n; j$ g
. c# q* [8 v$ @0 M/ h; v /* Write to the master DMA channel first. */& W+ D* t* Q% f# ]/ i0 l
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ p F3 Y0 q0 L- L } 3 X; Y- ^( x, T. g8 v% K7 { R* R
+ l w6 s4 S- V: M' N' A% m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);" [/ B2 s* `3 m9 H4 z! b
8 ?1 n, h( O3 a- H' ]. W t
if(result == EDMA3_DRV_SOK) - v6 E7 M6 R" A7 _
{# S2 @! @& q( a( D$ D" C% W0 X7 J
print2arm("edma3 driver init success.",0);
" [, `) Q |# v } # ~9 n2 }" m7 ^
}6 \0 Y. k, K) u' [" h
" H, e0 i8 s9 F# @( l6 i
$ }& S1 T2 ]; P0 DEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
z8 i3 O6 r0 v& f; [ N/ J" N& c* v% K( P6 f0 C9 N2 e! f' D
* L) ~# R8 ]4 M; F( f' E4 G
|
|