|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% t! z' m( I8 L5 |
#define PING_PONG_ACNT 1& c- L5 K, T6 n3 V: `# O9 g% K
#define PING_PONG_BCNT 8*32*40
: Z E- e% T$ H$ p0 B//#define PING_PONG_BCNT 1
# r/ ^5 i5 u7 V6 U. V#define PING_PONG_CCNT 1
3 z+ ?5 D0 m7 c& \1 k- G#define MCASP_BASEADDR 0x01D00000
3 y+ I9 A9 E! s0 D1 g6 w8 ^#define Mcasp_RXEVENTQUE (0u)) A$ O; ~+ [9 P: _" W. _
9 _5 h, ~6 p6 }* f/* OPT Field specific defines */
! X5 B `5 I& a, ~0 C5 h#define OPT_SYNCDIM_SHIFT (0x00000002u). r' P% l3 C4 r z; F
#define OPT_TCC_MASK (0x0003F000u)
* H# R; ~# k/ @1 X. B#define OPT_TCC_SHIFT (0x0000000Cu)" J2 S( O# U! K9 ]% J$ E
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 j* S! ~/ l$ V# E7 C2 m#define OPT_TCINTEN_SHIFT (0x00000014u)) _+ W7 m! F0 V9 F
# ^& g) U8 G* b, b
char ping_buffer[PING_PONG_BCNT];
" u0 R% K( c. N( M3 ^0 d0 zchar pong_buffer[PING_PONG_BCNT];" _/ x3 J; N4 |" X% N- x1 G
8 o( d/ L( U; ~, {2 A8 u' _
. s1 \% s3 Y# T3 M- t( h
/ S: p4 ^) d4 T5 [5 C
' d9 V5 \; a% W( p$ \; estatic void ys_edma3_init()
9 U8 T( d1 \* T% o# J @, m) T{
8 u3 u# a! v+ C1 i4 y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 G' C. c. ^: C8 E( s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 d- M- m7 h1 O( ^! O7 B3 s, q EDMA3_DRV_Handle hEdma; e* }3 j5 D9 A4 l
uint32_t chId = 0;
( f* d9 Q0 Q& c. Y1 n0 O) o uint32_t tcc = 0;
+ _& _, R2 i9 u1 ?$ `2 [9 B
% A1 H" C7 o: ?7 N# S print2arm("edma3 driver init...",0);+ Y' x& s. Z( n% m1 z" f M* q
. B; D5 ?! S. i8 C hEdma = edma3init(0,&result);' }. k5 Y9 m- m8 J2 Z) j. E
if(hEdma)
* [. K- E5 H+ R {
3 A. d# `2 R8 x4 [9 w* G print2arm("edma3init() Passed.",0);6 I( K% n' p# n: p" U9 {# }
}
" Q" F J/ { {! [9 F else
' Z& s }7 c( w4 o; k8 H; \ {
. N9 G/ i0 I0 c/ b9 ` print2arm("edma3init() Failed.",0);
3 [2 J5 r% M+ v# ?$ y4 c }9 D& E8 ?3 A. P, P4 |
2 N# g( Y& X3 i# t' n if (result == EDMA3_DRV_SOK)+ N2 ?/ O3 ^* x; u6 \9 y
{2 m8 H% U8 j+ Z: |# u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 J* C! G- D i (EDMA3_RM_EventQueue)0,
, s% {0 K6 \- O &edma3_isr, NULL);% d0 x9 |- J( E- u: b! L1 q
}
) {2 e* G5 t! I5 ^' E2 |" T$ _. W : }( P1 e; U" V" u
if(result == EDMA3_DRV_SOK)
# C8 I# m" }3 c: z( h {3 p% o0 x. G6 P
paramSet.srcBIdx = 0;
- \8 |2 K' t. c+ g$ A paramSet.destBIdx = 1;
6 a, J2 l& t' d" s6 l" h paramSet.srcCIdx = 0;# f0 m' |2 Q/ |1 c3 B8 F& M3 I
paramSet.destCIdx = 0;
5 z$ {6 t- h) v6 D8 } paramSet.aCnt = PING_PONG_ACNT;) S) x9 @) B8 }4 K, L! z
paramSet.bCnt = PING_PONG_BCNT;. @0 W, X* R& G9 N
paramSet.cCnt = PING_PONG_CCNT;2 \( z+ O4 `/ M2 S( K% @. p5 i+ G
+ S8 @) `2 n9 K" N; P- e. u /* For AB-synchronized transfers, BCNTRLD is not used. */
6 K; x) W* T; g4 Y+ n paramSet.bCntReload = PING_PONG_BCNT;( o% F5 B& s3 [" `; F& N; s& i
$ L1 s, E' Z7 i' Z4 o- M, d; M
/* Src in constant mode Dest in INCR modes */
1 k% i: @; C7 {1 B& Z paramSet.opt &= 0xFFFFFFFDu;
C+ O8 H: B" N //paramSet.opt &= 0xFFFFFFFCu;: d. d a( D s& f( f6 y4 l
: D9 f3 w! z/ W6 J/ ]" p. f. o /* Program the TCC */
6 v3 u8 f; {$ S# Z) W4 N paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 Z T6 X' u4 d3 v% H: z( M
' A3 n0 [5 T. P# u3 w- T5 m7 \ /* Enable Intermediate & Final transfer completion interrupt *// ~2 k: A8 M, a1 z# J) r" r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 s( s) A, \# p( @9 X; d$ _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& \) ~2 P1 ]% p4 ^+ _; g
' q2 ^) C. O; l# ^2 r /* AB Sync Transfer Mode */
7 y9 b8 ^7 B1 n8 u6 U9 e( N% |: Y2 z paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" m. A9 @6 Q7 J5 M' t
% i7 h5 V- P- ]+ E' k4 J
/* Program the source and dest addresses for master DMA channel */
: G7 {1 {0 l. z* `8 S0 e; p( s2 G paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 w* y9 |& [ l4 q; e1 R paramSet.destAddr = (uint32_t)(ping_buffer);& \3 Q: r' O' c4 c. x9 ~
* J* Q" L8 G& }8 D' q" _1 \% |
/* Write to the master DMA channel first. */
" A! D: ~$ M& m* f/ J+ w0 W result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); S7 g- W5 u3 B- B0 l8 V
} 4 s3 {; z$ N6 o+ x7 ~. w
5 X1 a g- w7 o. h2 \: X: a4 A4 B# ^
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. ~" ~* C0 F) c
7 ~" ^; W1 R# `6 a9 K$ H if(result == EDMA3_DRV_SOK)
( E- n8 P; Q- _4 H5 T {- `1 J! n, i) y) |6 V4 ~/ l
print2arm("edma3 driver init success.",0);5 S, D. v& A7 X5 K! t& P
} % r% A; ^) Q. o0 Q: h" s
}
) z/ W* ^5 C1 ?. g* |, i5 m8 q7 E* R6 D
$ c' Q' E4 C: E1 TEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& P* w' W4 W. L! i: P* U# b* }( v& P3 A# L& ?3 v7 ^7 `
. K, K! ?1 t$ l$ |, m |
|