|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 E1 `+ r: c P& @#define PING_PONG_ACNT 1
9 N: K, o3 k- t6 z2 J: z8 C#define PING_PONG_BCNT 8*32*40
& e0 \1 f3 O8 j6 C- P8 j6 j//#define PING_PONG_BCNT 1 * A+ O9 `- d+ ?* M# m$ k X3 w
#define PING_PONG_CCNT 12 }2 B- a" [+ m4 n
#define MCASP_BASEADDR 0x01D00000
, X# R, F# |; D; @$ f) {( x#define Mcasp_RXEVENTQUE (0u)
) A. q) E+ v' p" e3 ~& Z8 s
; E2 ~* P- J( r/* OPT Field specific defines */
/ Q) \3 Z4 d6 V1 d# ]#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ D; [3 F) W2 T" p/ o#define OPT_TCC_MASK (0x0003F000u)+ g' C) b! u- v) f! d
#define OPT_TCC_SHIFT (0x0000000Cu)/ b8 H3 W: Z5 _7 E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ G/ ~# _6 R' I3 u#define OPT_TCINTEN_SHIFT (0x00000014u)
( t" V7 p, [8 g. k9 ?4 L& H, [3 K" y1 ]3 _3 B7 i5 a
char ping_buffer[PING_PONG_BCNT];( ]+ \ S- A3 j$ w
char pong_buffer[PING_PONG_BCNT];
1 a8 I/ _7 p F. o0 ^6 V1 [( W1 y5 N5 K+ q( \$ i% }6 Q$ D" Z
4 p+ R. x; H2 l$ o; Y
. y% L$ n% @6 u b7 s) m9 q; e5 z2 t4 h/ s% S2 R- o5 O* v
static void ys_edma3_init()
7 _: Q" B( q! o8 q{( g; D$ w/ `6 k9 S- l- ~2 H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! h- H8 |2 Z* J% W% |4 D# ?4 [ EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 N" s# s& ^1 A" o# F1 r EDMA3_DRV_Handle hEdma;2 H- m% n9 J, q2 K. `6 Q4 h
uint32_t chId = 0; N% [& |, G) @3 t7 s& v; `. j, r
uint32_t tcc = 0;
8 r8 H2 P% O- K/ K9 \) [8 m4 W- r. W
print2arm("edma3 driver init...",0);
3 Y: _) O/ k' `) D6 L; x3 }6 }" _/ p
hEdma = edma3init(0,&result);
# `' `4 q. u) c8 E9 E/ b: N if(hEdma)
: F; g0 ~) N/ S" H3 U8 ?" p2 ]- s- p {
8 V- j6 m0 y+ s- S4 x print2arm("edma3init() Passed.",0);3 K* z7 q& B; J! d+ p1 Q# f
}
& U1 _, [' B3 g: P) L8 T else$ w* {, s0 ?1 f5 `- M4 `
{
9 C. Y9 ^) ^. A u6 v8 S print2arm("edma3init() Failed.",0);3 i: o4 `6 y) f
}
) ~3 x+ O, U0 ~3 o
5 a% h& I- g& `7 \# m$ M if (result == EDMA3_DRV_SOK)
: f. b; C( V7 p4 c E {4 q; m) f* e# j3 j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. N6 [* C6 s, _- A S2 a9 a (EDMA3_RM_EventQueue)0,
1 ]5 g; z* T0 [5 I q0 h &edma3_isr, NULL);( s" W4 d, M; Q
}! V1 ~! o" W; P0 a( V7 Z! E- I3 O9 V
- H4 V" d3 h! L: p$ d# k$ j+ u if(result == EDMA3_DRV_SOK)# o. v, v$ o! I- G
{
2 O! Z# t$ j5 ]/ X paramSet.srcBIdx = 0;1 O t/ X! Y6 g5 `8 U3 C9 D
paramSet.destBIdx = 1;
/ q0 U4 v8 w, L2 t$ F6 J, |/ u paramSet.srcCIdx = 0;/ Q; o3 e4 n& q8 R- n
paramSet.destCIdx = 0;
" ^+ D* X' c$ e# N, M7 v paramSet.aCnt = PING_PONG_ACNT;
1 w' p4 ~' S, M: Q paramSet.bCnt = PING_PONG_BCNT;, V( r! l3 I3 a$ V& ~
paramSet.cCnt = PING_PONG_CCNT;& H' o, m) I( P3 J* y, c) q* Y
6 f6 B* Y2 z1 j" P
/* For AB-synchronized transfers, BCNTRLD is not used. */) H0 d6 C) M% T G8 i
paramSet.bCntReload = PING_PONG_BCNT;( u0 k. t( y+ I% D: j3 N
! m+ W6 G: r5 H# a' ^( O /* Src in constant mode Dest in INCR modes *// ^1 i4 N& f9 J6 k( u/ O5 `
paramSet.opt &= 0xFFFFFFFDu;; J1 Y% j6 T l% M" z
//paramSet.opt &= 0xFFFFFFFCu;
# q7 B" e( O% L% Y/ b- H+ d; g. A
$ D8 J2 ~7 a! k& V+ V /* Program the TCC */
w4 j, P& H& M7 Q8 q- u, b paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 l( M9 P9 o3 a' B2 Q( F- T! n
' I) \; _; a: f" I' {( f/ p( z /* Enable Intermediate & Final transfer completion interrupt */
2 X0 N) a3 E! u/ A paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 `! O- q0 h* _9 J ^ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);3 M" N$ O$ X; p$ Y
5 ^0 Q7 U/ P& ~2 U) Z /* AB Sync Transfer Mode */7 }$ K! r& \0 X1 H8 ~! F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) F/ n! v) c, d5 o$ x
B! L' n0 ]7 G0 F9 ~5 [! m
/* Program the source and dest addresses for master DMA channel */
6 ?2 w, z8 D* ]& t' j- | paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);1 n4 O- J; j, @! w0 |
paramSet.destAddr = (uint32_t)(ping_buffer);
0 P& y/ @ [2 o. q' G$ y8 r7 I+ g& B) ]! Y* u
/* Write to the master DMA channel first. */* S5 z' b+ D6 @0 B& i4 M
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- Z" D& h$ @4 D# G2 e } " R T) C* P0 `8 r# ?
. T5 e# n; W6 I% i6 a4 m2 Y3 ^
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);4 z" }) w# N9 \7 Z
: Z& A! k' j" L: k( o3 e% n" \
if(result == EDMA3_DRV_SOK) 7 M& \ a! ?7 T1 d( O: V
{* Q' I9 D" D$ e
print2arm("edma3 driver init success.",0);
. x* t' Z8 O3 D5 f$ {# K }
& o# v8 _3 |3 l9 [) U}
8 ` I' u' \8 ^+ q
- l' y% ~9 H: w( `/ S( Y1 ?
9 x* g- b5 V2 vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% \$ L3 n. J) K: G* S! a
) l* z+ v% W3 T! S- C' R/ |3 q' E
|
|