|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 z$ d7 e; ]; L5 Z- y; w6 V
#define PING_PONG_ACNT 1
! U' Y' U5 y j#define PING_PONG_BCNT 8*32*40
$ z6 x) u2 B# Z M; U% S//#define PING_PONG_BCNT 1 ( `9 i# W$ ~( O; G0 T3 y1 M: V/ ^3 v
#define PING_PONG_CCNT 19 U9 R; W+ X/ b# [- t! C: D6 S
#define MCASP_BASEADDR 0x01D00000
+ [" \+ E# x% q3 g4 C# z- E* ?) }4 x#define Mcasp_RXEVENTQUE (0u)% l2 x7 e+ F+ x3 ?6 g7 ~" P" G
. E, @. F$ h5 o/ C" f4 D4 K" c3 N/* OPT Field specific defines */& ?2 O5 v3 i. J/ \2 o1 }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ X3 v* _4 }* Z8 M/ t/ ~; R5 r9 I0 q#define OPT_TCC_MASK (0x0003F000u)
* D% K+ n2 U) K+ }: a! j0 c# p#define OPT_TCC_SHIFT (0x0000000Cu)
: ~# I8 h: a2 M5 x( R0 @#define OPT_ITCINTEN_SHIFT (0x00000015u)
" ~; L7 o* J7 T& A& y8 N( `2 w* Z#define OPT_TCINTEN_SHIFT (0x00000014u)
$ `0 V4 b6 J* t2 i/ t
/ s, l+ w6 M. s; z* M1 Rchar ping_buffer[PING_PONG_BCNT];. g) t* Y- C4 s
char pong_buffer[PING_PONG_BCNT];
) U& p1 @; R8 d
/ j# _' Y. d5 W8 i" B
/ v) z+ ?* c& f. D e+ L
/ b8 b7 D9 `2 p9 v8 b1 z$ B
% F2 ^) u1 L% k) S* W7 g$ Xstatic void ys_edma3_init()
7 w% O: |2 S) G; A{/ r- R7 V9 T/ ~9 q1 W) [' O
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, w. [; H0 Q! @& T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;& u' ?; V& A7 U; G) l; O! _& S
EDMA3_DRV_Handle hEdma;% n" G' e( f" K" S
uint32_t chId = 0;4 A0 H) |/ T) T7 a% E; y
uint32_t tcc = 0;
# n% u4 | N! z; L5 K# a. k& @% ?! ?( R) U
print2arm("edma3 driver init...",0);6 c8 s) w7 C- t' D9 Y( Q, l- D
4 g3 q) X" ~) D) Q/ s' K' q$ y8 l
hEdma = edma3init(0,&result);
, \# n+ y3 h, s* h7 w if(hEdma)% M! @7 L; H2 ]5 H, F3 f; V$ Z
{) p/ J6 r: V8 w9 R. g0 o( r
print2arm("edma3init() Passed.",0);
3 |9 Z$ M9 S5 ^# D }/ W% k0 E# \( }' P8 M; t
else( e& Y" C' y$ k
{
0 F2 c$ `4 C6 V8 X print2arm("edma3init() Failed.",0);
6 ~# @5 I0 J' N/ m5 { }, k6 N+ X. t9 h; n* u# ^0 L& k6 D
) y1 F/ \! _4 a7 ^8 u4 l @+ f
if (result == EDMA3_DRV_SOK)9 K. P+ f$ h- U; [0 O1 ]5 v
{! {2 D. a! O5 y3 P: k, R% ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,+ H8 ^5 h7 G/ C6 I
(EDMA3_RM_EventQueue)0,
1 d: g" I/ T8 n1 \& b3 E2 n &edma3_isr, NULL);
& X, M9 I4 e; @9 L+ N }* J3 D7 M& o- K
- v' c+ F+ f7 P8 p+ A1 J ]
if(result == EDMA3_DRV_SOK)' h5 V4 u# D; ~: F
{) {* i& I9 @6 S2 K5 b
paramSet.srcBIdx = 0;& C H7 ]' w8 m1 p3 k7 L/ ?
paramSet.destBIdx = 1;
/ H* J. _3 S' p2 _6 J! s paramSet.srcCIdx = 0;
! i* J& u$ k: \2 V h, k" j& _ paramSet.destCIdx = 0;1 M p" q" Z; H: r/ v t/ ~7 v
paramSet.aCnt = PING_PONG_ACNT;3 ?8 L0 Y: o: c; P
paramSet.bCnt = PING_PONG_BCNT;, z, R/ W- s6 x) I+ y+ g
paramSet.cCnt = PING_PONG_CCNT;
% J# ?6 `; e' l5 k ! U" W. c% \: G5 K( ~ l+ j+ T
/* For AB-synchronized transfers, BCNTRLD is not used. */
# z% c& c2 \ X1 @1 p paramSet.bCntReload = PING_PONG_BCNT;
1 z: u' c |( l# U9 m
, `* k1 t& t$ Q, S& m$ A% t /* Src in constant mode Dest in INCR modes */
2 p8 W4 Y1 ?3 u7 A$ Q* B+ s paramSet.opt &= 0xFFFFFFFDu;
7 `+ W7 C" ?+ I( b //paramSet.opt &= 0xFFFFFFFCu;3 t) ^+ l: z0 D4 h& U, W( ~$ f
+ K0 W, N& P; e# x9 E /* Program the TCC */ v* H: a9 d9 i- b+ d$ J1 U$ }; Z& |3 G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 Q0 o e* @1 n) h6 U
* G; x2 C' e* j9 z /* Enable Intermediate & Final transfer completion interrupt */) z% r) [+ n; L3 |' |
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
G: x2 V! E1 y: E$ r paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 R5 X. N1 X- ~. g; e& q
" B3 b7 m. ^/ q# H /* AB Sync Transfer Mode */: L7 D- _0 y6 A1 v0 @
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 e& }! [ q- O% i
% K: R" ^+ D+ N) u; K+ Z
/* Program the source and dest addresses for master DMA channel */
: ^9 x W3 F+ v @9 K2 ~ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);* s& ^, o0 R% u6 ~* G4 o( U1 @
paramSet.destAddr = (uint32_t)(ping_buffer);0 v* f: E4 Q( f) c& V
2 q) _7 W4 [! s& Q /* Write to the master DMA channel first. */
9 Z3 `" E; t' `1 Q( E result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
* h5 r, Z' Q; a" E7 ^ U } , n4 @. q- F3 b% i
* E5 c& g0 m& {5 n# y4 A! I) V
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) i+ J3 Q/ b% C/ G4 `2 Q- Y3 \
: P$ e2 d; P5 k- H
if(result == EDMA3_DRV_SOK) & n" [& x; \. w/ g( ^1 N. O
{0 w7 ]" k) V( G% S( M( Z) o
print2arm("edma3 driver init success.",0);
2 ^4 D6 j7 _/ L/ o8 M } 0 L% E% L9 F- F0 K8 R, H# A7 g
}
9 x- i7 i7 E% W2 X2 w& }, I0 k
/ b+ J" O% o# H( l. e/ R+ D- L% g- P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 |0 g3 e F3 N; y5 ~
( Z3 w5 w$ o/ b, Y3 T* F" O1 x* i# R# V5 ~8 C; J- S9 z. ~0 `
|
|