|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& c& w& T; e' r/ G/ }( ~
#define PING_PONG_ACNT 14 z! ?+ |8 f* p2 r. h4 M
#define PING_PONG_BCNT 8*32*40
" \# z5 V3 f+ Y! j- l4 v# z/ ?! W//#define PING_PONG_BCNT 1
) X5 z) V ~* h7 k( C#define PING_PONG_CCNT 1$ b: M$ V m* k- w& j/ U& L
#define MCASP_BASEADDR 0x01D00000! T E% q' B/ s5 I# M
#define Mcasp_RXEVENTQUE (0u) n* f5 k. i( o- m
6 e G% v5 u. m* J3 Z+ ^/* OPT Field specific defines */* H% L. u: A% ^& ~5 a+ `
#define OPT_SYNCDIM_SHIFT (0x00000002u)1 r* _9 B# P4 i ~* X- a, z& Z
#define OPT_TCC_MASK (0x0003F000u)
4 J" h) j+ ?0 x j3 T# V#define OPT_TCC_SHIFT (0x0000000Cu)
3 B* \! D' M. U4 a, L: p1 j; K. a#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 k. s k1 \: o9 c9 {6 E#define OPT_TCINTEN_SHIFT (0x00000014u)" c1 Y; [8 @& J9 x! ]+ A1 C1 R
- h% B8 |0 J2 L( ?char ping_buffer[PING_PONG_BCNT];( n1 r1 N1 D6 ]# b7 }0 A
char pong_buffer[PING_PONG_BCNT];
8 ?6 X8 B" k' R0 D
% _( s+ w( O t! }7 G2 L
& M% R, U. y/ Q# _ a* w
4 K% G6 s4 g$ e) V. B
3 J% { q$ S3 Sstatic void ys_edma3_init()
* `2 W8 ? g; v: _* U& M{; y* [- D } x
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};7 P+ Y& A5 u# O3 X
EDMA3_DRV_Result result = EDMA3_DRV_SOK;, r, M1 e, O1 c2 ?, l. G
EDMA3_DRV_Handle hEdma;- B$ b8 ]5 B+ V5 P% i
uint32_t chId = 0;
( U5 X1 u. X5 i uint32_t tcc = 0;+ Z. t- B2 J. M+ _
! G3 ^$ e5 J+ Z5 d' z/ s, g" k print2arm("edma3 driver init...",0);! ~) G6 r* T" F+ o; p* T- Q# C$ C
/ S' s! n5 }# n+ M4 v
hEdma = edma3init(0,&result);
) j: o7 i+ Y: Y* a if(hEdma), i9 n0 B' _4 A5 ]1 z
{5 l$ Y1 i7 r" H4 Q5 e: r5 V: G
print2arm("edma3init() Passed.",0);4 F* k. t6 }, O
}) S" @% k* ]. }0 o' E, S
else
% h: n5 ]/ f4 A. ] {5 L3 G- a5 _" _$ w6 m. V1 M/ A% F, v
print2arm("edma3init() Failed.",0);, f) J. G7 A6 k& n, d" \
}
( @$ Y; T0 C6 { ; `0 O! } ~0 i" U
if (result == EDMA3_DRV_SOK); y; T y& ~ k" X; C0 \2 ^
{' ]- `% v/ u" }* H$ P6 ]
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. g: f- ? g, b6 K5 d4 H (EDMA3_RM_EventQueue)0,/ }5 ]: M7 e0 y4 p
&edma3_isr, NULL);
# |; V( o$ J+ ^ }
: O* i& H5 h$ [) \. Y2 E
5 O3 ]4 y S; N% a: {+ _ if(result == EDMA3_DRV_SOK)
; p# X7 {2 u( x. C {
( n4 I7 F) l0 A' T paramSet.srcBIdx = 0;
3 B9 I! l5 I! _) [* G5 P paramSet.destBIdx = 1;% s S& \* |6 P+ Z% D2 z
paramSet.srcCIdx = 0;
' X6 d) k& Y. [5 J9 k paramSet.destCIdx = 0;9 z8 f' h4 Z/ j) y
paramSet.aCnt = PING_PONG_ACNT;, H0 @: U* ^% |# W
paramSet.bCnt = PING_PONG_BCNT;
* H! [6 J2 r/ e5 X7 m) P paramSet.cCnt = PING_PONG_CCNT;
8 n$ ^8 g2 p! u& E5 @0 D
+ J1 f M" ~; l( G( x* p /* For AB-synchronized transfers, BCNTRLD is not used. */
* c Z2 K# D5 \+ P& L paramSet.bCntReload = PING_PONG_BCNT; B4 P6 Q. s4 o9 T; j& }+ D# \
! k$ P1 O [7 \
/* Src in constant mode Dest in INCR modes */0 @( Z9 G) i0 x6 i: O6 H
paramSet.opt &= 0xFFFFFFFDu;9 \, b5 r0 ?. X* k8 Z$ H( [6 j+ J+ s% A
//paramSet.opt &= 0xFFFFFFFCu;
5 Z) y* C5 Z. g' @: T9 c* c
8 \! J; \. q" B( A3 `; d0 C6 t /* Program the TCC */1 y5 h1 ?6 y# x" j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 _6 y+ @. _3 c) p) O
2 R% ], @/ H; W$ H5 d4 ^ /* Enable Intermediate & Final transfer completion interrupt */
' e& j- B' a5 g/ c' i: h3 n paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& q: w a7 [# n3 h' M9 | paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) g' N- K6 {8 C$ G! q- X" U( C
5 d5 l$ m9 q* R6 l /* AB Sync Transfer Mode */) F$ @- `: p( f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ w' q2 c# w+ ^' k( E, e u4 A' o% s* C4 Y( C7 M
/* Program the source and dest addresses for master DMA channel */
( D$ I+ O! W6 \& ^ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);! r. Q, s5 ^9 F4 Y u% c
paramSet.destAddr = (uint32_t)(ping_buffer);
# {; Q/ X2 l9 z
$ C7 {) N! x6 J! w0 O' |5 Q /* Write to the master DMA channel first. */
7 |% _8 H$ E3 m1 F, j7 y, Y result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' F$ P# n/ M2 Z7 L } 2 Z6 k: E% |, r( Y, e
' I Q. B- e" ]% E9 i! |- f6 J: y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, y1 W! n$ T9 j; G0 C m. F4 o
+ C1 \ @& Q% i% y if(result == EDMA3_DRV_SOK) ( x2 ~: p: n8 x' l
{3 a# k, E( x: H' t
print2arm("edma3 driver init success.",0);5 q, B; ~# j& a3 V: Q& Q
} ' y) y* F' T, }. f6 H
}2 u3 p7 u) [+ `- ]4 H% n
# c$ @/ R2 B' [6 Y0 A2 J8 \. ~ n6 F
8 z/ x) b+ D4 C, U4 M" FEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; v3 Y/ i! l& {5 M* Q
- I3 V* X2 F& b* c% f% H7 H( a
$ \1 G' W5 w0 q" r2 y7 z5 l1 ?3 } |
|