|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 o- Y) D" k8 M; g' i* h+ z
#define PING_PONG_ACNT 1
; X9 } x. w" a2 a8 J3 m#define PING_PONG_BCNT 8*32*40 7 E% d' H7 n3 P1 p
//#define PING_PONG_BCNT 1 + A5 Z# ?( f0 k! N5 Y* S; I# \
#define PING_PONG_CCNT 1
R& T( L, Z7 h) {& F+ J8 U#define MCASP_BASEADDR 0x01D00000/ r, d/ w+ k6 D% I' F* [; D' ]+ B
#define Mcasp_RXEVENTQUE (0u)6 g' l/ q% @! z. r% T; |
8 G# U( K0 }) a K% ]$ l/* OPT Field specific defines */
( Y8 M0 i9 q8 N, Q; K#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 R! y1 h+ Z5 p* K }#define OPT_TCC_MASK (0x0003F000u)% Q7 [% R: ]+ n! [- p: f; M
#define OPT_TCC_SHIFT (0x0000000Cu)
; b5 x9 f+ F! q. P) J! a3 V#define OPT_ITCINTEN_SHIFT (0x00000015u)
- U" Q U5 O4 e7 M- E5 E0 n; N8 H8 ~#define OPT_TCINTEN_SHIFT (0x00000014u)
$ k% `+ |2 g& H4 S; Z4 w$ T4 r3 v
char ping_buffer[PING_PONG_BCNT];
- J0 ~8 u8 r3 V+ `* G' o! {char pong_buffer[PING_PONG_BCNT];/ o* X6 q( `4 ]+ \2 V4 k
Q+ u8 ~& h4 ^0 S" M& G! y7 a) I
( t' U0 V. r% g/ z1 @
2 u( ^. U J. l, N
7 M( W4 Q& U6 Q, i* M8 ?
static void ys_edma3_init()
1 s' X5 }: e. o; k$ X{2 R" I4 J5 A$ N% Q$ F( @; d k
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 V7 i* h# d, ^" o. ~
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# A, ?8 C5 T" N% H$ c EDMA3_DRV_Handle hEdma;' B1 S% \! V! `! s: o: W
uint32_t chId = 0;
: x ?3 _" c3 }! v- A uint32_t tcc = 0;
2 N4 R, M' {" L" \# p( a5 J+ o; e. k# x; z
print2arm("edma3 driver init...",0);
& y/ v4 {2 W- W" d' N5 z. h; }
9 t% N6 C) A" l' w hEdma = edma3init(0,&result);
3 V) p6 `+ L' G' [ if(hEdma). I7 |4 \/ M2 P1 Y& Y
{, v* o3 b6 n# L6 F) n/ z
print2arm("edma3init() Passed.",0);
9 l) T! u4 | J8 r6 }0 O I }
) J i4 G$ V) ?: c else7 t) w+ J. ]1 b0 O: {# @
{
7 \* Z3 I( v* N8 s3 _% v2 O print2arm("edma3init() Failed.",0); U3 O. k( i0 A& A
}
) c" u/ M2 u9 a& a6 g! E
5 L# Y$ h" P2 _! _8 k) r( o if (result == EDMA3_DRV_SOK)
" b5 X4 h, h* X9 g {
. \! O i: X. t7 }+ w9 p( P result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 N& n w! v1 A' T, O
(EDMA3_RM_EventQueue)0,
, L7 A( m; v4 X7 {0 r &edma3_isr, NULL);5 A2 @; x7 d# z- [
}
4 m* G& V' \* K' _/ [4 v
9 n9 G: P3 S& C/ l% ?2 t# T) T if(result == EDMA3_DRV_SOK)2 [. A+ K e, j7 H2 B- M$ L
{0 Q; F$ Y3 Z6 v+ Z9 C
paramSet.srcBIdx = 0;2 b3 n- R& I$ T, H
paramSet.destBIdx = 1;
; c7 b- z5 _$ n9 f+ ~. \5 U& i paramSet.srcCIdx = 0;
; c9 C8 V4 C- x/ |& F9 E8 M f paramSet.destCIdx = 0;
7 `& {' [9 S6 R. [6 J6 K7 S8 s paramSet.aCnt = PING_PONG_ACNT;
2 Q6 z' L1 c9 G( I paramSet.bCnt = PING_PONG_BCNT;
6 U! _( B4 @7 ?$ k) s F$ q paramSet.cCnt = PING_PONG_CCNT;
- y) o2 Q2 `$ r3 n5 _ # D; H0 n; P. k- {+ t! D3 i7 k
/* For AB-synchronized transfers, BCNTRLD is not used. */- p4 ` \; p% ?' L! p' K
paramSet.bCntReload = PING_PONG_BCNT;
6 C, N; g, T; |) Z' e& n$ r' X) ], R$ L4 o
/* Src in constant mode Dest in INCR modes */
- w& ]4 w( W6 J paramSet.opt &= 0xFFFFFFFDu;
/ `$ L1 W7 L: a; z8 ? //paramSet.opt &= 0xFFFFFFFCu;8 l M8 [* A3 n' D- A! X
; z' _, m( |; {7 T$ E; W3 B /* Program the TCC */
4 M% M4 E% X* E paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 Q8 x" R! _5 s1 p1 Y
$ t) {5 X/ F" N* ^7 G' v /* Enable Intermediate & Final transfer completion interrupt *// |' P' z: ~5 a$ i. ?+ O, Y/ v& j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) \) S3 h; P1 g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 q; ]7 h) L$ S6 O. Y# u6 c% r
: J: U& v" N4 D /* AB Sync Transfer Mode */5 U: j1 H& ~ _
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 c# ?* n5 l% @* N; N V + t; ~! z/ W# q
/* Program the source and dest addresses for master DMA channel */0 M- z4 k* i* y ~- L6 P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);- `+ `+ P$ \& |" A) E
paramSet.destAddr = (uint32_t)(ping_buffer);" a' |( H/ Z1 |9 b. Q- z: o
- h- @" a% z) `/ R
/* Write to the master DMA channel first. */- G3 l8 s, O0 `- }1 y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) f0 J! y# z$ Y } 1 z4 ?- Q1 n: j& |
, x* ]6 X0 \3 | result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
C7 X9 s7 }5 d/ r& I" q9 P 4 n0 V" @3 u$ o/ y% A" H
if(result == EDMA3_DRV_SOK)
. `" L# Y( W# e8 X, U; P3 p" A {
7 m8 q& E. d1 z/ K/ N7 I print2arm("edma3 driver init success.",0);; n c8 v I3 ~& i8 h' i
}
0 x. e" i: ?1 U4 n6 S) e}: [% ]2 k- T0 l0 v: ]
6 T1 R$ t6 N1 O, ]0 T' N
* f" Z! }% A/ d, e0 H S, h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" e3 X: u) Z7 \' l5 o5 F) T
" y. v* G# o# I" \
' Q; Z: j8 e8 ]1 Y3 L |
|