|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ V- d7 ]+ m1 d% h9 W. ~3 G#define PING_PONG_ACNT 18 X/ f# f, W F! y; H% b M7 S
#define PING_PONG_BCNT 8*32*40 + O" H) w- X0 z
//#define PING_PONG_BCNT 1 " T ]0 ]# t4 z
#define PING_PONG_CCNT 1! }$ N: r, R% n, H2 \
#define MCASP_BASEADDR 0x01D00000/ A8 `1 l& z9 W1 m
#define Mcasp_RXEVENTQUE (0u)- t; E- y8 a5 }% I7 C
9 f/ k+ u) O6 [; @- a; U$ G/* OPT Field specific defines */
8 o, A, n& z; _! Z7 q N8 h' e#define OPT_SYNCDIM_SHIFT (0x00000002u)1 ~+ I3 l4 x% j4 f ^ \! {
#define OPT_TCC_MASK (0x0003F000u)
! p- f7 q' ~' s% ~% t: X#define OPT_TCC_SHIFT (0x0000000Cu)& ^9 C4 Z& w" f }1 `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# n4 N( s: c Q6 [9 d% d" h#define OPT_TCINTEN_SHIFT (0x00000014u)
l6 I# q* o3 m8 [
* m1 @; q. ^$ mchar ping_buffer[PING_PONG_BCNT]; v- q6 t5 {: y1 I8 `
char pong_buffer[PING_PONG_BCNT];
' t- B- V1 M8 ?. s7 Z; }( a3 n: T6 l$ P. c; i
3 a$ {' u9 v$ W0 ~7 q0 c
L: T( A- q/ j3 R4 f1 l* R
+ j4 _1 |: V3 P1 G8 nstatic void ys_edma3_init()
) J8 {6 q' ^( H% |; w* e9 d5 h4 D{- b! m( t/ [( ?/ X# a1 G* q; D+ }
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! T) z0 L4 |; Y% q8 t EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 {. b# X! ~: ^$ O; [ EDMA3_DRV_Handle hEdma;
$ O0 A4 Q+ e, X7 G$ u uint32_t chId = 0;
# R6 C8 J# S7 _% H. p6 i uint32_t tcc = 0;8 h/ V- T4 O2 @* z+ n, O3 G
- W) _- K! [! z5 V, k1 K
print2arm("edma3 driver init...",0);- @" S* Q% ?/ X& {% [( |% i) ?
+ n, X( v7 i* X% T% x! I3 z+ L hEdma = edma3init(0,&result);' T" n! ]& i, q( j5 k6 R3 Q) P
if(hEdma)) v; v5 _/ o `2 i
{
6 z/ {6 O9 Q: P. |: X) B print2arm("edma3init() Passed.",0);9 P9 t+ B0 ]9 ?. r8 V7 [- ^9 ?
}) k9 s: P6 p5 K0 k ^( w, i
else
( \# Q; r4 N9 u- p( c( | {2 @* P5 S" ?8 E% s
print2arm("edma3init() Failed.",0); k3 L3 M' L& A$ H1 {8 s
}3 @5 L* G" P$ z
: v h0 {% T2 u5 u" U if (result == EDMA3_DRV_SOK)
0 u$ s6 j) x& V A {
1 K4 I- X `6 H3 H, B result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ k% V z5 ^/ p0 U4 ` (EDMA3_RM_EventQueue)0,4 G% {9 i2 r- W2 c' S( U
&edma3_isr, NULL);" j& S' d- }) o2 b- p9 |
}
' i. t7 P5 {7 I
9 g, A. d6 j! j# Z% l( ^ if(result == EDMA3_DRV_SOK)
4 [2 {& e2 }. V: k D- [2 l2 L+ [ {1 Q; V% p2 U3 a1 ]7 p
paramSet.srcBIdx = 0;' W7 o/ V8 X2 A5 P8 C
paramSet.destBIdx = 1;7 P U4 D% f9 Z* B5 G5 o
paramSet.srcCIdx = 0;1 b7 V6 w% z" C6 C$ U( j# ^
paramSet.destCIdx = 0;# X0 K, j, m: o! G5 y
paramSet.aCnt = PING_PONG_ACNT;8 q" r2 P. o6 M, Y6 {8 ~* Z
paramSet.bCnt = PING_PONG_BCNT;
* z+ B# A3 D/ E2 R paramSet.cCnt = PING_PONG_CCNT;1 E, `' ~+ c# s
4 V$ N- |/ ~- X2 u, @8 m
/* For AB-synchronized transfers, BCNTRLD is not used. */" S- F6 D$ C7 m! ]+ l
paramSet.bCntReload = PING_PONG_BCNT;3 B0 F0 h' O/ C: H, V3 e% ~
3 K1 p% C3 b0 l8 |- _. D /* Src in constant mode Dest in INCR modes */
) e$ b1 G* }7 c! t/ k paramSet.opt &= 0xFFFFFFFDu;
: u7 _3 k9 y8 O //paramSet.opt &= 0xFFFFFFFCu;
8 f7 i# X/ n* F( c5 b5 P
: F# }& f! F/ H9 X8 f z$ Z6 Z/ W2 @ /* Program the TCC */* Y- Q: o" k! P5 _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 m$ s% U X/ b. V" k) }
9 `. z' h9 X0 }5 g( j) k* b I
/* Enable Intermediate & Final transfer completion interrupt */! n+ B, }5 V' C# F6 d
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ z7 X4 E$ k, m8 ] paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); e" Z h9 t, R0 Y
' l# M8 P. q M5 [# B
/* AB Sync Transfer Mode */
8 o/ |7 Z7 q8 W, V9 z& C% k paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% Y& r+ u5 o! L+ G+ _
" h I- y* t9 z1 f3 m. M /* Program the source and dest addresses for master DMA channel */& T! l2 i. D& O& m! w! z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);, _- `' g: z- `4 O5 E
paramSet.destAddr = (uint32_t)(ping_buffer);
1 s) G e x! W/ ]4 R# O; E1 A" F/ A& b% |
/* Write to the master DMA channel first. */
1 ?# }, P6 M0 H2 R+ o$ Z- A$ D result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" S5 x) [2 \3 o' \6 C F7 r5 @ } # g# x, |3 ~$ c) Z
5 {. p$ u. z1 e6 r6 z& } result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 Z4 s% R5 n9 g5 c3 [ y( Q
' x4 {5 g, X9 K7 e9 G; @$ C if(result == EDMA3_DRV_SOK) 2 q. z$ N- C3 A3 w/ |! V
{1 k7 l; Q4 k) t( V- t A. K
print2arm("edma3 driver init success.",0);, O5 q- o/ G' S( s$ F2 _& V: j
}
6 Z. K6 a* S: d}! E7 i2 M. w) H/ s* E* l( [& F! ^
4 h% q1 p8 m$ T l# R3 d
# I. q0 V7 V7 _* A: `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" T' ?, U6 l- N& p
5 X) K! x0 t3 k* H+ s
8 K! @+ a* V( h# r% Q
|
|