|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:3 E0 Q P, X- j# J8 h& D3 V2 Z
#define PING_PONG_ACNT 1' o, }. l! m2 ]+ x6 O
#define PING_PONG_BCNT 8*32*40 * j8 s1 f# i/ }9 T) G0 L
//#define PING_PONG_BCNT 1 8 l2 h2 a0 Z( }9 a
#define PING_PONG_CCNT 1- m; @. F7 I6 s" i& L3 G6 u
#define MCASP_BASEADDR 0x01D000003 a7 q' `" H( `5 @
#define Mcasp_RXEVENTQUE (0u)
& R' r( @- L* j3 `3 l
{$ L7 D; @: d% r6 `: z- V! Q* y/* OPT Field specific defines */
9 n8 c" T1 `" J4 u. Z6 {#define OPT_SYNCDIM_SHIFT (0x00000002u)" }/ o. m0 O& I
#define OPT_TCC_MASK (0x0003F000u)6 e" L" Q6 C( v6 ]4 c; {8 a: l+ o* C
#define OPT_TCC_SHIFT (0x0000000Cu)
* o9 Y7 e* H- K# ~$ L#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ z2 w! N8 K) o#define OPT_TCINTEN_SHIFT (0x00000014u)+ W/ [1 P9 J1 R: Y/ x/ d
; ?+ W5 ]4 G/ n; e; w& J
char ping_buffer[PING_PONG_BCNT];' f9 w0 f* J0 w
char pong_buffer[PING_PONG_BCNT];6 B9 }- K3 L: T
: Y7 U: {' R8 T( t3 T2 L% q, a
; C5 e3 ~* x2 h# n' C* B+ }( }$ M I! W+ L" W$ M* i
4 T6 X& i* B8 d- [& ~! estatic void ys_edma3_init()9 ? P4 u: C' @7 {5 @' K& ?- L
{& F9 o4 g; `* H' V# h' H2 o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& w* ~& I1 h8 B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ L! X* a5 s6 o( p2 ?3 u EDMA3_DRV_Handle hEdma;) ?9 f' m) W: U5 f4 X" f* N
uint32_t chId = 0;
3 T' b: p1 g/ |! h4 w uint32_t tcc = 0; _- Q% K# s2 W2 V2 y1 C
$ {, i" o7 {8 ?/ D! b print2arm("edma3 driver init...",0);
! n4 _% _" X9 t- O; M
2 J( S' ^5 q5 ?/ E) { hEdma = edma3init(0,&result);
+ s2 W/ D0 Q/ k# q( y3 E if(hEdma)
; G. a o1 h3 N8 N/ M {- O0 a$ k6 ]- w" e3 k N) |
print2arm("edma3init() Passed.",0);
/ x' ]- A1 ]( t! d }
. t. W: U f4 P$ G# o( S8 @" j else. n9 [" I9 }4 e- \ s
{
9 o+ H* n* C1 l" Y" m! A- R print2arm("edma3init() Failed.",0);
y/ \8 G0 Q6 [$ k% e) @) C, K. d3 H }+ {7 V! }: u% T: M3 ^
* A1 f9 i: r. D9 q& p. o, q3 E if (result == EDMA3_DRV_SOK)
5 |2 ?# ~9 A# @# h% S" W {
" z) p( S/ {5 ]' A result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% Q/ Z/ F' A8 X( [& ?4 E% h' W
(EDMA3_RM_EventQueue)0,; a% b; o' L( T
&edma3_isr, NULL);
& o$ Q S+ L$ Q8 \ }
2 S; k) ]% N* o
. k& @/ ~$ H) v9 { if(result == EDMA3_DRV_SOK)! F! p) T& k% L4 f' ]
{
% a- w2 `; J. k5 @! F$ |9 h) H paramSet.srcBIdx = 0;
$ I5 X1 |5 r' M" v- K: i) A4 v/ J paramSet.destBIdx = 1;
" y" d7 ~" E7 j z+ k# d% `" d paramSet.srcCIdx = 0;
8 L4 ^% y- G, h2 W1 p" p0 r paramSet.destCIdx = 0;
+ b! a- b2 j: S% j8 [; b9 J) I4 L" F b paramSet.aCnt = PING_PONG_ACNT;7 b3 X7 h$ F+ N5 k( F% Y' d1 i0 X
paramSet.bCnt = PING_PONG_BCNT;5 W* W# S! e" u
paramSet.cCnt = PING_PONG_CCNT;
: \% o: J( u% W. h7 b6 |
% o/ Y V* \, O5 |6 Q* s/ ^ /* For AB-synchronized transfers, BCNTRLD is not used. */* O! f3 Z$ T3 v2 p( l
paramSet.bCntReload = PING_PONG_BCNT;4 H! b( ?" t! Y3 L9 E/ G, y( |
/ o+ ]5 W! u; f' J* N+ c* I. y /* Src in constant mode Dest in INCR modes */+ P: H5 M9 ]) D8 n( i& O6 W: n
paramSet.opt &= 0xFFFFFFFDu;; w5 e; M- g8 S+ \( ]
//paramSet.opt &= 0xFFFFFFFCu;: u; f3 r$ s2 ^1 h9 G0 @
d$ N: V3 ~2 J) j( `6 v
/* Program the TCC */1 ]7 X' E+ ~; I
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ u/ h- }2 V# n) M4 h5 h
+ N2 y+ M# Q4 @: X+ g /* Enable Intermediate & Final transfer completion interrupt */
9 Q v5 |+ g* U" I, Y paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" i n c) g3 [* ^- l) N7 d+ y paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 f6 L$ J- |8 e" G( d& \! e& m- `. Z. n7 D4 C1 \+ w) O% M, A: D1 D
/* AB Sync Transfer Mode */! ?3 X$ z6 }1 @1 G1 S* ^( \( m
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% Q, g3 k# j8 L* l $ f3 A4 o9 s) x# T
/* Program the source and dest addresses for master DMA channel */
/ J8 g3 ?0 P( Z7 ~ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);4 L- `% Y3 U2 _- r3 s$ f* u$ ~$ _8 A
paramSet.destAddr = (uint32_t)(ping_buffer);! H4 n+ Z! T3 Q) z5 t
2 F' c+ s" Z- w# K4 L /* Write to the master DMA channel first. */
) }/ x5 E; z: ^& s o result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 _% R" W: V% V } , ^* i7 A0 z5 \% ?" a7 l- b
( F. b- R* Y$ k# V" [: [ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ H: d" I2 _2 x $ v& H) n' L, z2 G- u, F( T6 H; T4 a
if(result == EDMA3_DRV_SOK)
% E8 s- M; D1 X1 U, f { H- R( X% h: ^, v1 P* h
print2arm("edma3 driver init success.",0);/ |4 m( q0 n7 ^; A
} & k$ I& X$ O5 _7 p
}
* G" _' P: A5 J5 ?# m; @2 x i1 E7 \6 N$ a& P
9 F* G( Q9 y; p) \" A$ c7 g
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% w }% Y- ^. d3 p$ {; e/ y# G4 b; W+ L0 O4 a8 B' C. B
4 @' s4 t6 z& g% E6 v
|
|