|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 ?, l: B+ W, B; ^3 ~! |#define PING_PONG_ACNT 1
: {7 v% ^8 {7 ^! t0 F#define PING_PONG_BCNT 8*32*40 : c E" \+ {9 n: u
//#define PING_PONG_BCNT 1
9 O* ]. p) t4 |5 R2 v/ R#define PING_PONG_CCNT 13 Z y( | ~% o K1 X# m
#define MCASP_BASEADDR 0x01D00000
( X3 e1 [$ u0 |2 h! V#define Mcasp_RXEVENTQUE (0u)
- _3 f+ }0 i3 t( f8 ?6 ~0 g7 M2 H
/* OPT Field specific defines */
: W( B8 j$ L# i/ k#define OPT_SYNCDIM_SHIFT (0x00000002u)
) ^2 _: W# r# H* b+ L#define OPT_TCC_MASK (0x0003F000u)* d6 e; T' y& d( h+ v) J- H) r
#define OPT_TCC_SHIFT (0x0000000Cu), w r: X" d+ {2 s
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! I' @7 H2 H& a& ~#define OPT_TCINTEN_SHIFT (0x00000014u)
9 A# @$ [9 k! X6 \1 A8 ~5 X: k; B _1 ]
char ping_buffer[PING_PONG_BCNT];
: f+ W4 i" `% U$ Q+ Xchar pong_buffer[PING_PONG_BCNT];
! N) [4 Y1 L" V' ^" ~% O
; N$ ?0 {3 x; k
7 a# `& m( I. x& @& c- J8 F% p& w0 z+ _) E
! L. A4 `) c9 m% W
static void ys_edma3_init() k7 n7 k5 ?7 m7 U5 |4 o
{
: d, U2 s; _$ C: P7 R4 K EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ D* O8 l) i; j6 U EDMA3_DRV_Result result = EDMA3_DRV_SOK;* L! ?( C/ `; G+ s) N" y7 v
EDMA3_DRV_Handle hEdma;4 v/ Q8 o) f! F5 W6 W
uint32_t chId = 0;5 U& i& S, w& h; M
uint32_t tcc = 0;
& [' T, I9 q* w1 F
$ |! D! b# y( k print2arm("edma3 driver init...",0);6 ]+ m$ @# j9 s$ W1 I9 m
" b. T; ^9 w7 o/ F, m2 j hEdma = edma3init(0,&result);
; a6 A/ Y3 b1 _' b if(hEdma)
7 O: g. ~9 s- t' o# G9 ~ {% N* ]( g. m0 h' K* ~! V* D T: @ O
print2arm("edma3init() Passed.",0);4 B+ J3 X8 Y6 H* v
}# o4 j4 H1 [4 ~' q5 y$ |
else8 s2 u8 d8 j, a3 C
{
6 _0 Z9 t: B2 v& L$ f6 ~: \ print2arm("edma3init() Failed.",0);
1 F# b; z; D" T1 ~- W' `4 m }8 ]9 [$ B8 r& N, c3 l
* l4 Y2 g* j& A& ? if (result == EDMA3_DRV_SOK)
; u5 g/ `1 j) m z9 m4 p* e {, w" x [) I% [5 D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) J1 W. t+ z+ u' k) w) \% h4 X (EDMA3_RM_EventQueue)0,
( v% W5 N& `7 G9 m/ g &edma3_isr, NULL);
3 u' T- [+ S& k! V }/ S$ J* \1 ]8 \4 X9 X, i6 Q. A2 B
. e8 T% L8 B0 j4 E3 G: X& \" k5 a if(result == EDMA3_DRV_SOK)6 y$ Q; ?' i. ?1 x% i. g6 i' _
{9 _- Y. o/ }8 P Q1 T* o
paramSet.srcBIdx = 0;2 Y7 D# y* C m
paramSet.destBIdx = 1;3 v5 ?8 k! i- W2 o) ^
paramSet.srcCIdx = 0;7 E2 ^" N7 c9 L$ W4 A- M7 {
paramSet.destCIdx = 0;
" K. {; b8 |1 g. i paramSet.aCnt = PING_PONG_ACNT;0 ?% o2 Z( K. B6 ~
paramSet.bCnt = PING_PONG_BCNT;
& d$ g" N( F, v; U$ j! f paramSet.cCnt = PING_PONG_CCNT;; M5 W" M$ K( h1 K9 k& ^
1 V& j, J# Q5 b Z1 ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 r0 F; w7 K9 ]: h* F, s' I6 q paramSet.bCntReload = PING_PONG_BCNT;
) G/ a5 R% L, b
! d5 B% H& p( V0 d /* Src in constant mode Dest in INCR modes */
7 I" }2 C3 K& S# _% f( m' D paramSet.opt &= 0xFFFFFFFDu;
" R# `% L! A8 d! _* [: y! k //paramSet.opt &= 0xFFFFFFFCu;
, L- ]0 B' W$ Y% u. M' L & C( A, H D1 a. @7 v
/* Program the TCC */" x8 U2 |! Y( G6 a* c& D& m
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 T& i' i" |8 r/ W# F
7 N8 y! n( v0 l# F5 x /* Enable Intermediate & Final transfer completion interrupt */
* u+ I, L3 J9 s1 L paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 U7 X) Y- x4 Y. v* Z! q$ Y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 e+ y" N! ?% B+ G, p# u
O0 D, ]% r; Y8 P /* AB Sync Transfer Mode */
% j# k* s8 i2 _ q paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( z/ o0 @4 \/ n8 c4 m! ^) B+ g+ O 4 y) \/ R* o- c# t2 }
/* Program the source and dest addresses for master DMA channel */0 _6 D- i. A0 p8 w, R7 g1 O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);, |+ s) N1 T3 `# K% ~$ Z1 _5 |
paramSet.destAddr = (uint32_t)(ping_buffer);
: T( O2 P2 T# {, M, P, n9 D6 G2 D1 S* E+ |# _: k
/* Write to the master DMA channel first. */
, t1 l3 C Q6 M7 ` ] result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' O+ F5 F1 A0 e% ]2 b0 D } : c- r, [$ ~( A, \
) D4 v% L9 {# K; [8 B result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 a# {4 x/ ~7 S0 h) z. b. G
2 n/ }$ E8 `% @# L, b- R
if(result == EDMA3_DRV_SOK) , x9 ?* G! ~( G8 E2 c Y0 \
{
, w0 _4 h/ L4 \5 ~2 D9 g" R print2arm("edma3 driver init success.",0);
6 e2 q3 C1 B+ `: W }
8 `4 I4 A2 R- `3 {. H) m1 I}
9 o8 a: v) z! T$ z. @" G' B$ x8 }: x! t ]
# \8 e+ ]/ ^1 G- @ a8 ^EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! u/ Q/ z* a. D# a0 s' \0 D
7 w5 E! }6 W! e) [
& y1 k3 @* `) s4 Y8 ]" x* u
|
|