|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 n1 H0 q) a: ]8 q: B#define PING_PONG_ACNT 1
: G, _& `, U4 D Y#define PING_PONG_BCNT 8*32*40
3 V c, i3 n; t9 x* ]3 D2 z& D//#define PING_PONG_BCNT 1
8 [9 f; G5 i4 r" O5 { K#define PING_PONG_CCNT 1/ c C7 V" L+ A8 P/ W$ u, _( g: I
#define MCASP_BASEADDR 0x01D00000
# D, j9 c5 F7 ^& `% q- o! X: f#define Mcasp_RXEVENTQUE (0u)
. _( T: [2 `* R( O& Q* _6 L- D( ^8 D
/* OPT Field specific defines */
$ S8 S# e. x/ n c# A#define OPT_SYNCDIM_SHIFT (0x00000002u), X8 z' G% U6 v/ u
#define OPT_TCC_MASK (0x0003F000u)
+ @2 ^$ i }2 U, v#define OPT_TCC_SHIFT (0x0000000Cu)4 C- H. q3 b1 l$ U4 u$ t( p
#define OPT_ITCINTEN_SHIFT (0x00000015u)1 U9 p3 C+ ?/ q# O% _0 L
#define OPT_TCINTEN_SHIFT (0x00000014u)' W/ R0 r* s- t# t' R" x
& @3 W9 }: @. P9 z2 Wchar ping_buffer[PING_PONG_BCNT];4 @* l" z) P. |9 w2 Y
char pong_buffer[PING_PONG_BCNT];/ }! F, y" F6 O/ A* d
! t3 _ J& W# {& x' V. V
* w3 G$ n. V: q
8 k6 T. }7 z) q' ~ H9 c: C4 ` x4 i {) @* K
static void ys_edma3_init()
* P& x K! M# ~0 S A{
: R0 J0 @( Q4 I6 B3 h W EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% r* B/ d- f% W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' s k, ]4 J3 g+ k EDMA3_DRV_Handle hEdma;, m. C0 d* t" G' x$ v* h6 _/ J4 l3 Y
uint32_t chId = 0;
3 B1 g' s3 z' }; ~$ V) r2 G# E3 ^ uint32_t tcc = 0;0 Q1 I, E. p; h! x
0 L: a7 c9 m3 t( v: f+ [ w# n print2arm("edma3 driver init...",0);* ?# D) p0 X) l* V4 j# r
8 f+ Q( F, n0 S" b4 d6 g! v hEdma = edma3init(0,&result);9 ^% c7 E' N9 L& X
if(hEdma)
0 _- \, T8 v) x+ j) l/ q { D+ J8 Z& O/ F8 [
print2arm("edma3init() Passed.",0);
* z& g# g( O- b' S }
9 w9 j) J2 H# O( i) W F Z* o else6 Y( Z, m1 `+ C
{- t1 P- z" n0 }% r& a* Q4 u% R! v1 X
print2arm("edma3init() Failed.",0);8 Z* L6 m. r7 J/ |3 n$ p/ _
}# p' y) p# A1 G/ i- f! I
8 @7 _5 `; ]8 J3 Z4 A! d3 Z
if (result == EDMA3_DRV_SOK)
" `/ l" m, d8 r2 ~+ r {
# s7 I1 ^' s# q2 o1 q! p9 k result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( \$ a( X! V2 t. b" a
(EDMA3_RM_EventQueue)0, W" [6 [# X& L1 q+ g' P0 P' T l) S
&edma3_isr, NULL);* o* G" Z0 }2 D6 [3 r
}& W4 O, R1 a7 u( m
' @1 z/ k6 U+ C) N! d0 h5 b
if(result == EDMA3_DRV_SOK)! q @2 i% [! g1 k5 y+ W
{7 b# F' \ S. ]% D8 s) _
paramSet.srcBIdx = 0;
! k5 Y9 @* |* S; j$ G paramSet.destBIdx = 1;( Z/ g; [- g" t: C1 |/ b
paramSet.srcCIdx = 0;
# h( T' [# O) r R6 o, _ paramSet.destCIdx = 0;9 x H* T# G: k+ V% r
paramSet.aCnt = PING_PONG_ACNT;
* J) g+ g* i6 A, V/ T Y paramSet.bCnt = PING_PONG_BCNT;
I, b, G/ {4 c$ X/ d paramSet.cCnt = PING_PONG_CCNT;
2 M, H* c" f! Y" Q
( X4 ?4 j/ k7 w5 W# Y /* For AB-synchronized transfers, BCNTRLD is not used. */
* G- z" y. W$ r# Y$ o paramSet.bCntReload = PING_PONG_BCNT;2 b' m& _9 l- K. T& S" h
7 c0 ~7 \9 k* s* e0 j
/* Src in constant mode Dest in INCR modes */
! p0 [$ _1 k' L6 p paramSet.opt &= 0xFFFFFFFDu;. D4 W2 ?/ F* o
//paramSet.opt &= 0xFFFFFFFCu;
* L& q9 Z- U/ M, N' ~4 N) f$ p- K
' I# {- `& ]! I" j1 G /* Program the TCC */
! `8 T" D& H2 X F$ L paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) H' r2 o7 g+ W) M/ }9 u, f
+ ` {$ m+ N" O
/* Enable Intermediate & Final transfer completion interrupt */" j4 v5 D1 [! [' Y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);1 a1 S- t8 ?& F' C9 \' Z$ ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ ]2 B% |+ k, l/ x( Y1 m" G
6 `9 k( t! m2 R) s /* AB Sync Transfer Mode */, H3 X) T$ F0 R0 @+ F q3 _
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% Z$ F9 \; j) @" E1 z
% |. d0 J7 ]% U8 j& l, k /* Program the source and dest addresses for master DMA channel */1 j* t8 A- j8 u0 h7 O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# E5 O& @ O9 y8 W4 J paramSet.destAddr = (uint32_t)(ping_buffer);7 h' p0 v5 R7 I7 U( i) K% y
/ p$ y- ]! F9 l' p
/* Write to the master DMA channel first. */
' p. ^5 C# \% n. a4 R result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" S4 R' Y. k5 c5 z3 P% ^
}
5 T8 }) e: s0 s/ T- D
: Z C' u. c+ t3 \8 a: d { result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 F& Y- V# m( O/ H- O7 C4 m 7 p8 y2 u5 w6 L. c ?
if(result == EDMA3_DRV_SOK) ' q: U! ~0 B9 H
{
: I+ t, l( J; X2 Q6 g, `1 q/ c print2arm("edma3 driver init success.",0);
0 d3 [0 s. o6 r0 P |, a3 e$ A+ {. Z }
$ @0 k2 {! H/ O* B: E7 s9 L6 D}. E5 N" v( }7 h
0 Q3 E1 p& P4 J5 {3 N9 z$ l+ m, C! f! J! `3 ~8 z* X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 T' O: i6 E0 ^
7 m6 h8 Q8 J7 [+ G z5 Q
- ~ n' X. }/ q4 m! h# m |
|