|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 c0 e( p; l9 \; ^7 P. g0 H; S#define PING_PONG_ACNT 1
* c5 D, m1 n+ V' P. H# G( \#define PING_PONG_BCNT 8*32*40 3 i* s; M d* z# u* ^; X4 d S
//#define PING_PONG_BCNT 1
& M' q9 N# m2 c2 ]#define PING_PONG_CCNT 1) Z" g5 i7 I5 Z0 b2 _/ H( M
#define MCASP_BASEADDR 0x01D00000
6 L# x; G, g1 o#define Mcasp_RXEVENTQUE (0u)
B* u% b& n2 c# M. ], Q9 X
% u1 P6 U, V! e5 V" g; \: O/ L/* OPT Field specific defines */
1 g4 E/ Q- H+ ^#define OPT_SYNCDIM_SHIFT (0x00000002u), s8 n; w3 v) V- f( Y2 x
#define OPT_TCC_MASK (0x0003F000u)" U2 D& l# I, {
#define OPT_TCC_SHIFT (0x0000000Cu)
1 ]- v0 G; l" C- a0 O; M0 c6 \#define OPT_ITCINTEN_SHIFT (0x00000015u)0 p) z4 t% V9 S7 H6 Y3 {
#define OPT_TCINTEN_SHIFT (0x00000014u)9 B* M8 ~1 y& D
- \7 i! ]" @* o# r; y
char ping_buffer[PING_PONG_BCNT];; R& J; f3 v) f& ?) B
char pong_buffer[PING_PONG_BCNT];
7 Z! } s' @0 a/ O4 j; w
+ C6 i' x# \; ^9 x$ j: g0 N( L6 g# p$ w( L7 h
! a4 A# ?, ^+ \) I3 Q( x: ?0 \$ c P2 ^6 p# x" L
static void ys_edma3_init()
6 x. D* B+ t8 B5 ]{7 ?( q2 Z. W' c8 `; d* x
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 ^1 p ^0 K: \* M0 n) j EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 ?2 o9 _3 J; q9 Z& e
EDMA3_DRV_Handle hEdma;: _8 @* T+ O5 P/ Z6 M7 I
uint32_t chId = 0;
% A) a6 {/ n6 t# [3 S uint32_t tcc = 0;
3 `6 Q) _. I- r/ _: n2 U
( b5 q! W7 A0 |) d/ ~3 @) ^ print2arm("edma3 driver init...",0);
' X" N6 y# m& }4 }) v4 s7 R/ e/ N
hEdma = edma3init(0,&result);
) x9 f9 V0 S P7 H2 ?' X9 c, V8 U if(hEdma)
$ _3 _/ m$ h; p5 O {
/ a/ E! v4 s$ k print2arm("edma3init() Passed.",0);
# K8 m. t, c* A9 [/ u" G: Q7 y }
; m7 b7 V0 X8 x( p0 o else6 J4 _0 B# F0 v% I' W
{( c. f5 U( t4 b9 i5 W* `. h
print2arm("edma3init() Failed.",0);2 Q, a* y2 I: R) T! T `- f
}
* c2 f! I) O; h. T, r 2 Z* C# j. m2 v
if (result == EDMA3_DRV_SOK)" p$ K3 N, l. |
{# d. c8 ]( k" a4 y' U; E- N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 H6 y9 }7 U+ L9 M" Z (EDMA3_RM_EventQueue)0,
8 a1 ^% `: p( z& F. y8 R4 u3 w &edma3_isr, NULL);
3 J2 ~9 `8 t7 B/ J' C% c4 [1 z }# p t2 p! u, Q9 K$ q) i3 b# M
9 \7 B+ @/ m9 x9 w9 V. _- ^5 E if(result == EDMA3_DRV_SOK)1 l t+ x. }/ {) n3 V: V7 x
{! F# s: T8 x* ~% b# v6 M
paramSet.srcBIdx = 0;/ D1 `9 G$ g1 ]- c+ Q0 g& p
paramSet.destBIdx = 1;# C/ j: x! n2 Z, x+ i, Y9 S! f0 E
paramSet.srcCIdx = 0;
& _. @0 ~2 k0 [% Z) s3 P paramSet.destCIdx = 0;
- M/ ^/ F2 X' C' B paramSet.aCnt = PING_PONG_ACNT;
3 P3 A X: ~/ N8 p k/ d! N paramSet.bCnt = PING_PONG_BCNT;- p. }$ L/ b5 ?
paramSet.cCnt = PING_PONG_CCNT;" K! ]2 I) I: B4 L, l1 M- Z# K
5 i# F3 B) U/ K9 O2 L6 h% @/ u /* For AB-synchronized transfers, BCNTRLD is not used. */& \8 k4 A1 b+ A
paramSet.bCntReload = PING_PONG_BCNT;
. |. {* u. n8 D6 U
( U9 G9 O5 m$ V# e; t /* Src in constant mode Dest in INCR modes */) f! _# ]% s3 A! _. Y& S
paramSet.opt &= 0xFFFFFFFDu;
: t2 R- L$ M2 z" G5 ? //paramSet.opt &= 0xFFFFFFFCu;
& Y. {# h0 Y9 S# S& I( T3 y5 [. p
5 e5 W0 P+ z5 _2 a /* Program the TCC */! L! w+ a3 G9 `8 q/ Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! v2 A6 E% a% f) y$ C
! {9 y- C v r& k4 c5 H /* Enable Intermediate & Final transfer completion interrupt */
' ^! a2 z: o- f% I. O2 Q6 x2 n paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
|8 J: C. f7 H: m; N% Y B paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' O* ~# u9 X! x) A# [9 C4 [6 }7 u" k% {
/* AB Sync Transfer Mode */% G4 o+ F5 i% B: q, ^' O, _- |
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( E" p' ]9 O D0 f" @0 H& P b
n- P g$ E$ O! h4 A2 E
/* Program the source and dest addresses for master DMA channel */$ E k/ b* V+ d# [# g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 U+ t0 }2 l F+ S' G paramSet.destAddr = (uint32_t)(ping_buffer);
( w( w! ]' [# A3 A: J; |
8 a" C1 e1 ]& I4 a" f' O /* Write to the master DMA channel first. */, z3 ~ V- `6 Z: n/ Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);! s3 K' ]9 ~4 o1 X% a/ k8 @
} ( h* f% l2 P: x' K" h% ~, \ n
; ]& t/ \ a: a6 o( v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, S5 u8 D4 S/ Q5 a5 P
* m. \8 c0 Q& B k, q+ e if(result == EDMA3_DRV_SOK)
3 y8 `, J+ a$ o3 u/ Z3 A1 Y {
: Y0 x# [: a6 q print2arm("edma3 driver init success.",0);# k3 ~ k" y- b0 H
}
% }# a: G, q% ~" l}
! [0 F3 Z1 d8 G& \8 m( S, D$ h% P
; ]+ f, U9 }- `5 a; c% U: ]# Q/ j4 W( F" Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 F0 v# D; \+ @9 X; g- ~$ S
9 Q. H2 G3 y" R8 }3 i
% S2 n7 K' w; v( k/ c. f9 {
|
|