|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 ~5 b- u, {) V; `9 ?#define PING_PONG_ACNT 19 W# b' d: m) x, m& P
#define PING_PONG_BCNT 8*32*40
( s$ J+ H, f" T; O' s: q1 v//#define PING_PONG_BCNT 1 8 c+ M) j2 [" B4 @ u# V
#define PING_PONG_CCNT 1
# U! _( h3 X( v/ e- V( h#define MCASP_BASEADDR 0x01D00000
" F* H) e. P8 \/ Z }#define Mcasp_RXEVENTQUE (0u)
( ^# B& |* } Z2 R% u5 ~" m! V- c' m4 K0 T
/* OPT Field specific defines */+ _- l* f: Q& x( z6 i9 w8 W0 t; s/ e
#define OPT_SYNCDIM_SHIFT (0x00000002u)6 [5 g; O$ L' N0 U" a' f+ F: g
#define OPT_TCC_MASK (0x0003F000u)
7 f# U5 c- L5 S3 F. c" O) e" n#define OPT_TCC_SHIFT (0x0000000Cu)
( f4 U& G) i& z- ?#define OPT_ITCINTEN_SHIFT (0x00000015u)
) w3 U0 {* }' @6 ?#define OPT_TCINTEN_SHIFT (0x00000014u)
4 v! `7 C. r; x* x: j; z
9 t0 o/ S2 `/ l* w$ `+ |/ X! qchar ping_buffer[PING_PONG_BCNT];0 \" S( ?$ @% s7 }- o2 Y1 L2 ~8 R9 f
char pong_buffer[PING_PONG_BCNT];
/ e7 h& D, h0 k% q+ b$ R3 \1 ~0 h1 G/ L/ U: N- p/ }; [) L$ V
2 G+ l: B! N; F) n
* h( Q& L1 Q( |+ o0 i$ w
8 @9 j' t) N; g% n+ Ostatic void ys_edma3_init()
; G. }+ r3 U5 k+ c! m. }# `' g{
' s- K" [9 ?7 @; w1 Q! y# | EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! N y; K H2 R \5 J EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 F/ v: H; Q4 M/ Z
EDMA3_DRV_Handle hEdma;5 @9 C1 N* f6 [! X/ D/ Z
uint32_t chId = 0;
3 G, O/ E/ U* f) w( k uint32_t tcc = 0;
% ?/ G" r9 ?' M
" I8 I& L @$ D6 p" e print2arm("edma3 driver init...",0);
! d. d. N' S/ |: V
# u0 s; X% W* g/ c W7 { hEdma = edma3init(0,&result);" x& I# y, i4 ?9 ~ j
if(hEdma)1 |0 F$ ~) ]! p+ m* h- d* t
{$ B6 y- H) P1 S, _2 W6 Y
print2arm("edma3init() Passed.",0);2 Y i6 x6 S$ f n
}
) a% i8 B& P; h/ C# ^# d else
( {" U( p: q, h9 i {; C& D1 L( [! V( o v2 G
print2arm("edma3init() Failed.",0);
$ K) w5 o- y9 | `$ W8 r; ] }
G3 c& V/ _& n. z
. t) x$ D( V! }$ p if (result == EDMA3_DRV_SOK)
- K5 z* h; `3 ^, K {
" i6 `& f0 G* Z, z result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 m3 q4 y+ a b; I (EDMA3_RM_EventQueue)0,
/ V O8 l2 u; k* }0 F &edma3_isr, NULL);$ s$ G; v8 D' `+ `5 E: X
}' U. f! n! A& a/ e8 _
3 q* G4 @/ u" I1 Q if(result == EDMA3_DRV_SOK). D6 ?; j' b& W; o6 z* ^% n2 s
{+ w f" Z% C: c
paramSet.srcBIdx = 0;# g7 j. p* @/ T5 ?; s
paramSet.destBIdx = 1;
% v3 ~' k2 I" J8 J& Q- }0 Q1 \6 a1 m paramSet.srcCIdx = 0;
0 K. [2 j3 D, U& g" _ paramSet.destCIdx = 0;
4 h K6 }, H% O8 Y9 l paramSet.aCnt = PING_PONG_ACNT;6 _" Y" d B# d, f6 _- M4 N
paramSet.bCnt = PING_PONG_BCNT;, A( n: b1 T n8 \4 N0 p
paramSet.cCnt = PING_PONG_CCNT;
5 L6 W, I, g3 m* A) o, o4 K) B3 B % n9 s# N& l$ s6 z0 r
/* For AB-synchronized transfers, BCNTRLD is not used. */
' o' L# K D0 {. I! { paramSet.bCntReload = PING_PONG_BCNT;% n0 W. Z, R0 ?( @( P2 a
; a: q' g1 R0 l( m /* Src in constant mode Dest in INCR modes */
: T; r ?0 ?4 d# @; Z: l& a6 N# t; b- o paramSet.opt &= 0xFFFFFFFDu;9 {9 l" p: o% m4 V7 t' M! f
//paramSet.opt &= 0xFFFFFFFCu;; ]# s' |# K% @$ Z4 J t
% f& a2 x2 k7 p$ |6 ~0 m /* Program the TCC */
. o( J. b! B- b5 B D paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 {% c4 \& ]" k5 h7 e
; c5 X2 C/ S! c8 i, S /* Enable Intermediate & Final transfer completion interrupt */
; U3 G7 S$ r9 E- m paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ f* a X0 S; B: C; m7 L6 p& r3 Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ A$ v) g+ \' s6 |% u
5 U$ J; q& ?3 c+ N( v9 @1 P6 c /* AB Sync Transfer Mode */+ u, g. w" G _# `3 U. A
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 Z% f3 a R; j+ N" i, |
* g' u4 E1 s v6 i
/* Program the source and dest addresses for master DMA channel */( @: v$ V( b- v7 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 N+ q' t: q8 q% G6 K( {) f* Y paramSet.destAddr = (uint32_t)(ping_buffer);- ^- _* h0 r! u8 @' Y. F! E) M
/ J8 F: N* @- o2 ]( m5 i9 R1 S /* Write to the master DMA channel first. */
; Q! _ E/ i4 x5 d3 `& }$ e' a result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 ]* d9 E/ a/ z n7 T3 c } @! R! ] D( s
7 X' U- F3 Z4 i; C1 p, `! y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ [' C" }3 t% Q: q0 M0 A$ l& o! E5 |
) R: {3 z7 \& g, m! t$ X; q, R if(result == EDMA3_DRV_SOK)
8 G3 g3 x% B9 m! T* B3 N {5 F' o0 v8 k @1 T' j; Y/ o8 I) B5 J
print2arm("edma3 driver init success.",0);
& }. A; P' _( ? }
+ _- e/ O) n) a" l A+ ^}
: d; r" M' Q8 ] |. } p: s8 m! I C
3 ?5 O4 a/ }' l1 j/ HEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* K; _+ `6 g" s/ x4 c5 }. @3 n# [* n' F8 b$ |! j2 F2 C
8 f" g, v. P0 }; ]4 }; {2 d) [8 `" L
|
|