|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 A& ^7 C0 c. ? P+ I4 A# V
#define PING_PONG_ACNT 1# w" v6 ~ u4 C0 z' B4 C8 b
#define PING_PONG_BCNT 8*32*40
% B* Z* ^& E+ S, m//#define PING_PONG_BCNT 1
# ?# }. X6 U2 C8 {#define PING_PONG_CCNT 13 B+ I' P# g' K; f6 q; o( }
#define MCASP_BASEADDR 0x01D00000
6 T) Y- s9 J9 S! q9 m6 T& E% |#define Mcasp_RXEVENTQUE (0u)
; V; b0 z5 U) s: I9 K5 p# z" S4 k# @% t# b! D+ Y0 H, ~
/* OPT Field specific defines */, J4 G8 U @1 H( ~
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! V+ _; _% y. a! c0 j#define OPT_TCC_MASK (0x0003F000u)$ W/ Z# u" G& r" h Q6 r' U% I! Z
#define OPT_TCC_SHIFT (0x0000000Cu)# N, D8 v; ]9 n2 A+ K
#define OPT_ITCINTEN_SHIFT (0x00000015u)2 G! Y* B6 u- D5 m
#define OPT_TCINTEN_SHIFT (0x00000014u); H8 H2 }. g8 z \5 {/ W
' g( X6 B, J/ ^ @( f" D) B5 W/ wchar ping_buffer[PING_PONG_BCNT];& l5 P+ p. X$ ~$ O
char pong_buffer[PING_PONG_BCNT];
) h; k" v+ L% V" x0 O" y& d/ ~
y, q8 b. V+ S% W$ x G5 B0 b. m5 Z3 s
" w# @8 Y7 p. Z- p
/ U3 i( Z9 m3 L1 Nstatic void ys_edma3_init()
! R9 H) f1 N2 Y3 H0 M" ?7 w# E{; J4 _9 |; i9 _4 _5 m G* t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ u, ~- P9 Q* {$ W' _! X r' J) L EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 E- g0 O2 z& C& t% W- z1 m% C EDMA3_DRV_Handle hEdma;
. p8 m+ r9 d& N; B9 N uint32_t chId = 0;
2 V7 e- }% y& ^3 N' P% g' J* k uint32_t tcc = 0;1 z* v$ U* w) h5 D$ z
+ y# I1 h3 X/ l7 X
print2arm("edma3 driver init...",0);
, G# _3 w1 \3 `; b. v, ^. |) w, R+ Q; j. d& F; P
hEdma = edma3init(0,&result);+ P5 \% g* R ]2 {, w# ?
if(hEdma)
7 t7 \7 g9 h; } |6 w4 u {
I7 t7 m% z* U8 ^5 e print2arm("edma3init() Passed.",0);
" A# t' H3 R; A3 o4 U- R+ m' l }
9 Z% G' W. i1 _/ @$ y4 ~8 R# J else: N0 X7 y; Z( n( o
{
% c7 h! L3 y* P4 h' p8 x' _. | print2arm("edma3init() Failed.",0);! @% M" w3 _/ i* I/ c4 a1 V( ?5 I
}
8 M% d+ U$ x; U A
9 E7 U) }1 P& f if (result == EDMA3_DRV_SOK)
; I! ~% Z. T. I: v( _( e* [ {
- ^8 q- `7 k% w result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! k1 Z( c9 n! K+ y1 f (EDMA3_RM_EventQueue)0,7 W$ Z1 J% }9 b8 c3 v
&edma3_isr, NULL);
( R4 l5 c$ Y: l6 n2 N3 _ }
# D. u! E& D+ q- Z. L
: e8 ?5 u8 c0 g$ A, A if(result == EDMA3_DRV_SOK)
* W# y8 X8 B* v/ n) ~2 u7 R {# h- [ I4 t" z" @) t3 n
paramSet.srcBIdx = 0;
# D! n+ {% |+ o paramSet.destBIdx = 1;
( R" u# U0 x% L' Q* [! i paramSet.srcCIdx = 0;4 W# j) Q, H( F* V# r
paramSet.destCIdx = 0;
: s; e- {) J _) J paramSet.aCnt = PING_PONG_ACNT;! W& {$ e- u- a/ N% L
paramSet.bCnt = PING_PONG_BCNT;
Y! @/ E8 F0 I* h9 d4 O; G! b paramSet.cCnt = PING_PONG_CCNT;! w$ d1 e# q2 D1 a
" n' K' k) j) [$ Z3 z* B+ | /* For AB-synchronized transfers, BCNTRLD is not used. */# C- n, W1 W& ?8 C/ T8 P
paramSet.bCntReload = PING_PONG_BCNT;* L+ c; I; _, P
) u9 r# Y, u$ t8 f
/* Src in constant mode Dest in INCR modes *// {2 K5 Y% s4 X! O, e7 K
paramSet.opt &= 0xFFFFFFFDu;
/ W+ o$ U2 m6 S/ B0 L+ a: @ //paramSet.opt &= 0xFFFFFFFCu;
. v" `3 _3 p9 ]6 v: F2 Z) x
$ g& L# h0 |# j+ C /* Program the TCC */
K6 Q M. c8 h/ t paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: q2 s, W1 b, y$ ^* q
4 L0 l- J! V% Q; I1 w; {* U /* Enable Intermediate & Final transfer completion interrupt */. T' h4 ]$ u3 h- s& e9 v
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& _1 ~1 B* i- J/ A7 n/ w- C3 ? paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 r% e: e0 z( {& [1 K$ K& S& Y
" ^7 m, H5 x! O2 } /* AB Sync Transfer Mode */
& l2 D. C& @6 |3 J# d2 n9 V2 j paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 F! O" }8 o) ~
; h( V' f4 ^5 N$ b/ ]
/* Program the source and dest addresses for master DMA channel */. Q% o* O9 N4 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ S4 S- [$ j+ ^9 g, i2 y) K
paramSet.destAddr = (uint32_t)(ping_buffer);: [1 [: z- b0 E4 B. A
4 J9 V( X, g6 X. V6 F5 X4 E
/* Write to the master DMA channel first. */
8 r1 v6 _, o7 I9 j result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ p3 n" I- b, S. E3 e- w9 k9 e }
, [/ h3 W; m3 [; U2 y* u: X' k
" H" C- e6 h$ v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% F+ J; P. T0 q" P
7 t: h# [! W( v0 [' y if(result == EDMA3_DRV_SOK) & ?" `% n0 f, V* u
{& ^4 L% Z( x8 P! h; F, Q; T
print2arm("edma3 driver init success.",0);* ^ X6 o0 \: p- v% o
}
* |7 G. {/ W% e* N; e9 o8 a}* n6 \6 }& ~4 @, q9 T9 ?. z/ F& y2 O
# A" U( d3 X( D
0 o7 U0 i- s% @EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: u4 a: Z3 V: f% i; W! q
8 x. S0 G1 M4 H
6 k' C5 s& ]! u& I |
|