|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* B3 Q" k8 o! p1 \
#define PING_PONG_ACNT 1
+ [) f( k; s- k#define PING_PONG_BCNT 8*32*40 ( H' V q; O, ]- m% G2 v+ t8 X
//#define PING_PONG_BCNT 1 1 X/ x/ K' V" Z% N1 F z. ?7 M
#define PING_PONG_CCNT 13 b) q, [6 i0 l. C& M5 I
#define MCASP_BASEADDR 0x01D00000
1 X0 | N( S# M5 p' I#define Mcasp_RXEVENTQUE (0u)
6 R& F4 H6 F, r( S) R( B3 h: f3 F# f' K0 T7 z
/* OPT Field specific defines */
3 |9 Z/ f2 V* J. u8 y1 t9 G( T1 e#define OPT_SYNCDIM_SHIFT (0x00000002u)% B, D1 g- S* M3 }- P( K
#define OPT_TCC_MASK (0x0003F000u)
; Q1 a8 ?. C! U0 L* U* R' x2 R) d2 v#define OPT_TCC_SHIFT (0x0000000Cu)( g6 `- t) q8 i% e
#define OPT_ITCINTEN_SHIFT (0x00000015u)' x4 ?/ p+ R5 ]' @2 g" W; \; C" W
#define OPT_TCINTEN_SHIFT (0x00000014u)4 _) z/ R# E& g$ l
% F2 `1 t* C5 e: h3 E; Gchar ping_buffer[PING_PONG_BCNT];- g" O& l6 S% X/ d8 F) ?
char pong_buffer[PING_PONG_BCNT];
- `7 S8 u& t$ x
$ p* q( `2 {- G1 W, ~% F/ r, |9 j0 Y3 U: X0 C' u2 w
2 n/ A/ g% y, [' f* w
4 w- t/ P0 B# x6 ?. e
static void ys_edma3_init()# r+ I1 v8 P* J
{6 G0 a/ n5 r+ R
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ D3 v% @4 t! N7 F# ?$ f: I, B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;, M- \* o7 `( W. g3 P/ ^! \
EDMA3_DRV_Handle hEdma;
0 u/ s0 n# i; k9 q' m uint32_t chId = 0;) n9 B# A! F5 z" @) l) l) V
uint32_t tcc = 0;
) v% I7 l( Z6 I6 s. ? ^2 w& j. n1 a" Q
print2arm("edma3 driver init...",0);' W5 q0 |2 Q8 B
4 q/ s9 i: Z% U7 r) f2 q" k hEdma = edma3init(0,&result);* L4 A# O7 I# A# V1 J
if(hEdma)/ k3 \& ]; p: Z/ w
{0 r1 j: t. E$ J2 n/ Z* G8 Y: h
print2arm("edma3init() Passed.",0);
7 L! x; s" R& r; f c0 S: u }6 u8 c9 q9 y7 T+ q
else
' @% ^; P# ^, L' X {
# ^" T! T2 J1 l5 m4 l, q: |5 x; I print2arm("edma3init() Failed.",0);
0 S1 j5 V2 w) L% R& I, d- K }. B. c8 Z3 v8 o" b/ w. T
7 b3 {. }* k: }8 [9 X M( @
if (result == EDMA3_DRV_SOK)% l. i4 _; Q2 f/ y, l9 a
{ j- F+ Q T8 m! C4 u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) w6 E/ h* n+ z) u
(EDMA3_RM_EventQueue)0,
, [! M6 e' |! D- \" T& ?4 W4 p1 ] &edma3_isr, NULL);
( l$ _2 ^# ~/ ]5 @: A4 A }
- c4 V6 ^; z0 @ ^$ A7 f% B % D1 l1 R: t# a. R" }' c, }
if(result == EDMA3_DRV_SOK)" A* H$ ^) Q1 }9 E3 ~7 t- \
{- Q/ g& Z" N9 J# Q2 a
paramSet.srcBIdx = 0;
' n, i$ D3 s4 L% F paramSet.destBIdx = 1;
% w0 S. h3 m7 H paramSet.srcCIdx = 0;
% K! |% j4 l+ S4 k- ^0 z" l% V) M/ ^ paramSet.destCIdx = 0;
6 D- D- e; a* W, f" ]5 A; l0 i2 M paramSet.aCnt = PING_PONG_ACNT;
9 {8 J- w- C8 V: b' m4 V4 \ paramSet.bCnt = PING_PONG_BCNT;6 @. @" |9 x4 `- [6 i! T0 G
paramSet.cCnt = PING_PONG_CCNT;
( O5 f: L! T& j4 w, z
U/ w0 k7 w) |9 r /* For AB-synchronized transfers, BCNTRLD is not used. */
\5 a a; X7 g0 X; {1 B0 c paramSet.bCntReload = PING_PONG_BCNT;. N% W* N1 J. t* a3 I, s
$ |5 W: ?( M( g, |5 z" g! z /* Src in constant mode Dest in INCR modes */" n, Z6 B1 p! _( ? F) Z
paramSet.opt &= 0xFFFFFFFDu;
9 X7 d5 C! z- O% s6 D9 V1 C7 W //paramSet.opt &= 0xFFFFFFFCu; o1 J( c/ R* E& n: M0 x; ~
) I$ q0 S& M. s# m0 V b e /* Program the TCC */
1 _* `5 O( j3 G/ [( p E paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ p* ], A, i0 W" V
' Y9 H* J% d: s6 Q# W1 b6 m
/* Enable Intermediate & Final transfer completion interrupt */# r6 I& S6 h9 z7 L8 e0 _
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, M- T! w/ z M* ^, ], X( O paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 C/ S$ w" i5 C# q
! ~8 `8 {6 g! w8 C# E9 u4 e( M /* AB Sync Transfer Mode */$ I" ]) L7 ^4 j2 y; f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% O9 B/ ~0 T3 t6 {: E/ \
( V0 a$ o: V- y4 s /* Program the source and dest addresses for master DMA channel */$ k0 L5 L! c( c0 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' t- M r$ e; z paramSet.destAddr = (uint32_t)(ping_buffer);
! x& o8 ?+ t; K' g1 ^7 O. t# B- R
/* Write to the master DMA channel first. */
% z; O6 k+ O s4 C# g; F; z5 e: z/ B n result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- }& [8 B9 m6 Z0 G: _. r( } }
% ?% G( j1 w4 U1 @( v X; B P/ F6 i3 s. }% ~! U6 t0 m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 k5 z2 G3 J( m& ?
" s6 T* \1 Z8 w! N, Y! q if(result == EDMA3_DRV_SOK)
. y& |2 m$ l3 P- ?* k# ] {
0 a; l+ D4 S+ ?5 ^3 Y" C6 N print2arm("edma3 driver init success.",0);7 {# @) O. a* T8 Q3 E
}
9 E% X7 {9 }: Q}5 t: h" M3 ~# A; Q5 x8 Q% B: i. R
' q5 v3 f$ V8 \% c: l @0 s' F) M9 _$ o7 I3 S l2 T9 J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 h; E1 F [0 Y, ^5 F$ V. r d/ M9 ? t
( A; [7 E4 G/ L4 e) g! R' X! b
|
|