|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" A$ F' h6 Z7 z; }( b9 M6 _1 {#define PING_PONG_ACNT 18 t6 T5 k" ?% H1 H$ [! S7 p8 a
#define PING_PONG_BCNT 8*32*40 ) [5 \ w3 m1 Y+ {# I) y( |
//#define PING_PONG_BCNT 1 7 Q9 U" v; U, L0 Q8 i9 l% N$ H
#define PING_PONG_CCNT 1% H( T7 t7 a/ Z; n& j
#define MCASP_BASEADDR 0x01D00000
7 R" g3 w2 [2 b0 O2 C#define Mcasp_RXEVENTQUE (0u)# g Z2 t( R* L* m! K9 F$ L! [
$ \4 I, N5 o. }, ?# H s/* OPT Field specific defines */7 V: D1 ?: u7 m
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. |* O( r5 e1 J% r#define OPT_TCC_MASK (0x0003F000u)
( X. B g( H8 }' z/ G8 ]#define OPT_TCC_SHIFT (0x0000000Cu); R( L$ k5 J. f, o( ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% `9 w6 w1 r4 [#define OPT_TCINTEN_SHIFT (0x00000014u)# }7 {, l; e) L" [
# s# o, O- F" F* O
char ping_buffer[PING_PONG_BCNT]; X$ @8 `( a2 ^3 g( U
char pong_buffer[PING_PONG_BCNT];* h0 s1 f7 n, r, \: _! e
5 Z3 s, W/ Z8 o
" I" f8 O/ i- @' V% T3 @& ^4 ^& e2 ^, U, X! g# E: N
/ y8 z' y9 r. B/ ?
static void ys_edma3_init()! [ k+ x. m, X9 Z. H3 O2 d: \0 [
{
$ ~2 V R1 g2 O- c5 V7 w5 ^" [ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! `) T2 {6 h4 F2 ~4 a EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 I, a2 }( G( d: I
EDMA3_DRV_Handle hEdma;2 b# A1 W W% a
uint32_t chId = 0;
1 ?, C6 D+ H. |5 F+ H uint32_t tcc = 0;0 Y0 E6 {/ b. J7 e8 N2 E
# \- h# @2 E& ]" i7 q& y3 o print2arm("edma3 driver init...",0);( H& ?/ {, w4 v+ S' ~- _* T5 {
0 i9 W' c) @' p) @% j+ ~ hEdma = edma3init(0,&result);9 Z/ g$ C' d8 f1 k
if(hEdma)' U2 }. M% z* E6 _8 N2 a- B
{
* R+ |' t! D2 E# K0 K0 K; x print2arm("edma3init() Passed.",0);9 g3 s4 h9 D, u+ [5 y" {0 S% X
}* F3 s0 A# o9 }' ? S+ d ?
else- m) R0 X! y5 j) L
{
, @; J. C9 ?+ |$ v& }& t6 X6 v print2arm("edma3init() Failed.",0);* U! y& y- L0 P3 l
}
1 h0 i& ?" t3 _ 2 v" h( `! n, p$ n& p
if (result == EDMA3_DRV_SOK)
. A" Z: K" r0 b0 `, O# H {( B* @$ P7 x: }+ S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: _( c" ]- {' L& U1 P (EDMA3_RM_EventQueue)0,& _3 u4 u0 W8 v+ Z' N$ y' r5 J- V
&edma3_isr, NULL);
; d8 a! c) F$ P" N3 D+ X# W, \3 `7 ? }( _7 B% ^; Y5 z, y: Z2 W) m: H6 x
+ F- H% E" @. z if(result == EDMA3_DRV_SOK)
# ]* D/ b3 E" S2 L+ p" ~ {8 {- x+ u8 H x% M% A
paramSet.srcBIdx = 0;: y# m# J0 F7 \
paramSet.destBIdx = 1;
6 U% H3 h/ Q# [% e+ Y7 ~. n: } paramSet.srcCIdx = 0;
, P8 Q$ l1 r$ C paramSet.destCIdx = 0;
4 u8 T7 u; o: h; s3 \) ` paramSet.aCnt = PING_PONG_ACNT;
6 V7 c1 V: x0 P" B0 F: b5 [9 V* O, z paramSet.bCnt = PING_PONG_BCNT;" Y! t5 E, z* }; J5 g* j
paramSet.cCnt = PING_PONG_CCNT;/ z- g# E6 `! y3 G
7 ~: D3 b; g1 M3 O+ v& E0 V /* For AB-synchronized transfers, BCNTRLD is not used. */& Q8 ~6 s8 p& L$ T* r& f6 C
paramSet.bCntReload = PING_PONG_BCNT;
* j2 Q4 m2 t0 c0 I! K5 [/ Z. [/ J' L2 Y, T
/* Src in constant mode Dest in INCR modes */
9 I5 G' x) Z! ~ paramSet.opt &= 0xFFFFFFFDu;* Y5 y; H* g0 l& Q9 F. L# R
//paramSet.opt &= 0xFFFFFFFCu;- v2 k" B6 _3 Y6 C9 m
4 @3 `, Y' O' a$ q% k+ U
/* Program the TCC */
3 q* z1 R, n0 k0 b paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 b# A1 l- S' l) m, s) u
/ l8 |* G! t, m8 M: I /* Enable Intermediate & Final transfer completion interrupt */
0 X1 c' M8 [, } L- e paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" ^& d# ^) F1 S- [% w8 m
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& \+ M E2 X& [7 S, \
9 l% l; @) J2 w6 g( z /* AB Sync Transfer Mode */+ @" d: R; g/ b' e" R# [1 ^
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 D# H/ W1 f! g- Y7 f& c
$ g+ R0 j* r/ T$ p /* Program the source and dest addresses for master DMA channel */
* Y5 _1 {* q# V$ n8 ~& i paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);* D( Y" v- p: I- e4 F$ r8 i" a
paramSet.destAddr = (uint32_t)(ping_buffer);. D; l1 n# M4 x: F; r$ I
, R1 d4 C- F$ X7 ?0 @7 _ /* Write to the master DMA channel first. */
' A; T# U- P0 ]5 E0 L result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 @2 p) x0 U1 `/ T# Y. ^ }
! ~+ F- k0 X$ m
5 p( ^7 z3 P6 N ? result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- M* E- D) E& j4 Q# r! H! B6 @
- a u# t6 Y1 c1 \) W7 f8 K if(result == EDMA3_DRV_SOK) * n& p! E! ^# `2 p; w6 m
{$ U4 D! T2 t& j! c2 B' ~" u, V
print2arm("edma3 driver init success.",0);
& y( S5 X1 D0 S' J: ]2 W }
3 X2 R2 D7 f% |# C1 N4 V}
9 t5 k9 K/ g( H( b s
5 r% F2 {. p. J, K# ~1 Y5 n9 l C2 `# n a, r9 t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# j% o: x; @* z
' B$ m+ ^: m G7 o! v) i$ |) L( |8 l0 C$ d
|
|