|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 k6 Z5 L. O- v* ~" V' ]" O0 }#define PING_PONG_ACNT 1( }" Z1 f* L& x5 i
#define PING_PONG_BCNT 8*32*40
/ P W9 P& J% B4 T1 V, B//#define PING_PONG_BCNT 1
) _8 T3 c: s! X5 @3 J/ ?#define PING_PONG_CCNT 1
+ Y' \8 z6 `9 H#define MCASP_BASEADDR 0x01D000007 @7 G# l9 Q6 j' w t y! N
#define Mcasp_RXEVENTQUE (0u)
( A9 e' Z1 e, {& O
. F! w, h% t1 a' w5 s O/* OPT Field specific defines */9 q" G8 }) [! I/ _+ `& l% ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# G/ k; O+ d. d#define OPT_TCC_MASK (0x0003F000u)3 S! E1 z% X" p5 |/ s* B
#define OPT_TCC_SHIFT (0x0000000Cu)
0 t- \" W& C4 u- \1 V( n4 a- E#define OPT_ITCINTEN_SHIFT (0x00000015u). N: E- M8 M+ M7 v9 y7 d+ K, @+ c A
#define OPT_TCINTEN_SHIFT (0x00000014u)# L3 G5 F: `1 d1 @7 Z
- @! M- W! T+ i2 ?4 A% g: ichar ping_buffer[PING_PONG_BCNT];
# v: M/ C# @" echar pong_buffer[PING_PONG_BCNT];) p# g, o' H& r, _
( R! P4 p$ E- J" `, K* f" `$ g5 }* i9 t% m6 B0 a+ {$ z
7 {3 e6 e7 I. P1 {! u
6 Q+ ?/ ]" E* K- ~ g, n' Jstatic void ys_edma3_init()4 _# n: y, Z3 z2 I6 O
{5 X4 k, Z$ d6 T
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ L$ j" [( F4 b; j
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ y- m* e( Y9 Z! `, R! F% g9 {2 m9 B EDMA3_DRV_Handle hEdma;
/ k7 X D) z* u) Q) | T uint32_t chId = 0;4 G9 r$ \+ d. q8 u, @2 L3 [, Z6 I
uint32_t tcc = 0;3 F1 F$ D( e; M
, s$ g, h# s* Q' U7 h
print2arm("edma3 driver init...",0);
& K& |- H& k; t8 ^. Q/ a6 t$ _: {2 a5 [# c0 C
hEdma = edma3init(0,&result);
% H, R& ]' T* i2 u* \! ? if(hEdma). K. j( |& b# o: b+ D
{
% Z/ ~- U5 p, P) N print2arm("edma3init() Passed.",0);- v* J5 M7 |) H
}
' B7 w6 W. ^1 j j' _3 d. R+ A7 j else
|+ r, S, S0 {! I O: K% { {
2 G( p; F ]2 Q9 X' P2 A/ R8 r4 ^ print2arm("edma3init() Failed.",0);
+ ^0 M+ u, h6 U2 c- k* { }- @, r3 @% [! p/ ~
" n3 m- r- q3 ^ if (result == EDMA3_DRV_SOK)% j+ {( q8 z0 G6 H0 ~
{3 w9 L$ ]) F3 G% m+ x& ^. ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 C3 M8 P' w' Q, d2 _: [7 z (EDMA3_RM_EventQueue)0,
7 J( |( J7 R1 c9 P7 V5 Q: t &edma3_isr, NULL);+ l! L! O. Y4 v. v9 U
}
" l6 H* b; C; ] B8 Z : n% l- u: V8 F/ r( q2 O; o
if(result == EDMA3_DRV_SOK), h& L# f1 b0 M
{$ Z4 |2 X ~% M1 J! F
paramSet.srcBIdx = 0;" j6 J5 c8 N2 \/ }1 x1 r
paramSet.destBIdx = 1;
* W+ g: j7 s$ e e) R* k( t9 l- x. y paramSet.srcCIdx = 0;% m6 D/ R ]6 w4 }) v, G3 X! H' u% p
paramSet.destCIdx = 0;7 L0 Q w" c6 @' i3 l0 `+ {
paramSet.aCnt = PING_PONG_ACNT;* u, i$ w4 Y( [ V
paramSet.bCnt = PING_PONG_BCNT;
& \$ O5 L+ T, A( ^ paramSet.cCnt = PING_PONG_CCNT;
! K0 }" y6 ^# v
) X) r; u+ ~0 g2 L% G1 x /* For AB-synchronized transfers, BCNTRLD is not used. */
* [) Q; ~+ x9 p8 h* A5 M2 ~! P paramSet.bCntReload = PING_PONG_BCNT;3 {* E6 e; G: J! ?, b- M$ p
' _/ [+ u/ {7 I: t /* Src in constant mode Dest in INCR modes */
6 n* V6 I! U3 F/ k$ Y5 F* l paramSet.opt &= 0xFFFFFFFDu;
' N2 [6 r5 R: d' K* t //paramSet.opt &= 0xFFFFFFFCu;5 d" o/ i4 d3 x" }3 \4 I
; x" J% D! V0 Z5 ~
/* Program the TCC */ R( W' @# i7 n" `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ F0 f! A. b2 M) p% n% M" r6 l* Z- P0 o6 S
/* Enable Intermediate & Final transfer completion interrupt */( H; {2 e9 u+ m; A" m8 |$ Q: r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 D6 @+ {* N9 e# c! x2 ]0 g7 a) E
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 E/ Z4 n" s9 x5 M2 e
( @3 k2 I6 ~: i9 n+ A /* AB Sync Transfer Mode */
; p) @! ]; f5 V2 y9 O paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* G# S3 s; B( W+ e/ _: D 3 [8 g, z, r% X( a; B/ t: I
/* Program the source and dest addresses for master DMA channel */ p9 G5 K. B$ i
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);' L1 L/ R! C. G% H* V5 d, v
paramSet.destAddr = (uint32_t)(ping_buffer);
' d# G$ z/ U: I7 @- Y
+ V& y) T! Z7 n# R+ B0 `! b. Y /* Write to the master DMA channel first. */. x( h7 \; d& L% _* ~ X6 i9 w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);( e4 V( R& X2 ~! b* z. b+ c
} - _; _/ N- Y- M+ V. K& J
+ M) w' O2 U0 H+ B7 {! Z result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% h# z) j& r) _) M. ?. T$ _) V
5 H, Y: ?5 _1 y9 c) u1 d if(result == EDMA3_DRV_SOK)
1 \+ f$ |1 x3 ?2 S. u {! p. d* U2 m* f7 c# c1 v
print2arm("edma3 driver init success.",0);
& z8 `) O- y* C% \8 J } 8 U5 w# v0 `1 i/ |; r
}
! Z" a) K4 B+ _5 Z* Q
- f# W C4 e6 x3 N% \& O2 I! @% ?/ k( Q5 j8 k0 G6 G" s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 t( b# M: x9 Q; S, T1 _2 v% I
9 X& I9 e4 d; x, m& h' \9 V1 F4 _ u! g$ }( ]0 q; R$ X
|
|