|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 b+ i' ]" @8 b; J1 F* \
#define PING_PONG_ACNT 1
2 n* K! d1 Z" G& {# Q#define PING_PONG_BCNT 8*32*40 0 F, f: L) H) w: l
//#define PING_PONG_BCNT 1
# K; z, @, U* `/ G#define PING_PONG_CCNT 11 y" \; q/ W& |9 {+ T- p2 o R
#define MCASP_BASEADDR 0x01D00000' H1 J5 f0 u X2 o
#define Mcasp_RXEVENTQUE (0u)' c; B" a' a+ j( }
5 F8 h4 }9 [% @4 d$ Z/* OPT Field specific defines */$ Y/ U8 v/ _8 Y3 q2 z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; L% A- R3 _6 \) T3 D0 s#define OPT_TCC_MASK (0x0003F000u)! m$ U! T! b3 w7 \& `8 [
#define OPT_TCC_SHIFT (0x0000000Cu)
& l. P J2 J! f, w& y#define OPT_ITCINTEN_SHIFT (0x00000015u)
" j0 ] E. \4 F: c& E0 S1 C3 P#define OPT_TCINTEN_SHIFT (0x00000014u)
2 G# o6 i; }5 x
5 X. M" m# Q8 A! L* o1 \0 ^char ping_buffer[PING_PONG_BCNT];
2 o# f6 z' |# f- p. T- _. _char pong_buffer[PING_PONG_BCNT];4 r8 q; A* I3 m0 @5 P; n' J v
1 Z5 L1 x, J1 q* e/ u
; G6 E5 S, V2 ]0 Y! [& V/ v% ?: H1 J8 Z2 x( R$ m! ?; K- B) I4 D
/ E; P/ V+ C6 H$ N5 z& q
static void ys_edma3_init()
7 k9 w, H$ \8 T8 x$ a{
' C) O x; [7 ? EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) U% c7 r0 m3 R; _! f/ G O- D- Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ I) J$ [6 V I EDMA3_DRV_Handle hEdma;
# k3 O( m2 {: Z9 i l uint32_t chId = 0;
r" `: C7 I# y uint32_t tcc = 0;( I8 n. P& P; _2 {
0 `2 ~* u' t4 P x) H7 M9 U5 N print2arm("edma3 driver init...",0);4 k; i" l0 N: F7 o/ A" H
0 U& N+ W+ x, a/ n* W hEdma = edma3init(0,&result);
: D) x8 _# y4 m8 |; [, W0 V if(hEdma)
( L& O. W; V" m" ] {% o* K1 G4 d, m% k8 y
print2arm("edma3init() Passed.",0);
3 {+ w: b9 S' @& }+ q }
8 N; b9 b- g0 y' J& H+ w( m else% W$ @, h* R- s/ [
{
" i' {- Z2 B1 c" U print2arm("edma3init() Failed.",0);
" e5 J5 }7 S' C! Z% S1 S4 `& D }3 p1 c; P% V2 e! J1 v4 ]
, a& \8 @9 I" E/ ]. j0 B if (result == EDMA3_DRV_SOK)
" y3 D" E* o. t+ \: n+ d {' h- o D0 W1 a8 C6 U6 @( }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. o$ I6 D; _ i8 R# q8 j! N" Q (EDMA3_RM_EventQueue)0,4 ?/ x W+ ]0 ~* {1 p
&edma3_isr, NULL);, b' s0 s$ M+ F g0 Z; }
}. ?' s; ]7 x! N, L! |
1 b X; q8 q' L( S1 ]
if(result == EDMA3_DRV_SOK)9 c& J* |% L! M) M" s( u
{
6 k5 q d8 C' e9 |2 ^ paramSet.srcBIdx = 0;1 F5 e2 u# E8 s) \
paramSet.destBIdx = 1;' n6 M9 P3 q: @, G* z' X
paramSet.srcCIdx = 0;
, W% x9 k ?0 R paramSet.destCIdx = 0;
$ c! B0 c. o# j: D. X paramSet.aCnt = PING_PONG_ACNT;% `+ }7 Z% i+ w$ _
paramSet.bCnt = PING_PONG_BCNT;
+ ^1 c2 n3 R' L8 D paramSet.cCnt = PING_PONG_CCNT;" a( e1 _" ^, d! \( h$ D, d
! x+ m# e$ q8 f0 r5 o /* For AB-synchronized transfers, BCNTRLD is not used. */9 i K1 |. u" X& _+ j
paramSet.bCntReload = PING_PONG_BCNT;
3 _" ~9 w0 r5 m% T" E
7 ?1 ~* k5 e" v2 w+ n' U /* Src in constant mode Dest in INCR modes */3 y' k$ t, D. ~
paramSet.opt &= 0xFFFFFFFDu;& N2 N$ Y; L/ F; U4 k
//paramSet.opt &= 0xFFFFFFFCu;/ ]+ k9 N: a# x5 J m% N1 ]: M
% Y: x& l D0 K" d) n/ A' H2 a /* Program the TCC */4 n2 h6 x$ H4 V
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 d0 y0 w# @& D* D7 w9 K3 ?
, D7 d( |7 L* M' i
/* Enable Intermediate & Final transfer completion interrupt */2 L! l: L9 p+ V$ e1 P3 i% I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* v7 [7 B3 ?$ {1 _ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- T3 z. J% n: ~2 H7 G; u( y
( r+ \" a. n u) ]. ~
/* AB Sync Transfer Mode */
( {3 [ D/ }5 ~5 H' M) n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 d% @5 `: h0 g- I# i
0 m8 b, m) T& [ /* Program the source and dest addresses for master DMA channel */1 I0 n$ _4 \! |# A
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);4 P- X/ Y& J) O) Z K6 H; {2 E
paramSet.destAddr = (uint32_t)(ping_buffer);9 d8 m6 x9 o& e% j5 e
3 ?; s% y4 G: n [0 o `! Z& F* C /* Write to the master DMA channel first. */
% Q7 j2 y) `) [5 U1 q! Q5 [# e3 X8 E result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" a- i4 E' h( J, F$ y1 j7 h }
1 e$ g# X+ W2 D5 k1 m8 J% v
" t. Z. ^) w8 f. Y result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 l& i. A* J2 e+ i% o2 i1 J$ ~
/ c- R7 k, q- Y9 A. o if(result == EDMA3_DRV_SOK) ' |. }$ \/ j6 Y }
{8 x5 \& t/ y3 F8 d' |- b# g
print2arm("edma3 driver init success.",0);! @" \( \- O/ U# l* L8 N
} 8 c8 K7 ?! ]% e" s6 r& M9 ^$ `
}' m, R1 V, y' {6 {3 Z4 T( D
; Q( k$ V7 u" b7 |) e( C+ T: e. \3 D1 V8 F; {- W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 @+ _8 h. S2 N E9 P! D7 O. a& B: l: N4 @
3 E0 v/ D! z1 Z1 Z. S |
|