|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, I7 w$ l J8 |#define PING_PONG_ACNT 1
9 @! s2 l& s3 g# X8 c$ _5 G#define PING_PONG_BCNT 8*32*40
9 w$ H4 ~- n( c2 \. |//#define PING_PONG_BCNT 1
* c4 S& ?4 b% x$ V7 Q#define PING_PONG_CCNT 1
, q$ y) u+ E, |. y* [#define MCASP_BASEADDR 0x01D00000$ |3 |( G ?9 u
#define Mcasp_RXEVENTQUE (0u)
& J9 i1 A4 I* s4 N
, K+ E# r0 M9 u; u2 I. ]0 \* d/* OPT Field specific defines */. s. a: o/ \5 q h9 z( L* ^
#define OPT_SYNCDIM_SHIFT (0x00000002u)9 D% G5 R1 j2 u0 a8 p2 R
#define OPT_TCC_MASK (0x0003F000u)
4 Z( w8 Z: ^ e9 [8 S6 K) E#define OPT_TCC_SHIFT (0x0000000Cu)& T0 W9 I9 i' Q/ e
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: m0 }8 P4 @: d( d0 x# A#define OPT_TCINTEN_SHIFT (0x00000014u): n. h9 g7 N. ?) U) ~ I
. w( y" J4 p& c& E$ F4 Kchar ping_buffer[PING_PONG_BCNT];5 a; X0 `: t _/ d" \
char pong_buffer[PING_PONG_BCNT];6 s& a, F; X/ u# W9 ^2 X$ X
/ Z( x/ M8 \; V
' Q; ]- v, |) S3 t
/ s1 d0 R8 u- B& D) |1 t
: u5 ]5 J2 N% _' E& istatic void ys_edma3_init()
: p- d3 ^' Y0 ^6 z8 G, ^2 q{
* z1 S" _3 z, l EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ w( p, W. Q4 |. I1 E, X EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 L9 X& ~& Z/ A9 Y
EDMA3_DRV_Handle hEdma;
/ r& y! e. A& { uint32_t chId = 0;
! A3 x9 ^2 N( m4 I$ f# J8 k$ Y uint32_t tcc = 0;1 @1 b2 L* K/ \- f1 \: m9 i! t# s9 V
: F7 ?" ^" R$ | print2arm("edma3 driver init...",0);4 S# X: F1 D( u9 j! m
- X- _6 J* ` @6 ` hEdma = edma3init(0,&result);% C- K* J2 Y; A* Z g
if(hEdma)
L6 I2 l |8 |% @! H' [ {5 g& `% @( f/ A/ N
print2arm("edma3init() Passed.",0);
7 ^1 r8 }: @& I6 o" F; k1 P }. \! N& x- v0 r0 J
else) A* i; z7 Y# g: Q' e
{
6 c3 F4 I% k3 p! b print2arm("edma3init() Failed.",0);1 E1 @ R; C: |; l. C- c$ t
}3 y4 _+ F0 \* q, F! n
: A8 y, V2 g" H9 ~ if (result == EDMA3_DRV_SOK) r9 e- ?9 p- n! H% u- l
{( H V! q# \7 t$ G$ I5 r
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( h- x& k+ i0 ] \! ^ w7 K# e
(EDMA3_RM_EventQueue)0,
4 V. U$ k3 E7 P* }* m" ] &edma3_isr, NULL);( t) j _2 M2 q1 N/ B/ }
}1 f) R# p2 `, p U
9 a: ^/ ]) G6 A- g if(result == EDMA3_DRV_SOK)
/ x* q* U4 l) f5 c& d {- \0 f- W) K% h, ^0 ^
paramSet.srcBIdx = 0;
( J& S. ^1 g1 R7 U$ H- d paramSet.destBIdx = 1;
6 r) t# e2 W3 v* U- n paramSet.srcCIdx = 0;8 s" v" B/ T1 }) G, }, K
paramSet.destCIdx = 0;2 c* V0 x9 v# F& F v: m
paramSet.aCnt = PING_PONG_ACNT;) u) V5 F- @7 m4 Q- {( n
paramSet.bCnt = PING_PONG_BCNT;
+ }$ R# u. w# | W6 Y5 L8 C* M paramSet.cCnt = PING_PONG_CCNT;
5 d1 l: M* d! C# d" a3 ]
; f- K3 T+ c# ?3 { /* For AB-synchronized transfers, BCNTRLD is not used. */5 V; b; t% L7 D
paramSet.bCntReload = PING_PONG_BCNT;
3 z1 r# E) X/ x- q
; H* E/ K( O" F& I /* Src in constant mode Dest in INCR modes */
+ t. }# Y6 [9 F! I; i; e paramSet.opt &= 0xFFFFFFFDu;
+ i% P" }7 z- B. F5 f7 r //paramSet.opt &= 0xFFFFFFFCu;
, E# m$ G& J: i5 j3 j! F4 }3 M
" b# r$ i# |9 I4 ]7 g /* Program the TCC */
: h2 v3 t |( E8 h paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 e1 B* g- V6 O: M
6 {) x$ G: Q, f, X+ b0 j
/* Enable Intermediate & Final transfer completion interrupt *// {! C7 ~; \6 v: m
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 T J6 K% `' v0 N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 [# c$ R6 b% g+ ^6 S
& |8 |! P8 |; q% S
/* AB Sync Transfer Mode */9 G: C$ L5 ^( X6 M) g! D4 L/ V+ G/ y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ D2 H( N0 L4 Y- U
& a; L7 W; l3 C
/* Program the source and dest addresses for master DMA channel */
! r- ?! G; w5 g paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);5 h6 ?7 d) G# \4 H. A0 w5 I
paramSet.destAddr = (uint32_t)(ping_buffer);7 A% s/ s3 W- k; z8 X+ {
& V T& U ?1 k; S3 S2 E" U /* Write to the master DMA channel first. */
5 n1 ]; |& M; Z! p' O/ ? result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);8 P# f$ w) w* j& i
}
- b8 i O% D U9 D- `& e! c) J. W5 Z/ `% l/ |6 M! U: _7 V
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 k* A7 V1 l+ a2 A2 P( w, g
0 a0 \0 W2 \, E8 C4 e! a1 x if(result == EDMA3_DRV_SOK)
' |2 A" y; H% S9 N$ r' t9 } {
4 x- S* C' K5 w* H7 V7 g4 _/ ` print2arm("edma3 driver init success.",0);3 k5 j! G" y6 m. `2 `
}
% f( K$ P* e3 C- C}& N# r. x7 G" p8 }* t
7 f+ k( ^8 h4 u j7 Z) ]& z+ z& H& m
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 p+ Q$ G! M# b) U. U& l; d0 v/ S8 ^+ ^4 `9 j, u1 x
3 S6 P) ^8 O2 k
|
|