|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# t+ D6 l% L5 c c( q4 P( q
#define PING_PONG_ACNT 1+ A% ]. `) T) v' d+ F
#define PING_PONG_BCNT 8*32*40
+ ]/ W! ]* _2 A# E: Q/ c! e//#define PING_PONG_BCNT 1 5 n4 f+ F8 M; ?+ l$ w4 ^0 K9 H
#define PING_PONG_CCNT 10 v# C$ A4 S) w$ O3 W, e
#define MCASP_BASEADDR 0x01D000007 u' R# b# b3 x5 Y, P- b
#define Mcasp_RXEVENTQUE (0u)
' ?# t, v W* t: J, F" L& b0 n8 [& Q( K0 D* G* p8 t
/* OPT Field specific defines */9 `4 Q' F1 O8 H
#define OPT_SYNCDIM_SHIFT (0x00000002u)! H0 k2 d% D1 H a
#define OPT_TCC_MASK (0x0003F000u)
3 V9 \% j6 @2 E: U#define OPT_TCC_SHIFT (0x0000000Cu)
0 n* y" O% c- x9 k; M#define OPT_ITCINTEN_SHIFT (0x00000015u)
# h: c) j/ j- G% n' y' Y# m7 w6 e3 `#define OPT_TCINTEN_SHIFT (0x00000014u)
- ^' d4 K t' D3 x& b7 C- A% E. p9 A# D: X
char ping_buffer[PING_PONG_BCNT];1 @# e' W( ~* Y5 s8 ?) e+ Z7 r* z
char pong_buffer[PING_PONG_BCNT];! N" S l2 a, H& @; \/ g( I
& U2 h3 b& N; q' ^
# | `/ P$ S; l/ w: W. D# K s' \$ Q- l' D9 b S
% `" m3 M# M% @" j5 j. ]
static void ys_edma3_init()
U" j: Q& c4 Q{
. Y0 L v, o- m7 F( X" P% ]; ~ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# r4 D$ R' b1 j ?$ q( J" Y EDMA3_DRV_Result result = EDMA3_DRV_SOK; t" S# P0 a) |. D9 m8 z. H
EDMA3_DRV_Handle hEdma;
5 v/ N& i$ ~8 W uint32_t chId = 0;" j/ Y, V' {3 \# Z" H0 \
uint32_t tcc = 0;
2 F7 b3 Q1 u- W
$ o0 I; e. E4 N* I print2arm("edma3 driver init...",0);( t+ V' g' b- J0 l
9 s0 n% D* j5 \8 J* k- {7 o0 I: c hEdma = edma3init(0,&result);
7 Y/ s8 Y; j5 b+ _2 ]. I9 f: r if(hEdma)
, @3 u+ R. J& N& d4 o {
, L3 `6 \5 g9 e$ }" u. s print2arm("edma3init() Passed.",0);
3 Y% Q( a. h& D1 C& s }: O) X- i' t6 Q' l* y, y- t
else
, q; F! b1 L4 }7 @7 A" k( I$ o* v {, X8 G7 t5 z: z. B2 P$ b) O
print2arm("edma3init() Failed.",0);) k9 z, }% k( b- a
}6 g1 n1 [; r+ Y+ p- K, G7 |2 ]7 a
- D! j. J2 y- O* v n& h) C1 Y if (result == EDMA3_DRV_SOK)4 y6 }7 \5 n- O! L3 q
{
+ I4 P1 i0 a( Z0 M result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 |/ w2 B' k1 a [9 y (EDMA3_RM_EventQueue)0,
8 ^% E$ ^4 L' O# w J &edma3_isr, NULL);$ ]' x5 w+ [( r; p
}
- T" k* r( m8 m4 {/ r% B# z6 q
: e* j5 {* |( p0 Z- J if(result == EDMA3_DRV_SOK)+ h' e" ^. q3 p) s' R& F$ {6 u. f
{7 X) d5 ^! z6 R, n7 z( [
paramSet.srcBIdx = 0;2 X7 K; T! f9 I% K" o! C
paramSet.destBIdx = 1;* q3 {. T- u0 ?& U3 E
paramSet.srcCIdx = 0;$ _ _. H7 @- N5 T& q' V
paramSet.destCIdx = 0;
* Q$ f1 O8 ?5 r paramSet.aCnt = PING_PONG_ACNT;
8 t, o u% E2 A& L+ d paramSet.bCnt = PING_PONG_BCNT;
$ a4 O& P0 s" [5 S+ m# ` paramSet.cCnt = PING_PONG_CCNT;
6 L- [! A) Z- Q5 u" r 0 l; c$ F7 z5 C, E1 \1 n6 R. c% M6 Y
/* For AB-synchronized transfers, BCNTRLD is not used. */9 |6 \. p5 e1 g5 X0 _6 |
paramSet.bCntReload = PING_PONG_BCNT;% d% w# ^; h8 n# e( v
) o( m. |% X, e9 L, \4 G /* Src in constant mode Dest in INCR modes */
6 K/ U v: O& N4 D paramSet.opt &= 0xFFFFFFFDu;5 j- f" o/ b7 X9 K9 u% _ F
//paramSet.opt &= 0xFFFFFFFCu;
' E9 G. v0 B' x9 @; a7 a - M7 @/ S# n+ h% P, B, f/ g
/* Program the TCC */ Z' \# M4 z6 d% ^0 L, k) L* `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' p `. d8 ]2 P( Y+ Q8 X, O, K+ R7 d' g# X% q* F7 t& U) N
/* Enable Intermediate & Final transfer completion interrupt */2 P1 E- U: s! `) Y d: _* D, z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# {1 T3 N: A$ h o+ n, S paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# ?9 w) s/ Y0 l5 d9 G: j8 c
/ r/ J4 v8 K2 h, D+ f7 Q7 l
/* AB Sync Transfer Mode */- t% c* [ r7 b) t( ~$ Q. f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 N" f% y* u, w6 s+ ]) N+ `) C
" p c. z& d3 z# D/ j /* Program the source and dest addresses for master DMA channel */8 B8 A. K# l0 p s1 s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, |8 O# P: Z( f, m- ]* ?& \ paramSet.destAddr = (uint32_t)(ping_buffer);& j0 [. k! @2 X+ ]
/ k$ t3 c: ^: z
/* Write to the master DMA channel first. */
' E$ z. U9 X% o* ~4 x4 i result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; n, I! H" u. K' O: j& p }
. W% N- k1 l% E5 m
* ?: ^2 o/ p' _- n9 n result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 N% Y. X; T9 b( l) u : n2 p8 z ~# v
if(result == EDMA3_DRV_SOK)
# d" j) A& A& T" f {
& V- @; Z: Q3 F% o5 C+ K! z print2arm("edma3 driver init success.",0);
* \) j1 v' D0 R+ R2 K }
: B) P, e8 ~5 H}
1 T7 S u% q$ J0 X
& m# }* Q, Z9 V/ }" a% b2 L0 H! _, m* V* X, l+ X$ K o" k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# G- }6 e! V+ Y* c( o1 K
' y2 ?1 q6 I# e- y" k
9 c8 Y3 Q3 e7 z+ W |
|