|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# L$ K8 H B7 h- Z9 m#define PING_PONG_ACNT 1# y0 ?. @) b# p6 Y, v
#define PING_PONG_BCNT 8*32*40
! W1 m" f8 U' K/ U; }0 H//#define PING_PONG_BCNT 1
& h% I% ~8 `2 z5 a3 C( t5 t#define PING_PONG_CCNT 1- g7 ^; m7 q: U4 l
#define MCASP_BASEADDR 0x01D00000! O; k* N. b M( \5 K
#define Mcasp_RXEVENTQUE (0u)
4 M% d* A; ]. T+ Q0 K: o! A: U; D! |) ^9 K* M, _2 _( O% _
/* OPT Field specific defines */9 u8 u% Y, X/ }$ Z( j$ [
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" r' M: L$ s0 ?# Y; A: w! p# C#define OPT_TCC_MASK (0x0003F000u)
# G$ z; X/ C m/ X' w7 N0 ^/ ?#define OPT_TCC_SHIFT (0x0000000Cu)# v) x1 J; A+ c0 z
#define OPT_ITCINTEN_SHIFT (0x00000015u)& b W. l# j9 r# C6 w
#define OPT_TCINTEN_SHIFT (0x00000014u)& f5 `3 x* m- [5 b
8 w) ]0 b- W* s. ] w$ o. [char ping_buffer[PING_PONG_BCNT];
1 D8 H0 g$ q! Y+ S6 w& wchar pong_buffer[PING_PONG_BCNT];
1 I( Z3 N5 a C
9 {5 w% P* _8 f6 l( q
& F( _0 b: D& m$ `! E# D4 Y& }: V% I/ m$ | n+ s
$ _9 y, \2 _4 t0 O) \) o
static void ys_edma3_init()
( _- q% X" t+ k" B8 B! U{
" I3 F. Y; X: R1 u EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: s7 e3 `6 Y: D6 {, i3 A EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 C2 K' B8 r7 L1 y* T% P0 H7 B
EDMA3_DRV_Handle hEdma;
: s0 t5 q% n' P$ R uint32_t chId = 0;
2 ^1 O" U3 e" ]0 Z( K6 y uint32_t tcc = 0;
! h" C+ D' P& _
) l0 M& T: m& i# v: O. P print2arm("edma3 driver init...",0);
: y* w g. c* V( M/ J/ s6 K4 e. _/ I! g( m, ?# }
hEdma = edma3init(0,&result);
7 @, |4 \+ n( |% |# }7 z if(hEdma); J! A2 P& Y3 H3 g8 B- D$ K4 @
{
) E/ s) c1 l; w) X( j9 H print2arm("edma3init() Passed.",0);7 A. M, O( p& N' I7 M$ @
}
$ z t4 k" { B2 W! v( ^% @7 A else
% D. A. S0 {8 F1 Q {
! J f9 V& P2 f9 S1 g% a! T4 @ print2arm("edma3init() Failed.",0);* `- i, o! J1 w. h) w, a
}
9 \% d5 Z/ L9 h2 ~ 2 H8 L+ i* Q6 ]; ~
if (result == EDMA3_DRV_SOK)1 y+ K& E. V8 f& \" i n! l) G
{0 o/ i3 Z7 J2 j9 n1 K% Z$ a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; K' R; e( u1 L' T4 Y m0 D (EDMA3_RM_EventQueue)0,& N2 _8 |9 @4 E& g
&edma3_isr, NULL);
4 l% [5 X2 y" ?6 P) \5 X+ T }, F* c* ~( z- g Z5 e
9 D6 c# G8 ]5 b% o if(result == EDMA3_DRV_SOK)* ?6 ?8 O& E! ]- C4 y: @
{/ r' r& `0 H# d# v6 x
paramSet.srcBIdx = 0;6 B+ J1 ]; P+ x$ }2 s! d
paramSet.destBIdx = 1;
# a. X- E2 _- O5 u: `9 E paramSet.srcCIdx = 0;
+ z2 v d9 C5 {/ B, h o7 J" |3 m paramSet.destCIdx = 0;
% d+ G1 E* ~. B' S# I) y2 S paramSet.aCnt = PING_PONG_ACNT;
1 G8 [5 |2 T- R3 i8 \4 H paramSet.bCnt = PING_PONG_BCNT;* g/ r. ^, x1 P& ~, H
paramSet.cCnt = PING_PONG_CCNT;
5 n6 A p7 x/ U5 n( l2 h
, c& x, @4 F% G /* For AB-synchronized transfers, BCNTRLD is not used. */
- q1 q3 g1 P1 G# h paramSet.bCntReload = PING_PONG_BCNT;: q' p" s9 W; @: b
1 A) h8 h& o3 O( F
/* Src in constant mode Dest in INCR modes */
% {- d' |+ C( k paramSet.opt &= 0xFFFFFFFDu;( V3 e$ m$ o7 L# t
//paramSet.opt &= 0xFFFFFFFCu;
% b! |' j( e$ c% z) ?
) z1 I, u! u- k, F9 `" V i /* Program the TCC */
- F( @0 O3 `6 Z paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! q; ?4 G W- [7 f. k, p7 \5 [4 s
# |6 t" F4 n3 N /* Enable Intermediate & Final transfer completion interrupt */; N7 x% R3 E) u5 S D, j( u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ @$ ^* g+ G& z/ C# R6 a2 l+ O( ]/ r
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 o1 E& Z+ F" y: P! D
- g) H9 X; C7 ]
/* AB Sync Transfer Mode */ G7 b1 s$ ]# }- w) z# g
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 U6 k i9 Z; q- p' |
1 P$ `" G$ I s& c, n8 ] /* Program the source and dest addresses for master DMA channel */
. `0 a$ J# ~& R9 s$ K' B paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 w T1 K* S1 v/ u% f3 h paramSet.destAddr = (uint32_t)(ping_buffer);- J8 l% q) P) C2 U- d7 K5 g
3 K8 t$ f* X, t0 Q/ G
/* Write to the master DMA channel first. */
' g8 d7 I" \9 _# n- U result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);$ J, o) E2 s1 e' M1 I3 j0 L
}
2 ]# F, L! z! C n% u; J ?! {9 v3 l2 g4 @7 F" y( A. B/ Q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ T' }2 |1 R- I5 b1 r) K; ]4 ?
; ~; m: n" l; h2 ]7 F- j0 L if(result == EDMA3_DRV_SOK)
& K, t7 Q; W7 g( \" @ {' A: i4 Z J! N; S w
print2arm("edma3 driver init success.",0);
' i8 Y, P+ `" _/ C- e; F) ~. e }
4 F" s0 G/ ~5 g$ W}- m6 \" ^/ J8 z/ v7 ?
4 c* Q6 R; Z" t
8 @7 f5 c& D6 l. g/ ^7 H
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 h7 H* N1 }: O5 n h; c
9 u9 s8 I$ L; M/ I0 j' L# y3 c X) C7 C" a, d. Y6 j9 B2 G% o
|
|