|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: Q$ F: A/ i0 _* j
#define PING_PONG_ACNT 1$ U. X! W1 `' [- v5 B
#define PING_PONG_BCNT 8*32*40
) z( D+ L6 Y9 e. e//#define PING_PONG_BCNT 1 4 y0 H: L' h) x* ?7 x6 B
#define PING_PONG_CCNT 1
3 ]- ?, \7 r% q9 C#define MCASP_BASEADDR 0x01D00000
& b2 L% y% t$ u0 x. |, X#define Mcasp_RXEVENTQUE (0u), F1 y! [6 @3 Q8 X1 @- q# D1 Q1 o: X
2 M0 j, X0 b' m% v/* OPT Field specific defines */
# ?4 O1 o% |# [$ W+ a( f#define OPT_SYNCDIM_SHIFT (0x00000002u)
: q- K% ` z+ K4 s#define OPT_TCC_MASK (0x0003F000u)/ V3 ^' Z" y6 G7 r- b
#define OPT_TCC_SHIFT (0x0000000Cu); a) e; B* s! r6 `% c; i) S
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* ?3 g) E' U) h#define OPT_TCINTEN_SHIFT (0x00000014u)+ k6 f I& @ ^8 g# S( |
R8 O% h! ~) R" gchar ping_buffer[PING_PONG_BCNT];
. b$ w% U1 v/ B7 ]9 Lchar pong_buffer[PING_PONG_BCNT];4 h3 z l0 R W2 R3 n; Y
9 R3 v1 U& \( F% _* B6 \ b& t2 r, ?
6 J1 \7 R5 N1 G! i, @7 v9 r0 F) |( k/ a" H% y$ w8 k
static void ys_edma3_init()
" v& E& q$ L2 ]{$ `3 B) l! F; }3 h X; ]+ Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" F* J* f0 ^" ` T3 U% a& f/ \! z( B EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; _8 j& k4 R6 C: t a EDMA3_DRV_Handle hEdma;1 `0 ^* R0 d9 ], O. e' o
uint32_t chId = 0;
; x$ \& b9 R2 A uint32_t tcc = 0;0 i+ @% O. v0 m* a% W1 X, r
" e, A5 j4 a- u( W. ]* t0 X
print2arm("edma3 driver init...",0);
0 @, v+ L) r1 c0 y% @) R( x
% r- o6 J2 G. @# s0 W& S hEdma = edma3init(0,&result);7 H% K+ [% h. F! v, f
if(hEdma), U4 B7 |" o) w7 T
{
8 A; F3 N& C; E' w print2arm("edma3init() Passed.",0);3 ?" H! @5 v" Q6 ^
}3 m% o% k0 `1 k3 X7 L' R, q
else$ d2 ^) \6 U% Y% p9 f
{
7 k2 B. P& f9 V/ h* x print2arm("edma3init() Failed.",0);$ v9 \8 f" m# K. \0 N- j) D
}2 A6 x8 m; F G+ p' f
M( [9 a6 q( ~4 K! h
if (result == EDMA3_DRV_SOK)
! w: m& U/ b8 ?# [+ ?5 J {# v1 K b1 n. N: E" z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 L; ]( ?. t1 P
(EDMA3_RM_EventQueue)0,$ X" @! L0 t* k( A2 Q( K
&edma3_isr, NULL);
) v4 b" Z& Z. h( p( ] }
0 w# e- j2 S+ O6 r" ` $ {! } G8 ^! S: {
if(result == EDMA3_DRV_SOK)/ x6 P, {: I. l; t* Y; Y% j
{* C) J5 ^5 I6 I$ B& Z, c5 L' T
paramSet.srcBIdx = 0;- \5 p! P$ v1 |$ G" ~
paramSet.destBIdx = 1; M; Q4 `5 f2 l3 w; ?% B
paramSet.srcCIdx = 0;& s; u9 c; ]2 u8 H, s' e# L+ R* Y/ W
paramSet.destCIdx = 0;
/ _2 l6 F1 a# r9 Y" O- F4 j: `9 D4 m paramSet.aCnt = PING_PONG_ACNT;1 U# S- f7 Q7 d) Q' }
paramSet.bCnt = PING_PONG_BCNT;
1 @+ s7 z Q. y paramSet.cCnt = PING_PONG_CCNT;1 t8 j+ l5 j8 Q9 q
7 }8 o( m i& P6 E. i) ~8 \& x /* For AB-synchronized transfers, BCNTRLD is not used. */
6 x9 i3 }- a" n' K paramSet.bCntReload = PING_PONG_BCNT;; @) Q/ h5 \, K) r5 F. W% m
. m+ V% R+ L% X% @, R3 {* {7 Z; U
/* Src in constant mode Dest in INCR modes */; R j+ I( z7 [% A
paramSet.opt &= 0xFFFFFFFDu;- M: ?/ S. ^" e2 a& b4 r
//paramSet.opt &= 0xFFFFFFFCu;, n8 r8 @0 p- w6 j8 ]9 v
( R" m! `1 k; D" K
/* Program the TCC */4 y8 _: E% _& A; R7 j: {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) @ {8 i! @$ h2 q
6 _9 x T+ O( }4 H /* Enable Intermediate & Final transfer completion interrupt */0 r# Y! R; B/ W! D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ U1 U7 _7 E* H+ o3 s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);6 P2 s7 E. @' ?
: F, x- _9 Y9 K& p6 x% G
/* AB Sync Transfer Mode */+ m3 d# n s4 k+ Q. {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 N$ e0 _0 c! p9 o+ a9 G+ y& |
3 S7 O* M- P5 R" ?+ p /* Program the source and dest addresses for master DMA channel */
1 r( a( _7 t' w4 M paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);1 x) _/ T) y- b2 E- K3 _# t3 ?
paramSet.destAddr = (uint32_t)(ping_buffer);
/ v) O. _1 A4 u& e
: M: t/ x" i9 A! V; E& _ /* Write to the master DMA channel first. */+ {% @7 N# s, G7 G* D; p3 {
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);) q) {5 `) @4 m7 i( }
}
4 n5 x* |/ h r, z5 r+ b
4 A2 j( P6 }5 m result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 r, L- U2 s) C. U
/ R. t9 b5 q3 }0 B; Z" F if(result == EDMA3_DRV_SOK)
+ B V: ]) {' }1 g- z {
$ W2 ^: D6 z( \; ~6 d* Y& K4 u print2arm("edma3 driver init success.",0);
6 G' b. p4 H. Z" _+ I } 8 S/ @* v( Y b' o3 |
}
2 N% L% H4 E- O
1 ?9 w* t7 _ K0 H# w$ m& t/ T/ m- n b% J% U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% f }) q. ?, r+ P. `2 ^0 F2 V( N( ]5 w4 U, U
8 K6 H4 c0 M% j9 ^. D. j/ z
|
|