|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* G8 `! r0 N5 O- Q( T" ^9 M#define PING_PONG_ACNT 1
1 y0 ?( D5 N- U! t( U+ U#define PING_PONG_BCNT 8*32*40
7 c$ j; J- i5 G//#define PING_PONG_BCNT 1 0 k6 r4 z# Y, V# ~5 R. |4 b
#define PING_PONG_CCNT 1
5 p2 d6 \5 h; d3 E" j8 _#define MCASP_BASEADDR 0x01D000004 b7 h: Y( z; o# W# V# W P
#define Mcasp_RXEVENTQUE (0u)
! B3 t0 u, |' F3 [) |/ ~( W& Q/ ~
7 c/ J) w" i0 H& ~/* OPT Field specific defines */
- I0 D% X& Z# Z4 h#define OPT_SYNCDIM_SHIFT (0x00000002u)
( @% Y% {. w. _) M# ~7 X#define OPT_TCC_MASK (0x0003F000u)
" Q# i5 F! m; U* g7 [3 g#define OPT_TCC_SHIFT (0x0000000Cu)
( V/ k. Z, q4 `! O" `" }#define OPT_ITCINTEN_SHIFT (0x00000015u)0 N, s9 n* b( E
#define OPT_TCINTEN_SHIFT (0x00000014u)3 Y+ @% X/ e- t8 |1 _, S" g
1 j, t- M; ?! C/ ?, B, a9 o/ A
char ping_buffer[PING_PONG_BCNT];
# b, T; Z* }2 schar pong_buffer[PING_PONG_BCNT];
3 R* j& y+ }3 I$ `( p$ z7 y
: B5 i' l2 t$ l( P. C/ M6 @9 Q; I! z1 @+ D& h
' D: P7 F" w+ R2 q# M
: }5 Z- B+ o' t+ D% |static void ys_edma3_init(): e1 D T9 a0 N; A) l; ?
{+ ^ q: ~ p5 @# e/ L i6 p
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; c/ @! k1 G5 T s8 v8 c# x EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 y5 ?# @ _. T3 p% M EDMA3_DRV_Handle hEdma;; G1 V' c- J9 c
uint32_t chId = 0;
" _6 E' r! J2 p: V# s1 x uint32_t tcc = 0;
' F8 v# k' u7 A8 k
( C3 e9 m) p5 q6 V8 c% B print2arm("edma3 driver init...",0);
1 Z. @7 F, n& t, F" k2 m
- m+ Z. E7 R' ^8 M9 a hEdma = edma3init(0,&result);$ ~! _ B L( R2 G
if(hEdma)
" {! g5 G3 A# B8 t {, ~) x a4 S, T' y
print2arm("edma3init() Passed.",0);
6 ?' W# j4 C4 j. z- h- K% t0 p }/ R/ c$ q, b( W( R y
else
2 }9 l' s% U) v3 y- p {
* S1 ^# |6 U6 c8 O, ^7 X$ w print2arm("edma3init() Failed.",0);
! t$ c2 v. S* i6 {$ J, r }
" a8 m+ e* {. o9 @% H5 C6 S + X# ]/ Z# J& I: A" p
if (result == EDMA3_DRV_SOK)3 n4 u; M) B% r' O/ |1 V/ |- |
{( _( {8 @9 h' q7 j0 Y% X; M1 B$ a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, O. v2 D( w% e" a ~: x
(EDMA3_RM_EventQueue)0,! ~, I6 q- M. R% T
&edma3_isr, NULL);
# m* {3 }% P9 Z8 ?) ?0 h9 }; h) | }8 w$ s" X- v3 Q' Y0 y5 J5 M8 P; S
6 p* L3 G) l9 A7 C1 o1 Y0 P' b
if(result == EDMA3_DRV_SOK)
, q0 n4 C" P6 G, B3 l {! _2 U; b* x# u7 E7 ~3 _$ A% _6 d
paramSet.srcBIdx = 0;* _+ W$ V, ^8 w( S6 ~/ s: z& z
paramSet.destBIdx = 1; T9 L9 B3 G- ~- z* e
paramSet.srcCIdx = 0;
' i) Q6 n: l2 g% B paramSet.destCIdx = 0;
" b/ i% ?7 l; P3 P paramSet.aCnt = PING_PONG_ACNT;
2 A# P0 J! f; M) R paramSet.bCnt = PING_PONG_BCNT;# i" u3 A% B9 c, `8 E R) J
paramSet.cCnt = PING_PONG_CCNT;
# I8 G4 C4 n: ~ u% v7 n . t" \; `+ g& u6 p7 e
/* For AB-synchronized transfers, BCNTRLD is not used. */
T& D5 V9 _# X3 G# S% c paramSet.bCntReload = PING_PONG_BCNT;5 B3 _5 w5 w; \
% X6 S' A, ?1 i! e# I* W) U
/* Src in constant mode Dest in INCR modes */" L. p, L# {! q
paramSet.opt &= 0xFFFFFFFDu;
# b; b1 s: O7 ?3 ]+ m //paramSet.opt &= 0xFFFFFFFCu;
4 _) j# ?! S- e4 @3 ? 1 n* {. }) J* s
/* Program the TCC */
f, \8 q+ \3 `' I paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 H4 C9 Q3 ?) f$ G7 `# X
& @0 j% g+ [) X /* Enable Intermediate & Final transfer completion interrupt */
2 S! j& e7 j& p9 X9 X paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# D3 {: Z- Q& U% i- l( U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' L1 k- x) D# h6 Z- a. C: u( a! u- b: \+ w: s3 D# B# ]# h0 w
/* AB Sync Transfer Mode */
?, |+ J' n z4 ^; D paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# g* s w% [1 g% `' e* g) [
0 o3 p/ k4 b) m3 Z /* Program the source and dest addresses for master DMA channel */
! ^+ P/ H6 z* r+ d1 Y# V paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; c6 b _! Y& V- W5 n paramSet.destAddr = (uint32_t)(ping_buffer);' i) s0 E, q9 i6 b3 A0 }/ T6 k/ W
, d" ^) x* r# c/ m
/* Write to the master DMA channel first. */" o+ M7 Z& Q3 P# J, T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& \: q; m3 {9 {" P1 P }
0 V# I# y0 P; Q$ X
4 X4 a2 v$ @4 g6 K! A. S result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 y! J# O% s5 d8 Q
8 ~+ R) a2 _- O5 ?8 E% R+ T if(result == EDMA3_DRV_SOK) 5 r4 j( Y( h1 o) ^6 [
{ Z2 p9 I' r+ t# [
print2arm("edma3 driver init success.",0);' L: d' F- ?- c/ y! u( r' J9 i
}
v, V( M/ g R3 B0 W8 ?} B% M3 f: m4 x- C
+ d j, D4 f( P
: w- Z6 m1 W& |$ p/ H8 tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# d" Y2 H9 d6 U5 _; r
6 T# D! H5 y4 n3 Y2 h# m/ \7 I
# \5 y- e. y( y" E |
|