|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& k8 p1 y* |( B/ K0 k2 Y/ ]
#define PING_PONG_ACNT 1' W$ J# N- j: u( e$ Z
#define PING_PONG_BCNT 8*32*40 ; m6 a" m' S2 L1 G0 J
//#define PING_PONG_BCNT 1
0 M f8 g; U2 I. n+ _) p% m9 [#define PING_PONG_CCNT 1. D3 [7 O f7 E4 s( h
#define MCASP_BASEADDR 0x01D00000* s: ]# O- p! R3 I6 v
#define Mcasp_RXEVENTQUE (0u)
' P8 B* J# w) X5 m# Z4 M4 r
- F) `' \( S& m& ?0 T6 j/* OPT Field specific defines */
( P- B2 O$ v" i( R. s#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 \) B& M; I4 B' Z4 x5 L, i#define OPT_TCC_MASK (0x0003F000u)
/ ]0 M* l5 p! S4 q; e#define OPT_TCC_SHIFT (0x0000000Cu)6 w) F2 U8 e2 s C' p
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 Q7 @" h. g# u3 P: g- X# h#define OPT_TCINTEN_SHIFT (0x00000014u)
. m* v% \5 r, F2 v* ~' y& S- P% _/ Q
; q9 D) @. b% }: vchar ping_buffer[PING_PONG_BCNT];
N4 K; m# Z+ n$ H$ \$ Mchar pong_buffer[PING_PONG_BCNT];
3 ], g! u9 J9 [6 u4 Z8 S0 m8 \8 F: d2 i6 T! G; G( K* d
3 f3 e, U$ S2 t; L, _, y9 t0 ?0 T
! J( E* J* R& w& j- |4 j3 u F+ p) R
static void ys_edma3_init()
0 d& V: \$ T; b{# z& {! s8 w7 p* Z1 ?6 P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 A3 g: ^: I: b7 `( H8 D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# h f" h( f- u8 ^9 ~ EDMA3_DRV_Handle hEdma;( ^( Q; p+ v' @; [1 X% O) L6 D- Z, ^1 F
uint32_t chId = 0;: }% w3 U0 B6 |8 t; M K4 p2 n" {
uint32_t tcc = 0;, m& g5 s) a- {% B
s6 [% w9 S# | t1 [* Z
print2arm("edma3 driver init...",0);
! l$ F$ X( U$ W
9 n5 P3 [+ g5 R4 C* \ hEdma = edma3init(0,&result);. ?2 B4 q3 c q% H8 a
if(hEdma)
. ~7 K# W3 v7 T& I! G! d0 _8 U0 e# o3 m {; \. n9 ?, g* j% w! e$ f) e f3 ]
print2arm("edma3init() Passed.",0);( k" m5 Z8 f* [
}
0 H) l! O1 A V+ f% M' b7 E else0 K8 a, K# O" {9 `/ d$ g. n
{
! o& ^* n& l8 Q print2arm("edma3init() Failed.",0);
7 z% H4 D: y- G$ {3 |: I }( W3 w( }# [- t: F
3 B3 @' I) q; D7 l if (result == EDMA3_DRV_SOK)' N# d1 \" ?5 Z! n) D- M; V
{
# ], W$ n4 N( t; f0 b+ ~* \. B result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,: W% g5 U7 K" c- X" q9 {9 Z) w
(EDMA3_RM_EventQueue)0,. x6 Y. i6 w, u7 q$ l- w( I! o& w
&edma3_isr, NULL);
* o& ?; A H. f" s# C# h }
% I. ^) z( ^8 |3 m
- y4 d/ `( s% x) O$ J- Y if(result == EDMA3_DRV_SOK)4 e5 Y) z7 [! m! |) ] {
{
5 I0 U0 S( |2 ? paramSet.srcBIdx = 0;7 e9 J& {0 H* q4 |# r6 @- `' O" k, S
paramSet.destBIdx = 1;" w& S4 C0 b# a/ A& U
paramSet.srcCIdx = 0;
3 Z0 {. R- r+ X% d7 M2 g- C% z2 H8 i; O& Z paramSet.destCIdx = 0;
9 ^) z' p+ }' I4 V paramSet.aCnt = PING_PONG_ACNT;6 a; ?" ~5 P# u4 i5 j7 F& x! Y
paramSet.bCnt = PING_PONG_BCNT;
, ~: f$ e) m9 ~7 w paramSet.cCnt = PING_PONG_CCNT;5 Y: `. i* Z4 B/ }: ~1 }' [4 k
+ a8 H; s3 _+ _$ T1 r
/* For AB-synchronized transfers, BCNTRLD is not used. */9 y& _+ ~+ v8 M! N n% M
paramSet.bCntReload = PING_PONG_BCNT;: U% y' f _4 P1 j- H% Q
+ x) [) K4 B0 r* y /* Src in constant mode Dest in INCR modes */7 K% w9 G! d( @ Y
paramSet.opt &= 0xFFFFFFFDu;* x5 ~% e4 U/ c/ _3 P5 p
//paramSet.opt &= 0xFFFFFFFCu;- D- u$ L+ `1 U) Z5 Y9 N3 S
% Z* @- B$ c: R6 `/ R4 {3 u8 F
/* Program the TCC */
9 w2 y; S% V4 |3 D* i1 L paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; {+ Z$ [, ^# j! T) n3 l% j
9 z+ }5 e, {2 C' p& M, U /* Enable Intermediate & Final transfer completion interrupt */
9 V3 z8 h7 H2 ^& j Q3 C paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ N* k I4 f4 a M4 p paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); d: J( A8 w7 n, |4 ^
" a# }( X6 n Z /* AB Sync Transfer Mode */
( L2 n2 l* B+ `4 X; _0 f paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 f, x b! t0 e4 }$ |/ Q
/ h" I3 m) [1 y" s' X" I, j /* Program the source and dest addresses for master DMA channel */
2 K+ y) n4 m6 G* t3 R( u paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 U" f J/ a9 ~$ c% A8 i$ m. l paramSet.destAddr = (uint32_t)(ping_buffer);
& J0 c' n- ~- j) l' y" P; g, ~$ q
/* Write to the master DMA channel first. */ Q9 o8 g7 }" O7 k) A
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 y- J) e& _, @ }
% L x q, A, w% O% @' l* w9 h+ `9 }
8 p8 t0 \6 {9 D/ ]: T$ u result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! S" p2 ^' [4 R5 U( x
6 [6 q. n% E4 H& U2 D4 V6 q' T# x
if(result == EDMA3_DRV_SOK) 8 y; [. _& ~) G
{" @( |" x$ l0 s3 v' ?
print2arm("edma3 driver init success.",0);
" B0 r# y" _- ~6 f }
) ^2 y/ I: n* _}
1 O' k/ n. m5 h0 E. \, x7 u2 J) t _9 V/ c6 v. k" K% {+ v
7 ^( p) C+ S0 g% S6 y9 R) n
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' d& b; p7 I" v# N$ W9 m! g
/ `. |# s# P7 ]7 d) h$ Z% R, w5 }& L& {% a3 v
|
|