|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: {& T8 j' B$ r4 [; u6 s#define PING_PONG_ACNT 1
! b: q4 A2 a7 p! b% g8 R8 _#define PING_PONG_BCNT 8*32*40
) ?' m% m7 j1 J# @8 p//#define PING_PONG_BCNT 1
6 n. f8 S I( z8 `5 U3 k6 |; V#define PING_PONG_CCNT 11 t9 j1 w% }/ b& m& |; j
#define MCASP_BASEADDR 0x01D000000 O3 {1 \( Q! b1 o/ J( j! P
#define Mcasp_RXEVENTQUE (0u)
1 c1 S7 I0 U* x" S7 D+ ]
5 ?& a) Y- u, ?" `2 Y( y/* OPT Field specific defines */
7 x' s) s" O* L& U b: _#define OPT_SYNCDIM_SHIFT (0x00000002u)9 b7 V7 J9 O( ^! R& Z% ^8 ?7 b! Y
#define OPT_TCC_MASK (0x0003F000u)
3 c2 l7 G$ f9 S# }#define OPT_TCC_SHIFT (0x0000000Cu)
9 A0 |. _4 `$ O5 w. T#define OPT_ITCINTEN_SHIFT (0x00000015u)1 O* Z) `1 M% u8 @$ X
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ t5 v2 ~4 _% d" Y5 p# p8 s0 B: j8 C7 j, I
char ping_buffer[PING_PONG_BCNT];
$ ~, v/ ]0 g! Q3 z# u4 S+ Achar pong_buffer[PING_PONG_BCNT];
: y2 h9 {8 o! u5 G
7 R* R/ {. N+ e9 l+ r
; s1 U* o: a$ R( e% D9 k7 W; J3 @- p) q. o2 w
; f" S9 E6 A: n. I( P S9 dstatic void ys_edma3_init()
! t/ y3 @) `9 z$ ~4 u8 L' o{6 u, ^: F5 v p7 x; D0 a* G5 q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) C1 r6 _+ l3 B6 R9 q6 I. _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;! i `2 ^- ` Q! ?. Q
EDMA3_DRV_Handle hEdma;
7 L8 ]4 t! \" d. g uint32_t chId = 0;4 V' ?6 E8 T( i, w
uint32_t tcc = 0;- G4 G# o7 `1 P- |/ O' f7 r$ P
' j! ?9 n' a' w! Q- M
print2arm("edma3 driver init...",0);3 [+ Q0 E6 l l5 ^
+ ]$ _" ]" H0 W0 _ w. I/ p
hEdma = edma3init(0,&result);
) T, @! a- L+ R6 w9 f% b1 N; _ if(hEdma)
6 E, F+ ^( v+ o3 I) i7 z& {/ u {
, z) z9 m3 ~9 N# ^8 O+ D print2arm("edma3init() Passed.",0);
: @ b6 R+ B( C }) }: v; I( l) v, A* s* Z/ g$ }' L
else
0 y! G$ D' j/ [* S* q j# T; V {! R' e6 ~5 ~7 V
print2arm("edma3init() Failed.",0);
8 {7 V9 d$ I3 k5 A }
7 W/ ]# F* @8 r3 ?5 @. A4 _9 _ 1 U' y: K) d. U. @- i
if (result == EDMA3_DRV_SOK)! v) L& d: R$ Y% _. _4 R+ o
{
& R1 h& [- f+ b8 g1 c$ O$ f% g result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 o! q) h* P$ ~0 x% P
(EDMA3_RM_EventQueue)0,
5 P, G& t. b# ~ c; [ &edma3_isr, NULL);5 _) D6 b1 b' W( W% a8 v0 V7 H1 g
}
9 X5 j. h% F% { u. j* m
3 U, d3 |& X$ T4 |) Q if(result == EDMA3_DRV_SOK)
3 k: n: Z# o4 k- L# e5 Y4 s1 g {
- K3 V0 L. m$ ]2 C paramSet.srcBIdx = 0;4 @: F& R' s, s- C+ L# V
paramSet.destBIdx = 1;+ A( E' P4 }) w! y+ i
paramSet.srcCIdx = 0;& V3 J8 {* I: _& ]" L! H' C0 D# [* v" G
paramSet.destCIdx = 0;
" i) P; V9 a- e& E" o( C$ r paramSet.aCnt = PING_PONG_ACNT;
" m8 `5 D9 m) L9 ?1 N paramSet.bCnt = PING_PONG_BCNT;
2 t- l# C! d+ H* B% u: G U2 t% y3 p) k paramSet.cCnt = PING_PONG_CCNT;
- B& y9 b7 f$ s9 h/ P* m4 X . l7 L1 f5 @& Q
/* For AB-synchronized transfers, BCNTRLD is not used. */; G9 d& `8 Q: b" U. Q* b9 o- K
paramSet.bCntReload = PING_PONG_BCNT;
7 n6 X1 c& d1 V: F) F! m: f8 t( o1 a* g4 r4 v ]- N8 [
/* Src in constant mode Dest in INCR modes */
( v) I1 |( S' B4 j! U! K$ K% y* x paramSet.opt &= 0xFFFFFFFDu;) u; q5 M. {+ }4 b
//paramSet.opt &= 0xFFFFFFFCu;
+ r8 O; u& e* a+ ?; [( D 3 b; e9 Z( p, |+ f
/* Program the TCC */1 }* J, H% M' D7 c7 b+ T' r( V- @( P" a
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) `$ v9 |5 A! k! l I
3 k) b$ s* ^# t& a
/* Enable Intermediate & Final transfer completion interrupt */
% b+ L: ^) v& d- A/ V3 w1 x paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" {9 p- \7 V7 V6 E8 n; w) p
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 Z7 I* e1 L# b; ~- G9 S4 _
7 C, t _; ~. p
/* AB Sync Transfer Mode */
$ N3 M3 |+ @( S+ L: L paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: e+ r. l# ?, ^1 M& ?1 e5 w
" i1 T+ Z( ^6 f+ U /* Program the source and dest addresses for master DMA channel */
# ^6 b9 z6 a1 [& V9 q5 q$ r/ I; r paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ T- _& @2 l0 @+ X; c
paramSet.destAddr = (uint32_t)(ping_buffer);
9 v6 ?- F; n8 H! g0 e+ B; z8 g) f2 L1 c2 m, |" S! {6 K- R
/* Write to the master DMA channel first. */
7 Q- @/ o, E* V( M; t+ G result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);) f8 I* f/ n9 J: I8 M" `
}
! J1 B2 P7 o0 j6 S5 e9 ~
6 o9 h I; O( l9 v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: l e: a- Q+ B6 a; t
m0 |5 `- M4 S5 @ if(result == EDMA3_DRV_SOK) 7 u3 ^) i' J3 D6 M& Y
{4 E: U. k! ]$ U: P% k2 O( f! }& o" z
print2arm("edma3 driver init success.",0);! k$ p% w( {/ `/ O9 J0 d
}
T% ^7 \+ A9 n& |. o- o4 a) L}
- D- K" ^1 i1 J g
& ?- y* X" `1 v8 }) j% I
# A" c/ b i3 jEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# E0 P2 M( g. Q! x2 b7 Q* G+ C# }7 O# M# q3 w3 M1 `# w) H% P6 b+ N/ ^
" J* L6 W1 l; G/ o1 ?; K
|
|