|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:$ P1 z1 q+ K, e- c8 v$ m3 `
#define PING_PONG_ACNT 1
0 ]% t6 C2 D, I. V#define PING_PONG_BCNT 8*32*40
- s+ C q a6 }' X//#define PING_PONG_BCNT 1
) T7 W, F8 M, U- J#define PING_PONG_CCNT 1 R6 C2 D' r; N' ]5 Q
#define MCASP_BASEADDR 0x01D000006 z# G3 ]) U% E
#define Mcasp_RXEVENTQUE (0u)% Y6 `$ N4 ` L& [" e$ V
4 l6 ^0 [$ S+ p r4 N7 Y# h
/* OPT Field specific defines */
/ ~ W; D0 Y' E' Y2 ]% Q#define OPT_SYNCDIM_SHIFT (0x00000002u)
+ l" L) p, Q+ i7 n8 t9 W#define OPT_TCC_MASK (0x0003F000u)
" ~: N2 ]8 m1 b. V0 V) o- N; J#define OPT_TCC_SHIFT (0x0000000Cu): t& g6 l7 A! m) w8 [' p
#define OPT_ITCINTEN_SHIFT (0x00000015u)8 V7 p( j+ \ ^1 ^* ~8 ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
& T M8 A! [2 @1 u5 b. E6 y: j9 F1 [1 M/ U
char ping_buffer[PING_PONG_BCNT];
8 D2 Y7 y! {8 @+ e% e9 pchar pong_buffer[PING_PONG_BCNT];3 H. e1 c* C6 b8 m
, z$ r/ h/ S x! y' e: ]" c# s" O3 E2 L
: d, Y0 j/ c) L* a6 @/ i' W$ ^) c [& \
+ [! s+ P9 a2 `2 Q7 astatic void ys_edma3_init()1 A& m- I" ^9 L3 {
{
( s- w. Z/ Q5 w' w7 G9 {# n- y$ d EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: p* [) \8 J! M5 @
EDMA3_DRV_Result result = EDMA3_DRV_SOK; s0 x( [) w1 I' @. @& N# D& l
EDMA3_DRV_Handle hEdma;
& A) I# G% f+ R4 S uint32_t chId = 0;
3 x* H; C" e% u6 m uint32_t tcc = 0;) W! Q8 P, V6 \6 T6 a3 h9 j
2 A' _" J6 n+ C' m print2arm("edma3 driver init...",0);/ e% B0 q+ w# t+ H
& T, t+ j' E @6 G) Y hEdma = edma3init(0,&result);- c) P0 ~8 y* P- m
if(hEdma)3 n5 R6 \ ~. d8 f; U
{
( A h% B& W% }& ^ y" P; u: F print2arm("edma3init() Passed.",0);3 ^( V) l* F2 n% ~- W6 u) v
}
7 J7 U% f( k) p( ~ t5 J. `$ R else4 O9 Y# t8 j' f
{) F e) O; [' W/ V: L" W
print2arm("edma3init() Failed.",0);9 f* r2 L' ?' J
}
6 ^0 m$ N1 o0 ], C1 ?( e6 Z- D - j: Q4 y9 v; p; e. O, ^+ p
if (result == EDMA3_DRV_SOK)
( e' H; G$ L, t {
1 m. |. z* @/ a& `7 x result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ b2 l* `) I8 t
(EDMA3_RM_EventQueue)0,; C# M% y0 T m$ W! ~
&edma3_isr, NULL);7 k4 T' R0 h1 n& m0 g# @
}
6 a. {" j! `# J ( V; h/ ]: Z8 K) ~
if(result == EDMA3_DRV_SOK)
) A* C# M8 O, P& Y {
, u: H0 c% p% o8 c paramSet.srcBIdx = 0;
# X9 J* O% Y0 k' e paramSet.destBIdx = 1;% F0 I$ N* f, E* m4 B
paramSet.srcCIdx = 0;
2 r- E1 i; i* R6 M paramSet.destCIdx = 0;
, l: {# h- O1 r( x# } paramSet.aCnt = PING_PONG_ACNT;
& k9 S& l0 ]5 y paramSet.bCnt = PING_PONG_BCNT;; u6 |7 U% F- ?( @$ z; S; R
paramSet.cCnt = PING_PONG_CCNT;% {( C" r: P+ X5 ]% h
; Z" Q' _4 P- A /* For AB-synchronized transfers, BCNTRLD is not used. */7 h% f" C- V& ` m3 `- p
paramSet.bCntReload = PING_PONG_BCNT;( I+ R/ l7 y2 ^9 ?
/ s8 a; m, `! Q( ~9 Q. O /* Src in constant mode Dest in INCR modes */+ q" N: Q* ~/ G
paramSet.opt &= 0xFFFFFFFDu;( S( h4 J w0 u3 ~0 g
//paramSet.opt &= 0xFFFFFFFCu;
% v( E" B% M1 r( h/ ], p, } K- q% J0 Q( G" m0 w+ D
/* Program the TCC */
6 u7 ]% H4 W( m! N( V paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 V$ M! M2 E& v) h
3 k9 N7 A5 u2 g8 l$ t /* Enable Intermediate & Final transfer completion interrupt */
) y( G+ D, x9 e: o B/ o% M* d paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);3 U1 [6 T3 a( ?( D8 m
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* @' {& @ m6 F5 w
4 I# B+ `' p9 m8 i1 t% H& _0 }/ }, n9 B /* AB Sync Transfer Mode */
1 u& T/ i5 W+ a( Z9 U+ P4 i paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: E6 f8 d8 H3 w # \; Y+ T4 F+ E9 \. k$ i9 L+ p2 d( \! r
/* Program the source and dest addresses for master DMA channel */
2 i2 _3 l' f4 I' J1 P$ h paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 ]/ f% ^6 v2 g9 |9 T paramSet.destAddr = (uint32_t)(ping_buffer);
' i( v1 K) e& r( l% @$ D+ d
8 e" U/ W) ]6 k /* Write to the master DMA channel first. */' f# t; d5 X; f8 D) g N) @
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 Z8 ]( Y% K% E. t5 F } . C& `7 \( N. I3 A4 b
* c1 I/ ^1 `8 M2 `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( i) l3 n! a8 ?. t
4 }, t! d. O) ~# X! ? if(result == EDMA3_DRV_SOK) ' _' p8 g9 Q: u0 K
{
) e3 h; l4 s8 B4 H1 P print2arm("edma3 driver init success.",0);
2 g) [8 R, ]' v } 1 Y0 Y7 T; X' j7 |. O& y
}
. u* c& W: ]6 |% j& V+ H
2 r# @% ]5 C% A$ O9 }* S/ F1 A3 C" J' X! d3 y0 V/ H# _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 S4 q$ i& ^6 O# Y; S" c; R
, q5 f. |- {- C) _1 N, V' F& }
5 ]/ }; B; k) q |
|