|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ c9 o& f& k" }: S2 I; |#define PING_PONG_ACNT 1- T- Z1 I2 ^9 I0 ?, S- X5 w R% }1 Q
#define PING_PONG_BCNT 8*32*40
4 Z; b% p& F5 f& v9 ]3 }& @9 c//#define PING_PONG_BCNT 1
' G# R) ` }* W# U7 _) r% Y#define PING_PONG_CCNT 14 a. Z8 Y' g' A1 L: ]. i
#define MCASP_BASEADDR 0x01D00000
- `- G% c7 }) h" `* T#define Mcasp_RXEVENTQUE (0u), ~0 P4 \# l( @: H' j! C: D% G
% t/ t% m7 m, G* ]+ S1 `2 g- K. ~/* OPT Field specific defines */
* ^1 q2 L5 {8 B x9 R#define OPT_SYNCDIM_SHIFT (0x00000002u)
. u8 Y7 m) F: { E j) y2 j6 I#define OPT_TCC_MASK (0x0003F000u)9 A/ ]7 s8 L; j3 X7 w
#define OPT_TCC_SHIFT (0x0000000Cu)
9 F0 ?& c0 U; Y$ T9 _5 L% a#define OPT_ITCINTEN_SHIFT (0x00000015u)
% o X$ F/ W1 u#define OPT_TCINTEN_SHIFT (0x00000014u)
. q- V+ ~2 W3 P d1 |3 ]% |
' N6 [' [7 _( g: U: ~/ uchar ping_buffer[PING_PONG_BCNT];
$ [/ E* t B' {* M) mchar pong_buffer[PING_PONG_BCNT];# g' x: X# r% P
! m3 d0 |2 `: z5 T3 H4 l2 ?( n$ `0 h9 A3 ]3 S: k4 O" J& p
( M+ p( I; \3 ?6 e0 {6 e
6 o/ ?0 J( f/ ~1 W: F# Estatic void ys_edma3_init()$ l/ g& R! T7 p2 Q: Y
{
/ T) h- Z2 @! l/ k EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
o/ X2 P6 w2 i, n" V EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ y/ t& B- f3 H8 g- V
EDMA3_DRV_Handle hEdma;& z1 U3 N4 F! c2 f' U- b/ ?
uint32_t chId = 0;
0 D! x, d1 F( Q- \, v uint32_t tcc = 0;
7 `# ^5 n' l/ _, W% x; s' G+ I$ |+ N9 T" h: r' r
print2arm("edma3 driver init...",0);
8 Z: B/ `; P2 B0 U, Z* } p) B' V3 W2 X: O4 L: s
hEdma = edma3init(0,&result);0 h# C# J/ n; L& {2 l) j$ t
if(hEdma)
1 J6 R2 K9 c" ]4 i. P. q {3 b2 l8 R9 l, Q& d# `) W
print2arm("edma3init() Passed.",0);
+ [4 x6 w }2 ]+ V4 e }1 p- h% b* Q* Q7 Q( r% @$ F+ L
else. K( w4 ?* y/ \: k6 Z4 t9 j! K
{
9 r$ F6 H1 k! ]+ b* D3 ]% _* K4 Q; F print2arm("edma3init() Failed.",0);
7 U; }7 T2 B7 `0 v0 F! ~ \ G }' z7 K+ \; p6 i4 }$ _# e% L
- [; Y; ~3 O$ m5 C7 \ if (result == EDMA3_DRV_SOK)
% T: V0 { p, d2 x* R& e, V {
* h$ t) }+ O9 i) ]6 x/ z result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; @4 ~/ I4 T/ u
(EDMA3_RM_EventQueue)0,
2 c( ?, g, [! m0 c( E/ l# F &edma3_isr, NULL);
) Y+ N/ W- G& R; A+ n }5 S3 s' O% y+ B l: k- K
' y. i6 j% f5 Y1 B! Y if(result == EDMA3_DRV_SOK)
% I( m) l- u, Q. w5 E2 z {
3 J$ N' O7 N% ^' v5 c# x paramSet.srcBIdx = 0;3 \1 J* m( ~* E" O( K& v, D" f
paramSet.destBIdx = 1;
# @0 z/ A+ u3 |* i1 D' m6 D paramSet.srcCIdx = 0;
* S& K* T: W0 b paramSet.destCIdx = 0;* V) i9 @2 ?/ h1 U5 C+ I
paramSet.aCnt = PING_PONG_ACNT;0 \' n. @. X4 t" f
paramSet.bCnt = PING_PONG_BCNT;, A8 H' T& |4 N9 v9 b
paramSet.cCnt = PING_PONG_CCNT;
# Y( a. _9 d5 i/ B
Q! E5 w, o; J7 d a /* For AB-synchronized transfers, BCNTRLD is not used. */
4 k3 `% @1 K4 b paramSet.bCntReload = PING_PONG_BCNT;1 d% n) D! e, N8 {1 q
$ [# d" l. c0 |. Q9 O! U" ]. x /* Src in constant mode Dest in INCR modes */
5 [% D5 n- u* o5 w- Q; u X paramSet.opt &= 0xFFFFFFFDu;8 B4 i2 Z8 ~2 f
//paramSet.opt &= 0xFFFFFFFCu;
, x# A* u; x% C% |$ p. V % h1 \ A& \0 E* ?9 V
/* Program the TCC */( d7 C7 e3 G5 j) Z1 E2 Q/ _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ M# ^5 W: N: v0 @8 h
' u* F4 G* c* d4 t1 ?
/* Enable Intermediate & Final transfer completion interrupt */1 d3 R: }4 \% N( V+ m& w7 P! n% r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 e! ]5 G- Z1 k/ ` paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; G! p, p; B0 [+ i. Q+ C" F9 m4 q1 _1 k K' v/ _8 N7 @: [
/* AB Sync Transfer Mode */
0 @* u8 g5 t5 ~7 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! d$ s5 W9 N5 `8 T1 y
: x) ^7 J0 j. k/ w4 B /* Program the source and dest addresses for master DMA channel */
, R8 V/ a2 c! P8 E+ b- |6 a paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);* X3 F( s/ ]& T9 h1 G1 C% s* W
paramSet.destAddr = (uint32_t)(ping_buffer); v8 l7 Z; x. e9 s( P
7 y" m" I m/ E# Q" u! L( Q /* Write to the master DMA channel first. */
/ m% O7 f7 r; f result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);7 t" r4 p* @, M. o
}
: U( v1 N/ z8 l( Y; G N8 n9 L8 o+ O: T; R6 m8 _3 y, r( Y n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; g% {( |% r! M/ G% N
! N# I4 ^2 h, {2 m6 _" S: a2 ]
if(result == EDMA3_DRV_SOK)
/ t7 L9 F: q. Y: X- k" ]& P' \ {
6 F) z, `, O/ B d- K) r$ }8 f print2arm("edma3 driver init success.",0);0 ^ ^* @2 B: q
} * E4 R. h5 J* k7 w2 j4 x
}
4 A, q( f- @8 f+ [8 f# L0 v4 W) A6 p3 K) D
" \8 A7 W3 a, s% I% z. j3 [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ B# A; z( k4 X! Y
! y1 n: w p" l& X3 e; l
0 C* Q% N* e6 \2 | |
|