|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' e! a/ D2 K3 T4 A% l6 L
#define PING_PONG_ACNT 1/ S- Z; Y* \( ?* l' ?. C: y7 D$ b
#define PING_PONG_BCNT 8*32*40 , g. E3 m( N3 _" v
//#define PING_PONG_BCNT 1 1 p( M) X- O/ i h% u
#define PING_PONG_CCNT 1
. f% w# N+ }( B( o5 i#define MCASP_BASEADDR 0x01D000002 H+ c! [2 K9 S! K
#define Mcasp_RXEVENTQUE (0u)( h0 h. ^/ o- p/ R% [
" }$ }/ R" a7 Z/* OPT Field specific defines */
8 u3 f6 o' e0 h8 I4 U/ |#define OPT_SYNCDIM_SHIFT (0x00000002u)+ n" \2 m. f" Q- S
#define OPT_TCC_MASK (0x0003F000u)" {) I* [, W3 ?0 {7 N
#define OPT_TCC_SHIFT (0x0000000Cu), u, w) r" ^% e
#define OPT_ITCINTEN_SHIFT (0x00000015u)! ~4 h& p. c& `8 T' y% I* @
#define OPT_TCINTEN_SHIFT (0x00000014u), w" ^) f d1 i
5 v& H- D) X* B( O4 W* Y Qchar ping_buffer[PING_PONG_BCNT];
* }7 _& ]3 Z. S$ s4 V3 z+ Zchar pong_buffer[PING_PONG_BCNT];
+ f. |# I4 P6 z1 Z; Y6 w8 p) ]5 b" a9 ^( l$ k' D- p: y1 C
$ f) o: M0 H* K( q0 V4 q2 X& M
, d; V; u7 ?/ z1 S" s; C( ^& v& h3 T
* X% R2 |% N) X3 j) Wstatic void ys_edma3_init()* e# f% D+ k! _4 V" v! S
{* f% M/ t3 O7 G t! U
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! l) A' Y3 }7 P _- j# c
EDMA3_DRV_Result result = EDMA3_DRV_SOK;# U: j: z4 S: l6 `$ M$ f
EDMA3_DRV_Handle hEdma;
4 I) y5 c4 B6 d7 v1 h uint32_t chId = 0;
* r; X3 }' A9 q# r uint32_t tcc = 0;, u" a5 f T$ H! u) n# h+ u
* c& j4 z( j5 s' a print2arm("edma3 driver init...",0);- w' Z6 |- h7 Q5 l7 g( N) i4 N! a! \3 p
2 `" R) I/ g' E( _. h hEdma = edma3init(0,&result);
7 z8 E. C8 {$ @9 G2 G if(hEdma)
7 x S9 D# A- H. b* Z+ W4 g {, @8 l' b, Q& R1 \& p
print2arm("edma3init() Passed.",0);
6 B) E# {3 `( M }
7 h1 `9 W- X. {; ?9 Q; k! r else/ P4 n% S# v( Y0 ?, z; h
{
+ V; K' [: G6 @/ F print2arm("edma3init() Failed.",0);
, ]0 R! k- ]9 |; E* m) O }# V4 x$ E s* ~+ z+ R
3 @" u' N+ w" O+ ? if (result == EDMA3_DRV_SOK)% ^% Q6 P6 Z' s
{
& R5 N1 h. J& y# O result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: X2 e9 g4 M! ^' x (EDMA3_RM_EventQueue)0,
+ Y3 c; g/ `6 f0 M. O &edma3_isr, NULL);8 p' g4 M8 w$ H' \3 J9 ]- g3 D
}7 g% n* [4 m3 q
: [- D9 X- \ f2 C+ f3 p% N3 q5 e
if(result == EDMA3_DRV_SOK)
% i1 I4 k7 B; I+ `8 Q/ [ {
; Y1 w5 ~* G& L+ D' Q- n paramSet.srcBIdx = 0;
. @8 j5 x; O1 F paramSet.destBIdx = 1;
( E2 @# Z& y* J paramSet.srcCIdx = 0;
( u' r0 V& a3 B X4 u. y paramSet.destCIdx = 0;
% P. P: m$ |/ B' j1 h paramSet.aCnt = PING_PONG_ACNT;0 B. a A2 Q: c/ }
paramSet.bCnt = PING_PONG_BCNT;
, q- [ `/ n& [ paramSet.cCnt = PING_PONG_CCNT;( z7 d$ W2 e: f) a6 l* u5 q5 _5 x
' P. s6 w% y* D0 Z5 i a' W* j /* For AB-synchronized transfers, BCNTRLD is not used. */ l1 b2 w" ]7 J+ ]4 A; c/ S' W& H
paramSet.bCntReload = PING_PONG_BCNT;
5 D$ z2 `$ F4 ?8 h4 V$ Z; l& G) o! [# k% |4 K
/* Src in constant mode Dest in INCR modes */
4 k" q8 N) w* F! ~7 b. }6 D paramSet.opt &= 0xFFFFFFFDu;0 o; B2 r9 q+ n/ w
//paramSet.opt &= 0xFFFFFFFCu;8 H! e6 r6 I5 [, m/ A2 |! z# p
1 }5 x1 C1 z% k$ J& [% m /* Program the TCC */
- i( Z; n+ G: X5 V: D) K paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ o. A0 P7 x3 x& ?0 |# `, E
. B! D2 u7 C- j- z4 K /* Enable Intermediate & Final transfer completion interrupt */
/ R& Q- U: l- _3 d5 y H7 F paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( `6 S9 _; c4 ~2 u& X- c+ r2 r
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; k! F' N$ X( W, m2 C
5 ^4 k* k& t, r# R0 J, g
/* AB Sync Transfer Mode */- t# u; E4 g! I- I
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! W0 G, t Y' b: v" T $ h6 @0 Z& S/ r7 x. O
/* Program the source and dest addresses for master DMA channel */
6 u, k$ u( S+ u6 ?+ R2 z4 Q; G$ f$ d paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);- V* ^% L/ \; f7 {! e
paramSet.destAddr = (uint32_t)(ping_buffer);" x* s$ n/ E* O5 s* Y+ }/ I
$ ^8 u6 P* M! v/ G5 o. b8 q2 O/ @ /* Write to the master DMA channel first. */" ?( G+ n' u& N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' L. X/ k* @7 l) O+ `
}
( I" Q0 Q2 @. w5 v* \+ x9 G* p, e) U; N( U8 {* d- J
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 `/ b, m: z4 @* h! T2 L
# C& I% ]7 c, \% p if(result == EDMA3_DRV_SOK)
' e0 m N8 S, p; Y7 h {& a6 M7 p9 O5 s1 {3 j1 }* H7 V
print2arm("edma3 driver init success.",0);
! O% z1 B. ]" i$ M } 4 ]3 q! k3 P- b6 [; g
}
7 f8 y8 `$ V: V o! Z$ o
- G. g! l$ o4 J
4 n5 x. y" k6 T7 eEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 Z" K- ?: [; }4 t- h9 G9 @. W; M, p, V6 V9 l+ k
$ Y# P+ k: O$ Q* Z i7 @* q$ U: R |
|