|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: P- a8 `+ _% w) Z' Z
#define PING_PONG_ACNT 1$ g6 h- z, B; k* @. e2 q1 b) }
#define PING_PONG_BCNT 8*32*40
- s2 w1 V+ k$ s//#define PING_PONG_BCNT 1
2 A# `, \3 t4 y2 O' r#define PING_PONG_CCNT 13 B. U; P* v! R3 L) R
#define MCASP_BASEADDR 0x01D000006 W. y/ k4 T/ j/ T
#define Mcasp_RXEVENTQUE (0u)
) n9 [" X2 |9 A( @- {# j; S* \ }- A) c/ i; |+ A) F, X" C
/* OPT Field specific defines *// G j3 i/ \ Y
#define OPT_SYNCDIM_SHIFT (0x00000002u)$ u2 J3 `7 x) T6 ?% U& b: B
#define OPT_TCC_MASK (0x0003F000u)6 x1 B9 \% M/ {1 L. ^( E J
#define OPT_TCC_SHIFT (0x0000000Cu)
' X4 `4 M- T8 p) T# X#define OPT_ITCINTEN_SHIFT (0x00000015u)
) w2 {, p- y" {& X/ D& K2 @5 K#define OPT_TCINTEN_SHIFT (0x00000014u)
9 M9 _6 a4 B1 n1 t( `+ x8 B$ O3 F% @( V9 @9 M* C9 ^
char ping_buffer[PING_PONG_BCNT];$ C8 n3 u) Z* B4 y% m5 h }% M
char pong_buffer[PING_PONG_BCNT];8 _+ d3 Z3 ~0 B( v0 r( [
" b3 T$ e' N2 T" M' Y5 k2 N
E+ q0 `: S$ X9 \
. f W! `8 @. o4 V" k& n# R) w
; b0 H8 z3 K7 U O" a( q
static void ys_edma3_init()
0 B; r. k7 n/ C{# T" Z4 U- c/ o T" `/ W9 ?" R& e/ E
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; s7 F5 [9 |7 L* \ EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# N$ R8 v7 T! I- K# D8 t: i EDMA3_DRV_Handle hEdma;
/ E7 N* L- m- V' L# H uint32_t chId = 0;% o' f3 {- F# [: c+ u/ H
uint32_t tcc = 0;
% \4 z7 V3 I2 E2 |6 _9 U; t6 k6 y
print2arm("edma3 driver init...",0);) }' u$ C0 ^9 p2 [
# H7 ~0 x: W7 g' u6 O3 B5 K" e/ d% P
hEdma = edma3init(0,&result);
/ a2 Z* l# @/ V6 G if(hEdma)9 c/ F% V6 z h- s1 y, c# `
{
- y' n+ w# a+ i( b! O print2arm("edma3init() Passed.",0);: R0 `2 r) F% G; `& Y, D' _
}
8 z3 @5 X4 t& l else% h# j, q( U2 [" y: p! |7 y0 h2 g
{0 v* y# A6 o( E/ _% E
print2arm("edma3init() Failed.",0);+ E5 M) Q3 E7 l
}
& D0 A& G1 C3 H+ X. j7 n
3 U1 q( H: H _' L' J2 ]& w& t: ?$ z if (result == EDMA3_DRV_SOK)- F2 ?' ]3 X: c7 q9 V: K
{
" G+ {/ X2 y' a. ? result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! S. T: J& D# Y+ X4 Z5 u) H% p" m (EDMA3_RM_EventQueue)0,
3 Y* W% Y& @4 Z# X/ G" X7 V$ [ &edma3_isr, NULL);
1 v% ^! ~1 G Z% q& q- Q }
* A* }. V5 o8 A! R: B
. s2 Y8 H4 A3 @1 P if(result == EDMA3_DRV_SOK)
- }; j5 z" |2 V" \, g6 }6 Y {
7 M9 B9 N: F) p4 s a5 Y paramSet.srcBIdx = 0;
" [0 h/ B" \. b5 f4 F; u! z1 Y paramSet.destBIdx = 1;" H; |$ v8 O8 K3 }+ P3 a& }
paramSet.srcCIdx = 0;/ C( @# O. l7 f3 U! M+ D X
paramSet.destCIdx = 0;: k( Z2 a3 t) F! p3 v1 K; E9 a! d
paramSet.aCnt = PING_PONG_ACNT;
: N3 ]; Q/ K! P paramSet.bCnt = PING_PONG_BCNT;
4 b8 t' e) C1 S' N paramSet.cCnt = PING_PONG_CCNT;7 Y% X7 ~! Y( s# W, H2 g, [: _
* d( q+ y7 M( t s /* For AB-synchronized transfers, BCNTRLD is not used. */ ^2 C( b3 ~! a1 u4 ^, A$ @
paramSet.bCntReload = PING_PONG_BCNT;. v4 Y) S6 H5 ~9 ^
/ Y9 v0 \ A* S" u
/* Src in constant mode Dest in INCR modes */$ `* L: R5 s/ M0 ?- S
paramSet.opt &= 0xFFFFFFFDu;$ z. A- y2 S9 \4 [, z$ q( N( m6 t8 J
//paramSet.opt &= 0xFFFFFFFCu;: m4 H9 |0 x& @5 c0 ~
7 x0 j# X$ N1 e) R& m2 A /* Program the TCC */6 B( t5 `$ Z: @$ z8 v0 ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" Z# \8 Y& ^1 C# n4 V: g
" Y: W1 @# ]! S /* Enable Intermediate & Final transfer completion interrupt */' e# y' ]/ L5 h/ i$ E5 o0 X
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' f; V+ f' _, o+ @- f0 T
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( e4 c/ @: s/ l. t! r4 ^% n( w U
/ l- f! w: Y! e" U% S8 \! t P; ] /* AB Sync Transfer Mode */1 V& r% x2 R' h3 D+ _) I9 m' w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# c K% k" R8 H K9 @# ^0 R) h4 A. s/ @ * ^$ H% H) O( h- @
/* Program the source and dest addresses for master DMA channel */: P2 @! ]9 ~7 p; p' T3 w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); A, `2 L- E: v8 ^" y
paramSet.destAddr = (uint32_t)(ping_buffer);1 V0 w( b) o5 N$ y- w |) I) O
( r9 n" L" U" A /* Write to the master DMA channel first. */& D1 k8 W& m1 K) v0 [0 H) R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);% y+ U* B0 C7 ?3 _8 Y) P ^
} - Q8 z, R% l4 G5 l! s# ~
* |2 q; q' k: b7 G result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# |+ k l/ x* _& e7 }, w
; P7 ?7 H% }" G1 S if(result == EDMA3_DRV_SOK)
1 O. A9 E) k% H) i! u0 }1 v6 } {4 ?2 s/ o# t' J6 Z$ ]
print2arm("edma3 driver init success.",0);
& q+ O- E! o! z) r* c9 a3 M6 ?, A/ E }
8 z6 {: D3 ?2 u4 G1 l4 }( Y8 Y* n}
5 C2 P! B" H. [7 b
; g0 X8 b g7 H; m- L& E( B2 Y* g Z4 P" u* `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* h. u" X" h7 E: ^& H! E( g
2 ~! Z5 M% P1 U! X- V" J/ U4 Y* e8 K) i; D8 Q7 [
|
|