|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 X3 d/ }% o& n
#define PING_PONG_ACNT 1
" D3 s5 l1 B" R- r; G$ \- S0 E#define PING_PONG_BCNT 8*32*40
, E8 F. N, H! K; E( j//#define PING_PONG_BCNT 1 * J! U! y1 M W& B
#define PING_PONG_CCNT 1 |4 t2 \5 l6 Z3 S* \3 V6 g; k1 X
#define MCASP_BASEADDR 0x01D00000
, W; @- p. O' I+ G#define Mcasp_RXEVENTQUE (0u). j4 |6 X* p1 n
' n" F u; |" d, O6 P1 B7 f
/* OPT Field specific defines */
* G* y/ a8 P( v; \# S' H#define OPT_SYNCDIM_SHIFT (0x00000002u)
* v- i8 k0 Q# j) A& T- C#define OPT_TCC_MASK (0x0003F000u)
9 r& D( \' M# j0 e#define OPT_TCC_SHIFT (0x0000000Cu)
6 F' ^: |9 |2 ] _/ f* A% v#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ S! H. E% T0 I( B- j1 L% F3 ?#define OPT_TCINTEN_SHIFT (0x00000014u)2 y, C" n( C h) m* E' {' I
& n2 A8 s5 r2 ^' wchar ping_buffer[PING_PONG_BCNT];) X( @2 ?4 G0 g7 S" t+ P8 v
char pong_buffer[PING_PONG_BCNT];
$ \5 z' c+ A- J! p; u
, r# a# F7 f2 M' U* F- s; H* s+ z! w: r6 W% y. w
7 j R p$ K. D$ k, w$ {, D
# Y9 F) {4 e" x* t4 e
static void ys_edma3_init()4 h' Z9 o# A5 [& M" r' `+ b
{; a" C# e" ~* F# J& `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( n1 z' \( K2 N4 K9 u) W3 Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 B& L/ m, ~; ~: r% n% v. C! G
EDMA3_DRV_Handle hEdma;+ }! t# d7 ^: |3 M+ Q' \3 }5 E
uint32_t chId = 0; y* h( d9 S( D% b8 p* U w
uint32_t tcc = 0;
6 }% y# W1 J G" L; u, x7 q% d7 K- u$ u( h4 D! M3 p/ }7 {. f% R
print2arm("edma3 driver init...",0);
- B0 }5 ?/ H K( W$ O# y5 R! {2 n' B+ R0 Y5 T
hEdma = edma3init(0,&result);
1 _/ c2 {# _: S/ x) d if(hEdma)
$ C) F6 E" E& r {9 V+ @* Y' @# v, E
print2arm("edma3init() Passed.",0);
0 t7 G. d+ b* S# j }
. ?. U/ D* V/ k3 _6 D7 a7 @) X else9 [$ P" e0 w. E2 A- h
{% n6 v) [6 S8 ?& U6 x5 Z/ F
print2arm("edma3init() Failed.",0);
2 Y( F. k8 b# ]$ e% O" f6 v }
$ T: R- ^5 |( D
5 H: O; B( W2 j! _% E( X/ u if (result == EDMA3_DRV_SOK)
- X! n4 Z8 r; {4 ]! ^' u {& l& ?+ J8 u- a9 a; o( c3 B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ ?" K6 {, N" o& ?- U+ ] (EDMA3_RM_EventQueue)0,4 X8 ^' g* Y2 g6 m5 B5 r8 ^
&edma3_isr, NULL);1 I3 J5 z5 \+ T7 [, d
}7 s# q2 u9 W3 a5 j
3 b( m( f9 X6 V+ b. z0 L if(result == EDMA3_DRV_SOK)
5 q5 A8 `+ H. Y/ h9 v( t! k' f {
* D, h1 |* z1 P& d4 I6 K% l* ` paramSet.srcBIdx = 0;
3 ~8 x- g. I0 n paramSet.destBIdx = 1;) e Z/ f. Y* E" D: i
paramSet.srcCIdx = 0;5 J+ ^5 D" N0 Q2 Q! a6 K
paramSet.destCIdx = 0;% ^+ S% ]) a7 ]* u
paramSet.aCnt = PING_PONG_ACNT;
9 S5 H# M: L, h9 [7 {! x paramSet.bCnt = PING_PONG_BCNT;4 O8 V" d$ w, s# D, t
paramSet.cCnt = PING_PONG_CCNT;
+ l! W! A3 y) U$ ?
: m f$ c! Y1 b* F /* For AB-synchronized transfers, BCNTRLD is not used. */
5 z# {2 h1 A( M1 P1 J paramSet.bCntReload = PING_PONG_BCNT;
# ~* P \5 ?' C+ [# w" [ X) Y* [, d" z Z' |& _5 |
/* Src in constant mode Dest in INCR modes */
/ k; @; a" k1 d paramSet.opt &= 0xFFFFFFFDu;
. y# t8 M7 z9 F$ J4 f6 a" |7 ~) y //paramSet.opt &= 0xFFFFFFFCu;7 n& q1 f8 D2 g E2 E3 _) U
# _' G, y$ y2 w: ?
/* Program the TCC */ b5 S4 d: ^- d, |4 F
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 U$ z9 S7 I: q! X" X+ g6 K3 G% U% f1 y) O) [
/* Enable Intermediate & Final transfer completion interrupt */
! t. u8 [( Y$ f6 `' F7 m7 j paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( r V0 {$ S i/ j: ^ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 u* S$ g% C4 Z' ]
7 ?( s3 o, c: k* r9 C4 M0 P
/* AB Sync Transfer Mode */% F& s3 Z" y5 K: j$ ?! V6 L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( S4 w; u% K) x, t2 o 0 N8 r: v& E* G& Q
/* Program the source and dest addresses for master DMA channel */
% I4 _* }% P( v- n( J paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);3 U, C A: I( K l4 Z) A
paramSet.destAddr = (uint32_t)(ping_buffer);
2 a# f3 {" }, F: R
. I" H1 x9 J3 f$ o+ F5 g /* Write to the master DMA channel first. */
7 q8 d2 @1 F( y4 }' _ result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 z/ I& D# m, W% e0 A- W2 ^ } # u5 C( p8 J3 ~- a
" C9 v b0 N' t& U" J9 }8 ?1 J result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* |% E) k0 v0 h" I- R R4 T( `0 b3 V/ U
if(result == EDMA3_DRV_SOK)
" f. A4 y1 n. h" ^' E) E' \" O {
; N% r2 q0 _, J% ?$ X! i# L print2arm("edma3 driver init success.",0);
- W" X6 k, O0 q X+ i9 y }
& M: V ? ?$ p# T3 A}
& F5 z2 T( }3 K. @) v9 D Y- c* I1 X \; b' U; C t- h! e
) O1 w, n* V! R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% O5 Q5 l: [' `' M8 W$ P3 k2 h# T( e2 V$ q9 {3 y
. a2 B8 }( K3 Y$ c6 t% I8 \ |
|