|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) v7 m. m' v5 e* T6 [#define PING_PONG_ACNT 1
q( _" Q8 q; {; [#define PING_PONG_BCNT 8*32*40
9 G& V% \) y! {3 B' l, U+ S5 o//#define PING_PONG_BCNT 1
6 e( ], `+ Z$ t# L0 d0 \#define PING_PONG_CCNT 1! G0 j2 @+ c- T3 z6 a" ]
#define MCASP_BASEADDR 0x01D00000
2 ~9 N# Y, a w) s5 ]. L. C#define Mcasp_RXEVENTQUE (0u)0 q7 w4 I* Z" K5 @$ i3 X4 Y% L' F
" j- \$ H! z, j$ Q' T1 d% n
/* OPT Field specific defines */! J _. O; k6 z4 I5 [6 T! a
#define OPT_SYNCDIM_SHIFT (0x00000002u)+ F6 [5 L# Y3 @6 `" [$ y. I
#define OPT_TCC_MASK (0x0003F000u)
7 Z1 p; i, T- C* D9 P3 W#define OPT_TCC_SHIFT (0x0000000Cu)
& ^5 O, w) q& q#define OPT_ITCINTEN_SHIFT (0x00000015u): m) {4 _8 [( u+ |! x9 |3 t1 P
#define OPT_TCINTEN_SHIFT (0x00000014u)/ ]( p! Z1 S2 T5 w& ^8 o
9 A3 z8 N4 u$ s% ]/ Z$ Kchar ping_buffer[PING_PONG_BCNT];$ C! }8 D [0 s j/ r
char pong_buffer[PING_PONG_BCNT];
v+ g( ]; b9 m/ d) l; g, n9 d1 d
- S! C. V' E9 U
4 Q- ?5 y: M5 N$ u0 s2 y, d+ b: c
y8 R$ w6 B) Xstatic void ys_edma3_init()2 k7 q6 _9 y4 Z
{
: \5 c4 w+ `7 W# l5 h EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' W9 _: ]5 q1 R) ]% e# u8 f+ w
EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 I6 V7 ` i# }
EDMA3_DRV_Handle hEdma;
5 |! U6 C5 {% b, H2 B) k2 n' j: s V uint32_t chId = 0;
8 |7 ~7 Q/ c% r3 t% W uint32_t tcc = 0;
; x- a, F" Z( d& L$ | f5 f. P' ?; v
8 A: Z4 p* B2 L1 d9 f* D8 j) ~ print2arm("edma3 driver init...",0);
" B. P' v5 N6 j6 F9 k. j1 {) G# O: N& f
hEdma = edma3init(0,&result);
! l3 |- b7 H5 j& u if(hEdma)
9 v+ B0 |. y# X4 | {+ `6 z4 X9 U# V5 c5 D% P- j
print2arm("edma3init() Passed.",0);- r" J0 U4 P5 m Z
}/ `/ @( o0 ^& W0 Y9 C U b3 S
else, m$ y: }( e' |8 j/ ~" m
{( \, r5 j- G& V( p, v
print2arm("edma3init() Failed.",0);
) I9 ~1 e# X! A+ q0 y+ z }, }% s1 e9 `7 I$ s* _7 l
f& C8 z/ W* ]
if (result == EDMA3_DRV_SOK)2 A p9 p+ j& C& j
{8 K/ e7 T5 |5 U X6 J8 O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" }$ C3 G7 T, A (EDMA3_RM_EventQueue)0,
/ p& Z: A' Y2 l6 J$ G &edma3_isr, NULL);
( \2 N- t f3 n% q8 {( i) _ }/ I3 T0 H5 e# S1 i Q2 z) s1 O" }
7 t* W2 e) K( I
if(result == EDMA3_DRV_SOK)
: K0 a# n/ U1 [! o {
7 p8 }+ d r! k8 a. ^3 U paramSet.srcBIdx = 0;
( w' ^7 u% O$ T& i4 V t paramSet.destBIdx = 1;
& b- K7 _' ~2 b paramSet.srcCIdx = 0;
3 ?7 M# D/ C0 r paramSet.destCIdx = 0;
4 @- V9 G9 D5 L S, F9 ^ paramSet.aCnt = PING_PONG_ACNT;" F ~- h" I R3 h
paramSet.bCnt = PING_PONG_BCNT;/ w' U' H, ^6 W" H; x/ c
paramSet.cCnt = PING_PONG_CCNT;
/ }- z* s& N; j + `! H+ I% Q% j0 a
/* For AB-synchronized transfers, BCNTRLD is not used. */
; V2 {% F) |; i4 p- z: X paramSet.bCntReload = PING_PONG_BCNT;
: ^* |5 w: f7 ^2 B; l$ K6 Z: l
# L$ { g* p+ g0 n( Y( E O4 b% ~3 l /* Src in constant mode Dest in INCR modes */
# D0 M3 A2 r1 J) e% ^$ |9 Q6 s' o paramSet.opt &= 0xFFFFFFFDu;6 q: _. Y8 J' F& e" y
//paramSet.opt &= 0xFFFFFFFCu;' Z1 m- a5 i# V3 V& T
/ ^4 }3 B4 L5 a* \, u5 s /* Program the TCC */6 m) U# H" [( F3 Y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 E4 p n; K; u" C: G/ r: Z- l. B/ u9 l N0 s2 N$ Z1 j) s6 ^, t' W V
/* Enable Intermediate & Final transfer completion interrupt */
% \# N& _/ m% M) w paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ K5 g6 S. q. u. E% j
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);: u/ B3 O( a3 c
# O6 E8 Z& e1 Y/ }4 e
/* AB Sync Transfer Mode *// E+ G2 k5 e9 U% U* K; k2 b4 k% p
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& n! q6 M% p) o( [* o2 j f
1 s+ o6 P1 N8 @( ? z0 \2 p: p, @ /* Program the source and dest addresses for master DMA channel */* I. A" Q6 \' P+ o6 Z" Q7 g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);1 I2 l* V3 I. D) R
paramSet.destAddr = (uint32_t)(ping_buffer);4 |) k8 p0 \( k. _, y% N
' Z5 q' k8 I& i: V l; T! U% K /* Write to the master DMA channel first. */$ s" H$ x) s+ z) p5 C0 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
J3 J" F" @' N1 D: | }
9 h! d8 k8 d* _
: {4 ^6 W, N+ b# ` Q f9 d; l result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 y# y$ U& r+ ^" J# L1 O; i
$ Y: c* }; o1 T, i7 c$ I0 f; K
if(result == EDMA3_DRV_SOK) 9 U2 y4 z7 \) h" K
{
1 l5 H' G- R! ~/ T print2arm("edma3 driver init success.",0);3 c, S1 T& s# H. @
} % m7 [* [$ L4 t2 S1 ^
}* U3 T% j. L# s& Q" m) l8 |
0 C% S. M( D% a! i- q9 C
! ?+ \- k: v7 d# |, ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 K( y. ~& x% R$ F; T( U- V
- i: R6 @, ~4 D7 h! s: ^8 z# i V' f# s* Y$ d
|
|