|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ V8 n9 ^% k9 L# g( P5 v#define PING_PONG_ACNT 1# ^0 V4 \) [8 r& y6 c) X
#define PING_PONG_BCNT 8*32*40 : b1 U0 A9 N$ M0 U- }7 |1 |, }9 N
//#define PING_PONG_BCNT 1
$ I* N5 @, `1 d#define PING_PONG_CCNT 1
+ s7 e/ w2 F$ n2 h7 q#define MCASP_BASEADDR 0x01D00000: X$ J' `. G" I2 q' c( r; t/ F, j h9 A
#define Mcasp_RXEVENTQUE (0u); l- D$ b: p6 Z3 X' u: B/ x
1 N$ k, J9 C6 z: |! p( A5 D* C/* OPT Field specific defines */
8 l; t) A) D5 R/ f; P6 W% X#define OPT_SYNCDIM_SHIFT (0x00000002u)" L) H. [: t: L* |# ~
#define OPT_TCC_MASK (0x0003F000u)
! f' I5 f$ y5 Y; \/ ?#define OPT_TCC_SHIFT (0x0000000Cu)7 N8 g; x& x* D5 y4 L9 R1 K! X5 ?& ~
#define OPT_ITCINTEN_SHIFT (0x00000015u)& b* u9 X ^. @2 i O
#define OPT_TCINTEN_SHIFT (0x00000014u)) X. i& R( h& ?7 m/ D
" _4 ^; w% i6 Z) {- [; a
char ping_buffer[PING_PONG_BCNT];
V( a) W7 F7 S. l+ Tchar pong_buffer[PING_PONG_BCNT];
: Y) ^* t! I, e" f6 @( N% X% h3 I' g! c% Z
: A' @) X+ }$ S1 [# ]" {9 n# T# g$ d0 v# m0 o3 c" h2 r$ I
; n5 p0 i- i" o9 I- x3 m3 ]static void ys_edma3_init()2 }$ K, E" H' _: G
{
. T K* T" m! X4 N- Z' q EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% M. i6 u9 u7 e% r EDMA3_DRV_Result result = EDMA3_DRV_SOK;) r, S- _+ }$ Z" c) Q Q
EDMA3_DRV_Handle hEdma;
( F9 d, g8 B% B+ ?" m uint32_t chId = 0;
5 f; h H& }; p+ P$ ^, z) D uint32_t tcc = 0;! }5 }4 E; K W0 V- }- X. d. w9 }
7 j) C! m1 R* X print2arm("edma3 driver init...",0);" B8 K6 Q5 N2 n9 L% i& a
, V/ F7 X3 L8 g hEdma = edma3init(0,&result);! ^8 z+ i, ^/ _2 ?- J. F
if(hEdma)
+ ~3 C/ @+ Z$ ]- B$ v, f ? {9 B: H) l' V( S
print2arm("edma3init() Passed.",0);& o$ N: Y" c) |- U6 G( m* h6 f8 e7 _
}' u* s7 ~3 O0 O) b3 k5 ]
else
( W9 ~& c4 ?: k1 ^& Q {
9 U4 H7 ?3 j$ n& S4 q# e print2arm("edma3init() Failed.",0);
' Q1 B4 _! D9 D$ w, p }$ ^5 ~: l% M$ }; q
- I, R2 E/ |8 o6 l
if (result == EDMA3_DRV_SOK)
+ h6 @3 F# N% d8 e7 [ {
2 `, i o- Z8 } result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
I" W; V7 ]# h2 m* O8 o (EDMA3_RM_EventQueue)0,, W$ [* S! f% ^* w
&edma3_isr, NULL);8 Q/ F; l+ C8 e
}, Q9 C7 m5 k% y! O2 K8 n+ Z
% g) ]; ^! z0 g) e, M if(result == EDMA3_DRV_SOK)8 D& ]9 X; g- s# y5 `
{
7 |1 }8 S) Y) e6 s paramSet.srcBIdx = 0;# Q% y6 I% u* P o( S* {$ m; R
paramSet.destBIdx = 1;
5 s% x( [2 }" c$ J; L# o) h: T paramSet.srcCIdx = 0;
. w. r1 J- d/ [/ c; p paramSet.destCIdx = 0;
% g1 w1 V0 C" e6 ]/ P5 w paramSet.aCnt = PING_PONG_ACNT;& B: J2 j% _1 U8 d: \5 a
paramSet.bCnt = PING_PONG_BCNT;
' a2 z$ h1 G D6 }' ~! ? paramSet.cCnt = PING_PONG_CCNT;. H! ]9 M9 P* X5 b
! D2 x3 L+ `6 A" ~ /* For AB-synchronized transfers, BCNTRLD is not used. */
1 D: d4 Q7 L% e0 h$ y8 Z" { paramSet.bCntReload = PING_PONG_BCNT;7 i( ~: X" \& S
( P. j+ J7 ?. n/ B1 v6 E* x
/* Src in constant mode Dest in INCR modes */0 l# F4 A- j& m2 i& a2 f% w$ [
paramSet.opt &= 0xFFFFFFFDu;: h1 z" j- E" \, \0 Q* T
//paramSet.opt &= 0xFFFFFFFCu;, z. y* D" m F- n
4 M/ a( z* n* k: i1 u) ~; \
/* Program the TCC */
0 C$ I1 u+ y3 L8 B paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 ~' J6 E" P9 B- D+ k
4 B7 j. [# g1 N% I [6 j, V& v5 f /* Enable Intermediate & Final transfer completion interrupt */: {4 y9 ~7 o* l/ b3 y7 d& L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);& U! P: X& p0 p4 e; `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 G9 l7 y2 H2 O2 h* ^( J u
* J& y$ q) x5 } /* AB Sync Transfer Mode */) o; \5 V: o* K# k2 n' Q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 {1 z# n' v f& `0 C 6 y- h8 |5 ^( ]& t
/* Program the source and dest addresses for master DMA channel */' E0 j% o. c4 s7 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);; Q+ Y& ~! `" \% }7 V# h$ \
paramSet.destAddr = (uint32_t)(ping_buffer);; L+ W% W3 r) u2 Q& d! c
! m2 f" N# E3 { /* Write to the master DMA channel first. */
0 D0 v7 v* O4 o0 c8 h result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 e* Q9 E {8 r0 \8 ] } ( d/ P5 C, L4 `0 D( [! D
' M5 i6 V0 H3 O6 r/ h. e% W( F9 r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 o3 J Z7 a0 r% K# R( _0 X * ~! {, F# O$ k$ N6 S
if(result == EDMA3_DRV_SOK) ; v, I+ Y x9 F
{4 h! X2 d+ \3 D% y
print2arm("edma3 driver init success.",0);
8 [8 |$ _# p0 d6 q4 @ }
y/ I0 O# M* {( W, c# C}
. x, I; D% H7 f3 _$ I' o- |* A- H0 } E
! m: Q$ \* m4 \ o4 n8 S& s- rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& D) N z6 }3 M6 d; w
( u L5 ~+ Y, @
0 r. g$ _, x" F |
|