|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 W) s- Q0 a7 l) j q+ `#define PING_PONG_ACNT 1
) o/ m1 D4 M6 \" j. s#define PING_PONG_BCNT 8*32*40
, V! v" X7 I( i4 g5 m) n" [//#define PING_PONG_BCNT 1
6 I/ r$ i7 ~7 y/ C2 y! o' s#define PING_PONG_CCNT 18 r- b1 q: X7 t
#define MCASP_BASEADDR 0x01D00000' \4 W; V/ o1 i9 `
#define Mcasp_RXEVENTQUE (0u)! M9 A$ s0 M* C/ B6 _( V4 Y
D5 \( |1 |% N- u0 N/* OPT Field specific defines *// M% `0 b& {& S) H0 O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, k q6 {4 M2 v, d4 k. C2 ]#define OPT_TCC_MASK (0x0003F000u)
' S& ?# }: s) Z# J! y' c9 o#define OPT_TCC_SHIFT (0x0000000Cu)
) o2 J: @- P& e7 T3 k" M3 r#define OPT_ITCINTEN_SHIFT (0x00000015u)9 I0 L$ a& ?; j+ R
#define OPT_TCINTEN_SHIFT (0x00000014u)
( M1 D9 @: w& }5 V+ l; M9 [
8 I6 r8 M6 ~' |" w8 vchar ping_buffer[PING_PONG_BCNT];
( ~0 r& g" G3 q/ E- j. g, Zchar pong_buffer[PING_PONG_BCNT];
* {* ^( @3 w$ Y+ N; U3 x2 o1 m& L& i
5 f$ m; C0 `" L- \
8 ^5 w* g! f6 _1 o. f, D: a) o4 J l3 F A% N# c9 e
static void ys_edma3_init()4 Z" U1 X9 K2 y
{ ~$ f% N5 i9 w+ @0 f: k4 l8 f( H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 n, B7 L# B* o* |9 }, A1 z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;: n0 N: |1 ?4 X) ~) _9 q) l6 C
EDMA3_DRV_Handle hEdma;
/ c( Y4 j5 ]% E0 J0 t uint32_t chId = 0;
1 D# p: |$ j W: r u* K uint32_t tcc = 0;' d( k4 L7 `$ R& O& ]
& ~0 v* ]( j8 B3 `: B$ r3 @
print2arm("edma3 driver init...",0);
5 C+ ]6 s, ^8 l( D4 {
. d0 H5 u5 F- ]) N3 I hEdma = edma3init(0,&result);
# D1 r. t, r P8 U7 V6 W" D if(hEdma)
( Z: r2 _; X! f( e6 x7 A {0 K( b% s3 N/ I" P, E
print2arm("edma3init() Passed.",0);
/ N: f* j2 R& V R$ s2 o$ r+ J( r }* G2 X% f+ Q/ x4 y
else. I+ }5 Y/ A+ u# Y! i% z$ E9 v& [: D$ n+ W) o
{5 U4 T: z4 O7 @2 c4 A) u6 I) B: J
print2arm("edma3init() Failed.",0);
- I0 O# O `3 I+ A/ U }+ ] p, @5 p" l
$ F3 L! o, z+ n1 `
if (result == EDMA3_DRV_SOK)
) U) p- k/ l/ Z {
2 j' T; O3 w% k! V) ] result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, w5 [( `: o, o A: l5 G1 m$ k5 m$ u
(EDMA3_RM_EventQueue)0,
( m5 q. X6 l) `8 k" ?# z &edma3_isr, NULL);9 w% y+ X! d% o3 z! X9 A) W
}
1 t4 g( o2 X% H* _ O! \ % q' C5 U. t, j3 L2 w* y8 z
if(result == EDMA3_DRV_SOK)3 u6 A, s2 M1 o
{
; A- X/ F7 G8 Z* p# c paramSet.srcBIdx = 0;
# f* J; z2 c$ ?% c1 a, U paramSet.destBIdx = 1;
$ G L- u$ ~4 }7 \3 S3 P paramSet.srcCIdx = 0;& M: v6 g8 T4 B, `6 `4 U
paramSet.destCIdx = 0;
3 P$ v$ S& ?1 _9 \% g- ?( Z paramSet.aCnt = PING_PONG_ACNT;5 d2 f& i9 \6 m r3 S& X( N7 @
paramSet.bCnt = PING_PONG_BCNT;' b$ L, t$ [. `7 {
paramSet.cCnt = PING_PONG_CCNT;( N, `. T$ t; L1 l1 Y
- J* e# ^4 _- q' W4 J /* For AB-synchronized transfers, BCNTRLD is not used. */- Q. |4 m! ~" W/ `
paramSet.bCntReload = PING_PONG_BCNT;
5 \. D& L' I- J0 ?- f* h' [% {% I0 _! I3 e0 a
/* Src in constant mode Dest in INCR modes */+ Y, W2 v, R% \- e4 F
paramSet.opt &= 0xFFFFFFFDu;; e8 L; c% I5 k3 t2 s
//paramSet.opt &= 0xFFFFFFFCu;
4 k2 R$ |/ A8 N % C8 {- d( u, Q# E, @
/* Program the TCC */: U# z, ]8 L& L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) s2 {9 E9 C& d8 D9 r2 v, {2 T8 d% X4 ^0 J+ l" p5 R1 ~
/* Enable Intermediate & Final transfer completion interrupt */
1 S% T- [/ \( W5 j7 j5 G% V! B& k paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 x$ B; K7 P. T5 \* A" H7 K paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# |6 z% `0 v+ l! G
9 x2 K0 C: B7 I5 u2 N ^3 n /* AB Sync Transfer Mode */
% S5 o$ Q9 Y: P: E paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( Y8 i" s/ e; [2 R) C
1 ?8 y3 e- U7 `2 d
/* Program the source and dest addresses for master DMA channel */( i4 p, ^* I- i: A! i: | e( b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);: w7 c9 b5 Q: M% U2 H" G; _
paramSet.destAddr = (uint32_t)(ping_buffer);
F1 l8 \$ |- m
' y) F: Q5 ?( s% [- E /* Write to the master DMA channel first. */' C& w( w2 E9 y ?$ [- j7 g, a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);& B% {3 B' u- j S7 S
}
) y: I6 L' A7 H. M, ?. L. w% k( T& i: Y( w
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& `6 k# v6 K8 L( U
W( y7 [# v& \4 o. g1 ] if(result == EDMA3_DRV_SOK) 2 U$ c* [$ v0 g: V: y
{
/ I- l( M& f7 \4 u* K/ M. G print2arm("edma3 driver init success.",0);
/ w; B4 n: j1 [* U+ G } ' E. l2 R$ ]' R7 x. e
}6 `3 t; Q- j0 _2 o# b
( x, `( `( |( ^( o
2 i" w. r+ { b. v) i& ~0 F0 fEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ k: L* n6 d/ f2 Y4 n7 U- d$ h
0 ?; [. {5 u0 N: q. Y2 A
# o; a, x4 X8 _* y |
|