|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:) r* r( Y% {* g$ s
#define PING_PONG_ACNT 11 o* @4 M* a% @# Q; t+ e
#define PING_PONG_BCNT 8*32*40
$ P4 u# f% B* z3 L0 q+ d//#define PING_PONG_BCNT 1
/ u% v6 g1 U+ y, A0 ^( B#define PING_PONG_CCNT 1
B- K4 R% c( N0 v& R#define MCASP_BASEADDR 0x01D00000
# z& \8 D( L+ K5 @$ w! v f#define Mcasp_RXEVENTQUE (0u)8 X( {6 |1 H/ i* b7 C0 U7 Q0 z
d. I) n# ~+ F; G
/* OPT Field specific defines */0 p5 R) J* M$ j# d* _, x
#define OPT_SYNCDIM_SHIFT (0x00000002u)
v. w/ O: T2 p q0 |( E2 d#define OPT_TCC_MASK (0x0003F000u)3 e+ h9 c3 H4 E- w
#define OPT_TCC_SHIFT (0x0000000Cu)
6 D6 ^3 g. @( R; c, y- M#define OPT_ITCINTEN_SHIFT (0x00000015u)0 s/ X4 T% I2 \. b4 ]7 ?
#define OPT_TCINTEN_SHIFT (0x00000014u)# Q* z, x. y; `$ S8 r& p
7 D1 Y+ U& b L: _; h1 b" q$ k
char ping_buffer[PING_PONG_BCNT];
5 i f: g: `$ _char pong_buffer[PING_PONG_BCNT];
8 ? Y$ V) \ _: a! {1 v% W6 Y- T( A" |4 l$ w5 f
) h' y2 e* G: y. {6 t
. V- A( N1 r1 x" o
/ B; f( B2 I3 a) V/ ostatic void ys_edma3_init()
$ O% `! \ Z) e{: a! Y$ a) X4 H) W2 Z& p Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ N3 f/ v% W& g/ h1 Q( c EDMA3_DRV_Result result = EDMA3_DRV_SOK;* D( w- t1 E3 {4 j; ~/ ^2 ]9 z4 C
EDMA3_DRV_Handle hEdma;8 z. J/ [' L* V* L
uint32_t chId = 0;
7 r4 ~* S5 Y" p uint32_t tcc = 0;3 g- i( |. h* Q$ ]; b
e o2 d: U! z% f print2arm("edma3 driver init...",0);
6 {0 O. {1 c* e0 J( \( D# I1 \4 ?
; D" J' l( w. e g hEdma = edma3init(0,&result);9 m! \5 [2 `6 L: [3 \
if(hEdma)
, ]! q# q, j# D2 E. o {
3 _: n: N L% O print2arm("edma3init() Passed.",0);
. |9 ]2 m; G0 x7 t }
" r- } Y. E) j2 E3 g; ?0 Y else
2 K1 L8 s. b# V! s, a- ~2 s. | {
' D* E$ y: N2 R5 J. } print2arm("edma3init() Failed.",0);9 O, V! {! i! V
}; b7 R7 L: P, q* ^
: |' b& u F1 I' P- N8 [, F( v- j; F if (result == EDMA3_DRV_SOK)
8 r( v$ ]8 v6 O, r, } {& S w _" q3 j5 j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. @% x3 d: r# V9 O
(EDMA3_RM_EventQueue)0,2 y5 v( c% E- C( t
&edma3_isr, NULL);
+ B' b1 @, \ g8 S3 z1 D+ @7 C }: W- O1 m& W! i' \0 C$ w
" j* B8 B4 ]8 ~ _! s2 y: z' { if(result == EDMA3_DRV_SOK)
4 A2 x1 }! D* r {! ^2 G/ @/ E+ c# f) h; T2 W; W
paramSet.srcBIdx = 0;- L& m/ K3 _) k* K1 Z
paramSet.destBIdx = 1;
+ | X$ b) f$ n4 [$ d0 S$ t4 Z0 u* y paramSet.srcCIdx = 0;0 p" a* ~8 j9 V1 P+ { u, ^ Z
paramSet.destCIdx = 0;0 x7 X, M' u. O
paramSet.aCnt = PING_PONG_ACNT;
. m7 y' f( J' _$ s0 l paramSet.bCnt = PING_PONG_BCNT;
2 A4 J: e! q6 k$ }2 P$ P paramSet.cCnt = PING_PONG_CCNT;
- Q- K8 f: }5 z) t" m; v! i * S: a! y: V( T* y
/* For AB-synchronized transfers, BCNTRLD is not used. */ L, C. ^2 }1 X( I
paramSet.bCntReload = PING_PONG_BCNT;% n- _+ ]0 g! N3 ?
J/ e; T2 E2 @5 }, j
/* Src in constant mode Dest in INCR modes */1 E9 B$ g$ u1 T
paramSet.opt &= 0xFFFFFFFDu;2 s& g. G& [0 E ^8 g
//paramSet.opt &= 0xFFFFFFFCu;
2 g$ D) d# G2 H- b3 W
4 S3 r( b$ t( T e8 r /* Program the TCC */
! D/ a+ p. _0 f# L% n5 A, V paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# z* E6 ]( S" w. Z& e, I7 X) _; ]2 @% c9 E
/* Enable Intermediate & Final transfer completion interrupt */6 n7 L4 z! A3 q q |$ c2 s& ~
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" }2 _, W/ L6 F/ C; V o, k paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# y* `$ e- B6 }$ M8 b, b, J0 s
, v4 p7 B2 x- Y) g /* AB Sync Transfer Mode */
7 d; f+ x8 B+ G; x% b paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 X7 ]5 m! ]" W ) z g' s3 b: p4 d5 Z
/* Program the source and dest addresses for master DMA channel */! ?- J0 d! a, V- U/ C* B5 Y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);. ~: x! F5 O' P$ Z6 U8 A
paramSet.destAddr = (uint32_t)(ping_buffer);) K' F: x) T v$ d7 I- u5 j
7 |; b% |, c d5 q1 _
/* Write to the master DMA channel first. */
N5 u1 D1 G: c. C, A& ~& g result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);4 X" ~2 y" C, r3 F8 R
}
& l0 Q) P8 f2 j ~) p$ E5 s- M8 i9 X( B# P/ M$ H
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! c: D2 @7 S7 v; r" V3 e 9 X3 C6 J1 _ T
if(result == EDMA3_DRV_SOK) ' g" E5 N6 Y8 q0 m
{
/ @+ L0 [" m4 O$ `4 I& C* B print2arm("edma3 driver init success.",0);$ x4 G! t+ p" I. t
} * e/ E9 w0 l# u/ v' _9 h' `
}
; B2 f @2 h* T0 C4 B( ?
( L* d& ^9 ^4 R0 h
4 G* d3 v) p; t. Y6 IEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! J: P3 s1 a( R% U3 ?; F8 w5 m+ {& c, q- I9 _, e
, F4 g+ c' w& e( N" G2 z |
|