|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% Q) q9 X8 v, U8 d" G#define PING_PONG_ACNT 1( _7 v0 f: @3 a5 C
#define PING_PONG_BCNT 8*32*40 ; B$ _$ a- Y8 M# g- |- P9 T
//#define PING_PONG_BCNT 1
! o3 B! E) \" N0 }3 O: z#define PING_PONG_CCNT 1
/ Z. Y1 B x) e- @' [6 x#define MCASP_BASEADDR 0x01D00000$ I2 `5 N/ @$ N( x3 V
#define Mcasp_RXEVENTQUE (0u)- s5 x* t! H, r1 `2 t5 i" |& Z
9 ]- O. D5 i7 X8 F; i& e/* OPT Field specific defines */7 r. D2 s* ~/ H: P; a) y
#define OPT_SYNCDIM_SHIFT (0x00000002u)( x; Q# c$ a; y
#define OPT_TCC_MASK (0x0003F000u), ^/ l( J \3 S2 ?
#define OPT_TCC_SHIFT (0x0000000Cu)
7 [! ?4 f3 {# { l7 n1 \- m#define OPT_ITCINTEN_SHIFT (0x00000015u)! D/ N% Z' U# T6 T% |
#define OPT_TCINTEN_SHIFT (0x00000014u)
% b# I# k, |& h8 K: S7 L
0 { W+ x2 G$ D0 Schar ping_buffer[PING_PONG_BCNT];' ~* w* F! a Z4 \1 b4 T8 m
char pong_buffer[PING_PONG_BCNT];4 k# i) l5 v$ R p# G
! M9 |3 b5 B0 z- B# _% @( g& I
; c' X2 Z \! Z/ r5 m# o
; ]: d1 j2 h% `# [7 G# dstatic void ys_edma3_init()5 ^8 `3 w+ r! D5 N
{
5 Y% G" W8 K y' A6 ?; U EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: L& c5 {% {7 ^, m4 ^( }8 }- ? N6 L
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& P( _' @ R G7 T1 f EDMA3_DRV_Handle hEdma;
& C4 J) s( T: }2 u uint32_t chId = 0;- {- y2 J4 g; q2 ^! w. N4 d
uint32_t tcc = 0;2 G/ R7 G, Y2 v8 m e$ l
' u- A( \/ d1 g# ~; q) j
print2arm("edma3 driver init...",0);, B! j, [4 a$ k1 @, a3 @6 e
$ T5 V% f& J) T hEdma = edma3init(0,&result);
2 ]$ ~6 j1 Y1 j9 e4 ^ if(hEdma)
! a8 w" B2 @4 m {
2 J. l* `" E+ W$ K6 }1 I, O print2arm("edma3init() Passed.",0);
' Z1 C1 C* m' G3 L" s ] }& y, N5 T/ K+ {) V, G% w: i# j
else
6 K6 o2 V. e2 `6 V {
( S& w" M: d5 a5 b print2arm("edma3init() Failed.",0);& \4 w; u7 \. C0 I& M' i, e
}0 q7 T9 P8 _* ~/ A* B0 v7 T
3 [% o4 Q/ L2 f6 d5 x8 ?$ M) R$ x
if (result == EDMA3_DRV_SOK)
* i; b! O$ W% E% g9 h {
5 f$ N$ y! N$ d4 p. q6 e1 _8 r result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! x6 r! Q& C& `0 _* `# x
(EDMA3_RM_EventQueue)0,+ l& g7 s* }' q/ n( i1 U, }' o) Y
&edma3_isr, NULL);/ l5 }- n5 M! j+ y! \7 h
}
' c' n2 i0 |) C1 _- l1 ^
: S- m1 V) X' @# v# o* h if(result == EDMA3_DRV_SOK)) [) E% T* i- o* F
{
|0 a9 k8 z, v: q" \% E4 G paramSet.srcBIdx = 0;
6 H* s+ o) Z) @; o paramSet.destBIdx = 1;& Y3 [ U+ H% v" m( e$ u* h& O4 t
paramSet.srcCIdx = 0;8 j8 s# Z7 F2 f' t( ?% d
paramSet.destCIdx = 0;
4 ]0 h# c" s0 d7 a, t3 L4 F P paramSet.aCnt = PING_PONG_ACNT;& q1 V4 l! U3 q( j* ?$ I
paramSet.bCnt = PING_PONG_BCNT;! A$ q0 N4 A) P1 ?& E; m" X
paramSet.cCnt = PING_PONG_CCNT;) h* [ T% F7 S I! k
/ T6 U: j7 g2 Q( F" }, C /* For AB-synchronized transfers, BCNTRLD is not used. */
/ S3 H# n6 c, }/ m paramSet.bCntReload = PING_PONG_BCNT;
% l. V( l h4 B% g$ B7 Q; q
, ] R; B4 c8 k& f% x3 \ /* Src in constant mode Dest in INCR modes */
& o1 T% R% j. o8 D% R( Q paramSet.opt &= 0xFFFFFFFDu;
& t* P# c6 S8 ^# A' @6 f6 p1 [ //paramSet.opt &= 0xFFFFFFFCu; J/ ? Q6 z3 J# j2 H* T3 \. V3 `' a0 p
" p$ A) k6 c$ h$ P1 _! t
/* Program the TCC */+ p7 ^( b- X; n E' t$ m9 ~! @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 ]. v X7 ^. h, [+ {# R: }8 R
9 o' B& V9 F* B$ d3 A) \
/* Enable Intermediate & Final transfer completion interrupt */
$ Y9 s1 h+ c$ Y6 K' S paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);1 Y# n1 D0 w& ^8 R. g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, i0 l' w2 X5 Y1 P: B- h
4 v! T' U2 W P0 U: g" s! e4 g
/* AB Sync Transfer Mode */
: i F7 I1 I& M" t$ L) Z: N paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& i- W, J% [! n) @8 I
/ { b! K) I5 j% b. i /* Program the source and dest addresses for master DMA channel */
& Q( i1 z1 H% K2 {, O% o paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ i. P8 g+ `, T' N G paramSet.destAddr = (uint32_t)(ping_buffer);! `, I( u6 j {5 J& U! i/ y, R. D! b* ?
6 i, G j7 c) N- C5 z
/* Write to the master DMA channel first. */) b: l- u$ Q; j! V3 ?
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); d" I- U5 a$ [! Z) T
} ! n7 ?' C* h6 ~
& R* z# N4 V) y9 I0 z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 ^4 T- k6 t2 @5 R/ J% {/ T: V- l - E1 y& g4 V7 w% W. f- V
if(result == EDMA3_DRV_SOK) 9 f9 X+ m5 _" g* {) s6 T% Z/ a
{5 L; h- j0 D+ `5 C, M7 [( w, ?
print2arm("edma3 driver init success.",0);
0 _3 {$ R/ W8 Q' R7 Y8 ~! P }
7 d! ?0 H- {6 J2 \}6 a$ F3 k8 z4 v% S
% ~, k1 L/ Y! K2 B. s5 e/ c
* E3 J- S% _! B- H1 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* _0 Q5 k% r7 O2 \0 G: @2 {# e7 [
( g; ]2 \ N4 P2 _. S7 C j* @5 |% Z
|
|