|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 D! ~; z7 U7 K( I#define PING_PONG_ACNT 17 ~7 |4 r) Z3 @7 `* ~2 {/ w
#define PING_PONG_BCNT 8*32*40
( l Z% Y5 s* X+ _" O- i//#define PING_PONG_BCNT 1
" r5 @/ N: r/ \: b#define PING_PONG_CCNT 1
& c0 n+ z, |+ Y" E$ o" w#define MCASP_BASEADDR 0x01D00000: ~! Z: d+ d0 J- t% @4 H
#define Mcasp_RXEVENTQUE (0u)
8 T/ a4 _, l9 U$ A' I& E, H% o$ \+ }+ {
4 B; H4 \. t6 V2 E% O& i3 s/* OPT Field specific defines */
/ d# ]" Y5 G" u" W) R1 C#define OPT_SYNCDIM_SHIFT (0x00000002u)9 Q6 U# I1 ^* U) h4 N
#define OPT_TCC_MASK (0x0003F000u)
4 ^- P" [* e+ G b#define OPT_TCC_SHIFT (0x0000000Cu)
0 i( A1 ?+ w$ {9 O#define OPT_ITCINTEN_SHIFT (0x00000015u)* i7 @# T* u# o" B5 b% F
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ W* m5 f$ I( |
2 F9 N9 I0 d9 B9 Y p8 Achar ping_buffer[PING_PONG_BCNT];: p9 l' K* f: X" j/ X
char pong_buffer[PING_PONG_BCNT];# E6 }3 ?4 x# T
$ Y5 O) V7 X0 |- Q( p
. t1 Z* }% [$ I. ~# W7 `# ?. M
) l4 ~( t9 F8 g5 j* o! C+ H( T
# v Z$ g! B8 y! |static void ys_edma3_init()
' W" |6 ~" D# D$ y0 ]{
( i& F7 P0 E& h2 l4 Y7 j4 Z5 U+ [ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, x/ Q2 W, l! Z9 N EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ U* d3 f- ^$ j* ^8 u
EDMA3_DRV_Handle hEdma;
* \1 T; Y6 d: v6 j% p5 j) l: n uint32_t chId = 0;7 z, O6 _( Q4 y! T
uint32_t tcc = 0;
4 k+ T% U J, W1 C! L5 {1 ]: K9 Z, P/ } b* r/ \3 M9 a1 w3 U
print2arm("edma3 driver init...",0);- q' n& n9 E$ S; B" u
! C2 a; A9 o2 Z- Z hEdma = edma3init(0,&result);
4 v2 E l7 j$ T, J if(hEdma)
2 S. Y/ \6 Q! e8 X" p: d; s: `% I) U {
j; E( P: O0 l( X6 e print2arm("edma3init() Passed.",0);
8 l4 N( g$ P6 _0 O2 P' y }
8 Y. n- o- r1 k- f; Z else
+ ?2 m. J8 x; \& c" O6 N! v {# B4 u7 h+ v6 w& W6 T6 f
print2arm("edma3init() Failed.",0);6 H8 l/ k" A% n; B
}
) @3 K8 k g! ?+ \& @3 W 8 ~1 y' ~; r6 N6 H
if (result == EDMA3_DRV_SOK)
- r1 J7 c0 V# e2 _* [9 n {
* |" p6 U6 m0 ?2 @5 `- m1 c result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 c. e. Y7 B# [/ k# K (EDMA3_RM_EventQueue)0,
) u. G0 `1 Z; y- a9 h& V( A. b &edma3_isr, NULL);$ n) x7 f4 E8 I2 Z/ \5 |
}
. j. K2 C+ O; `
! Y& R$ Q, h$ O; S! S* b if(result == EDMA3_DRV_SOK)
- t5 {- a ]9 h7 G( [ {
N* y, q; s6 S; @4 B0 [" w" D paramSet.srcBIdx = 0;
' l/ k3 |# @. r& Y9 S paramSet.destBIdx = 1;! T) k( ~, W6 A8 ]3 R* [+ ~
paramSet.srcCIdx = 0;
" @; v/ F. p0 j( p paramSet.destCIdx = 0;) S0 Y7 ~! A8 z/ a
paramSet.aCnt = PING_PONG_ACNT;
- N- d& Z3 V! }2 \6 L% n paramSet.bCnt = PING_PONG_BCNT;
: e3 n8 J3 W5 v1 e paramSet.cCnt = PING_PONG_CCNT;
: U/ n( D+ |& z
- h( o5 g5 S1 Y# V8 m /* For AB-synchronized transfers, BCNTRLD is not used. */6 G8 n$ n$ v' w- f8 m( ?
paramSet.bCntReload = PING_PONG_BCNT;
7 c& ]& R8 Q; m2 u4 u4 o0 }; t! p9 g. v
/* Src in constant mode Dest in INCR modes */# K8 C7 E& x, s5 \9 b# R
paramSet.opt &= 0xFFFFFFFDu;
( I2 m r" M; l' F //paramSet.opt &= 0xFFFFFFFCu;
Q& e" X: }; s$ J+ ]- j" S. \ - [$ H- O, G& S5 ^9 [3 ]8 i5 ^
/* Program the TCC *// I; R, ^- j# p2 a
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 a+ T1 x: y/ b/ y# y7 a
( C$ p- R3 y1 I/ X6 y$ r {
/* Enable Intermediate & Final transfer completion interrupt */
- _ [1 A. x( d- ^: N paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 ~/ Q" a0 U+ u/ k paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
~5 A- ^. w9 M& _1 W+ N# H! a" |* I1 k+ `& P2 U6 f0 ?! _/ }
/* AB Sync Transfer Mode */
7 }7 \* k- ^1 a0 C paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 b' r! F( v8 l, G
. w- y- h' m- i; S5 G2 k, L) Q$ ] /* Program the source and dest addresses for master DMA channel */3 F7 W9 @7 p# V* W+ L& P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ E! S/ _% ` S' O# u/ p1 I
paramSet.destAddr = (uint32_t)(ping_buffer);
6 @- \: A5 G) @0 X9 B' o# A% w1 Q* @& U( G
/* Write to the master DMA channel first. */
0 g9 C4 s% g1 j9 Q result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; j/ w- |9 H0 I0 H7 m- B5 y a } / k3 C6 D( b3 j$ \
% t/ R5 {7 O5 k9 H/ V$ V7 k9 b result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& I- x& N4 N' l# Z( V" q- |# p
5 |) a, e2 {) A3 p# s0 N% |7 O if(result == EDMA3_DRV_SOK)
+ k; W O: @( p/ {, T: e1 a: ~ {6 V& @ t( {) v4 o3 I3 C% h
print2arm("edma3 driver init success.",0);
+ _7 ?( C) h2 l2 F5 H# [ }
3 [% w1 Z ^* | A" `4 L}( J. Q3 q5 C0 g" m" D* L! Q( x" x
/ G7 \' L2 ?* \2 _& h; u8 V4 a/ }7 |' F, N; Z# z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! d5 M" |) [. o/ D
; Y! |$ a. ?. {1 i) m# j/ S0 \6 } d
- \( w( ~4 D' g. S1 |0 f& I; | |
|