|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, ]* S( T5 }8 P# P/ U& O6 |#define PING_PONG_ACNT 1' J# u+ L2 j- |+ ]2 x
#define PING_PONG_BCNT 8*32*40
9 ~ n/ x3 Z' d" Z3 ~# n0 D//#define PING_PONG_BCNT 1
" L5 p+ A: D& w! h#define PING_PONG_CCNT 15 k1 \/ ?* u, Y" G$ ~
#define MCASP_BASEADDR 0x01D00000, _3 N% B" z/ {. O7 F
#define Mcasp_RXEVENTQUE (0u)
) A2 p1 @* p- k- P& V
5 u0 ?2 x6 l4 ~1 _$ q! v/* OPT Field specific defines */
% O" h9 l1 @2 l/ c; Q# q* S* J#define OPT_SYNCDIM_SHIFT (0x00000002u)2 ?) B0 @, @% n% D
#define OPT_TCC_MASK (0x0003F000u)
% N w# d7 _: U' @8 ?6 w! V5 O. ^#define OPT_TCC_SHIFT (0x0000000Cu)
4 z% Y ^& h0 I" n#define OPT_ITCINTEN_SHIFT (0x00000015u)
: `/ A5 L$ N8 l7 ]( K; R4 k- U) l0 W#define OPT_TCINTEN_SHIFT (0x00000014u)) E% b% j1 X& l& [+ q4 z, R
7 r4 ~; x% O0 S( D0 z4 ]" {: q. b
char ping_buffer[PING_PONG_BCNT];" Y# g% L' r; N! a' o: P) B
char pong_buffer[PING_PONG_BCNT];4 q" k9 K4 [* t3 O9 x+ E! z" O
: Q7 b# q- _! z
7 L) |) s4 ^$ F) a1 W: P0 S+ J' e
. N/ m" B. c0 Z: |" s) c+ V" }! N) C9 a9 g0 q$ Y# ]% c$ d
static void ys_edma3_init(). n1 h; Y! B/ o
{
0 a2 V! M$ K6 X6 s M; a EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* w8 o6 O; W% f+ P EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 M& n4 L4 @0 i# s0 U9 e
EDMA3_DRV_Handle hEdma;0 ]7 ^0 {9 Y2 X) a
uint32_t chId = 0;* d) o; m2 l3 H/ K. h9 g
uint32_t tcc = 0;1 f1 X, z4 t" J1 p. ]$ a
/ l* z) N" H H print2arm("edma3 driver init...",0);
5 s9 P5 U4 o: z7 Z6 \1 o% U+ u/ [+ M
hEdma = edma3init(0,&result);% O5 l6 A, a0 w/ I! a7 j1 d- i
if(hEdma)# P+ F& T- m# o+ k) X+ X
{0 I3 g2 S+ W1 H1 K4 P
print2arm("edma3init() Passed.",0);
8 A) u6 [; _. ~4 u/ m0 W" _ O& o }+ Z0 P# G* |' C% I$ y
else- r& R; k, `! P- @# A& A7 v+ M2 i
{
2 r+ K* [9 v5 a/ o* b& X P print2arm("edma3init() Failed.",0);
: d. t8 k$ L' J; s9 ?" K }
: r" H5 |& j5 a. J# h . b; T; a( d4 y; i. a' Y$ Q0 z! Y* d
if (result == EDMA3_DRV_SOK)8 c3 f" b# V' n( {
{
3 J% y" b( s( c- p- d result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 X |) L: h) N7 [; m) R1 J1 O
(EDMA3_RM_EventQueue)0,
: p" S: C8 `) J8 w% R: g' p& U1 m &edma3_isr, NULL);
; `. n$ \7 W4 v) ^9 L& y }
' {4 z; S1 Y* N' b % g* N+ s" f A# X7 _# l
if(result == EDMA3_DRV_SOK)- n0 o2 d1 @$ L, b) J0 E
{
# O5 S! Q1 o% C( d& a* L paramSet.srcBIdx = 0;
& l3 Q% ~& ]! T- O* j) E2 T paramSet.destBIdx = 1;
9 d" P, ^3 x0 ?' \9 T. m' g' D paramSet.srcCIdx = 0;
1 Y) q1 f. L$ Z paramSet.destCIdx = 0;
* c L1 g- a, A paramSet.aCnt = PING_PONG_ACNT;
0 _$ x6 ]' a% d( G1 W6 ? paramSet.bCnt = PING_PONG_BCNT;
- M7 B8 W' X* N1 S1 N& H paramSet.cCnt = PING_PONG_CCNT;3 @* `3 X. [5 K3 M* w! g
* x+ e: r! ?3 R$ r4 V
/* For AB-synchronized transfers, BCNTRLD is not used. */
' D5 M( {% q/ y1 v( T9 c paramSet.bCntReload = PING_PONG_BCNT;$ D& O5 R# e: b
/ e" l0 D+ K8 |# B- j- J
/* Src in constant mode Dest in INCR modes */# k+ R, A4 G4 K3 O4 u8 w
paramSet.opt &= 0xFFFFFFFDu;
( v5 T' a' P6 D1 h //paramSet.opt &= 0xFFFFFFFCu;
; v r8 x- ^8 i; C4 T
( W4 s/ b: A1 X' m. T% p /* Program the TCC */
: \ }# f5 R2 F# \& I paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);6 h" B G- m/ ]9 e0 [) |" F
' u8 W9 F# O" K% u$ E /* Enable Intermediate & Final transfer completion interrupt */* _+ ]" L$ ~- G# X* H" S8 Y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. t4 t [( n7 h2 P& s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& I7 m2 b$ r5 m: {6 a9 i; P: W$ \1 o& n( J1 [: R, q. x
/* AB Sync Transfer Mode */
$ E. a8 l( M5 a& @& V/ `4 V paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 z1 a! T9 D9 E$ [& f: p/ V( l
& @/ F4 T5 U6 y! S- a8 ~( r5 Z /* Program the source and dest addresses for master DMA channel */
: |( H/ |. t, h! h8 i9 g: d paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 u1 @& x1 {* _- z/ _" ~6 E paramSet.destAddr = (uint32_t)(ping_buffer);
; T# r9 P: ]0 w1 b3 y
5 C4 f$ W. l$ M w2 |: W% f /* Write to the master DMA channel first. */
0 h% _) ]: I5 L$ z4 G$ c0 X7 N result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ n. C$ R3 }. `: @ }
6 N+ r/ f2 ^- h" M+ l
! h# B6 o1 I3 B8 ?' o result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); N- M5 ]% o! M4 n& t# j
6 Y4 U8 q% v8 M3 J: u5 i2 M6 O
if(result == EDMA3_DRV_SOK) 6 k3 w1 Q6 }* z( w5 n3 A9 G
{
' p% }& ]4 b3 T7 }* y. H print2arm("edma3 driver init success.",0);
( v! X, e! o8 d2 `1 O: D }
( U \3 c2 S% B4 @. l}
5 M1 F9 ]1 ?8 K/ x& a- v1 M
+ I; `) V% `$ U7 t0 c9 Y: M
. W% Q% e' {$ n8 P! n' bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 O$ q8 u% ]' m! J, E, g/ o. e5 m$ U0 L' @, s
) Z C: X* t' H( W$ \' }
|
|