|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( ^- S& y$ ?& h( G- s) x0 Y c8 n#define PING_PONG_ACNT 15 ]3 E, g6 z! E0 n
#define PING_PONG_BCNT 8*32*40
- y3 _# R) l* Z% P//#define PING_PONG_BCNT 1
2 Q$ ^/ @5 l) N R9 L/ I; }#define PING_PONG_CCNT 1
P- z" g) I0 w) Z% {+ z3 ]3 k G1 Y#define MCASP_BASEADDR 0x01D00000
" u8 A" n: Z3 O#define Mcasp_RXEVENTQUE (0u)
+ B3 ^. _/ H) h% p: R ~5 ^% y8 j7 N8 g; t
/* OPT Field specific defines */
" P6 h7 Q, ^$ E) H8 R6 i2 Q p#define OPT_SYNCDIM_SHIFT (0x00000002u)6 R' \/ j8 b* c$ j& X
#define OPT_TCC_MASK (0x0003F000u)
1 I4 j) z' F9 P+ }8 u6 R#define OPT_TCC_SHIFT (0x0000000Cu)
' y$ h, W- |4 u4 M+ L#define OPT_ITCINTEN_SHIFT (0x00000015u)' I5 g0 P) f% D; a7 L
#define OPT_TCINTEN_SHIFT (0x00000014u)
2 t/ h# \& x: y6 n/ C6 @2 K, O* A/ I, |- _. n
char ping_buffer[PING_PONG_BCNT];
/ q' c ~9 b; {& [; wchar pong_buffer[PING_PONG_BCNT];. Q0 x: k% w6 b! {
- k! V: e3 u. c0 ]3 u* ^; n# G
9 D. F. _7 v' ^/ h; K* m8 K
# p4 v/ y5 ]1 ]% x# h+ z
* L( d8 h1 k, j) ?3 Estatic void ys_edma3_init()
# i+ e1 x; W# d: ^{
. [& W! D2 W2 u0 s# v8 } EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};* Q2 K' m/ p! L( A" Q* P3 ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ V, {! {/ U+ h EDMA3_DRV_Handle hEdma;1 f6 ?; _) S% k( E" Q
uint32_t chId = 0;8 f0 d& _8 v$ C9 j) |+ ^+ x
uint32_t tcc = 0;
) n, h6 D9 T' Z+ A& Q: X* F: g( R7 `8 r# G
print2arm("edma3 driver init...",0);- h7 T$ s( \5 v3 x! _" V9 x
8 q$ Z- D" f7 N! w7 e, A$ [5 v
hEdma = edma3init(0,&result);$ n7 p; l$ y( B3 P4 Z* f' \; M1 L8 T9 U
if(hEdma)) p) x/ m/ @2 c( A J
{+ L# i8 n; U" m8 X1 U
print2arm("edma3init() Passed.",0);
# m1 f i7 H/ A9 k }
8 K; Q" a0 x& \9 j0 l! q* E$ p else
v3 i2 D( F- `6 N% Q) Z8 I4 p {
) _0 _1 v. `# C5 m print2arm("edma3init() Failed.",0);# A. B) W2 T2 C+ B
}; V) |: j& m- L) p2 o* Z- q' b
! f; ]2 T7 o0 A: ^1 h
if (result == EDMA3_DRV_SOK)) Z4 U- w4 ^3 {$ U
{" F. B* c" x: f( j" D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 H. i' p/ h; v1 U (EDMA3_RM_EventQueue)0,. q9 P5 v: U6 Z8 M$ a
&edma3_isr, NULL); J! ~/ V4 m" b, u }- o
}9 t4 m0 [4 y. j, l: ?5 L
: k) R# B* e4 l
if(result == EDMA3_DRV_SOK)
; r7 v1 B/ l- c E {# r) A' X: T6 X9 R
paramSet.srcBIdx = 0;& f* U2 T' }' ` d' x
paramSet.destBIdx = 1;3 ]" ^; [- z2 ]. W- P
paramSet.srcCIdx = 0;; |8 L3 H% `( v# _1 J/ D
paramSet.destCIdx = 0;) N8 a9 S7 F; H# _, {
paramSet.aCnt = PING_PONG_ACNT;. o' G" L6 s4 J- j8 \
paramSet.bCnt = PING_PONG_BCNT;+ i7 z+ E9 i7 m5 B7 n- [
paramSet.cCnt = PING_PONG_CCNT;
: H2 ]) g5 G) h( [ 4 U9 S( {0 s) J" l/ U/ J# z
/* For AB-synchronized transfers, BCNTRLD is not used. */ C2 m. p) i/ x, s2 }
paramSet.bCntReload = PING_PONG_BCNT;
1 K' `6 m6 X0 R: [! K; @
% @; c2 e: r- i- o1 N8 W5 V /* Src in constant mode Dest in INCR modes */8 t5 [0 \: B: f; v9 b$ ~- [# m
paramSet.opt &= 0xFFFFFFFDu;
2 {% w. E" W7 P9 Y; B) H //paramSet.opt &= 0xFFFFFFFCu;
. N8 T$ T( x& U: Y
5 F) {% U$ ]! T4 V H6 z' K3 W. r /* Program the TCC */4 x7 k/ X- ], v/ Y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); W; @( n* |" K+ S) I
, B, K" J2 `8 x6 j4 p; G /* Enable Intermediate & Final transfer completion interrupt */
( ?/ \3 B% A/ p$ b/ A paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 E& f+ d7 Q7 w' R paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- |; {6 F- s( X7 ^4 j
6 l9 u+ d3 G6 D. |( _( E% K% X /* AB Sync Transfer Mode */- I6 d; X# `/ X% [. e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ s( u9 A1 m$ k1 }$ Y - ~0 m2 l+ B- R7 K8 b" @
/* Program the source and dest addresses for master DMA channel */% }" R, I. t/ u
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 k) e% I; u) b" r) I( J) `. b( c l paramSet.destAddr = (uint32_t)(ping_buffer);
5 w) O: k% P/ ^) @( H. b# v; N6 g5 l8 ^6 W5 K6 Y
/* Write to the master DMA channel first. */7 ~, L2 e5 C& u! b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);8 S ^4 t/ m0 y8 V
}
# L2 _3 }- E8 V- g* V; R- v& X }2 \! L
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( R( n& v0 ^3 ]9 g * q5 E" P: R: A9 \& o3 F$ F7 G
if(result == EDMA3_DRV_SOK)
6 R# s) N2 k: `/ }9 N0 r {/ w! }9 F& l( K; R' ?( H+ l
print2arm("edma3 driver init success.",0);+ \2 c9 @2 B3 \4 r- ^" z
} 2 l- I2 B, ^$ f
}+ M4 W# Z" m" s4 p- u
/ {9 N+ T4 v9 O; h% `
, C; l& K2 ^2 v4 F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ \4 v6 r% [: e% g' u
& R- N2 l9 C) C$ Z2 J: i4 V9 x3 \, _( e w9 x6 B {1 q" V
|
|