|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ P* {1 e% y' B; L, f* t# ?#define PING_PONG_ACNT 1
! x, K7 \/ d; P* s. u k#define PING_PONG_BCNT 8*32*40 1 ~1 O+ G7 l( F3 L" X: m* M/ y' h
//#define PING_PONG_BCNT 1
, ^: J" o, v6 Q7 _* K* a#define PING_PONG_CCNT 18 K5 l' {, b W, b4 q" v; Q5 M
#define MCASP_BASEADDR 0x01D00000
$ K& o3 P( P; q! @#define Mcasp_RXEVENTQUE (0u)
' D7 z! R; D. g: O
/ n% E$ \! w7 z6 E! x7 E# g/* OPT Field specific defines */
8 c; n* b' Y1 \. Q7 p f+ i, u% v( D#define OPT_SYNCDIM_SHIFT (0x00000002u) }# I; F1 J' H
#define OPT_TCC_MASK (0x0003F000u)
: ]7 Z/ C: b) M' t1 S+ N9 S#define OPT_TCC_SHIFT (0x0000000Cu)& ~) }+ f% n8 D6 o
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# x$ v; e) Q0 K0 R* ^* w$ A#define OPT_TCINTEN_SHIFT (0x00000014u)+ F2 Y' @9 _5 N; W6 `( v, ^/ C. k* N
8 T& Z6 g6 t! w) ^/ C p( {char ping_buffer[PING_PONG_BCNT];* p9 X0 O3 ^, ^& t \2 |
char pong_buffer[PING_PONG_BCNT];4 C1 Z& C% {7 G4 _, I' c; ?
. e3 }# j+ j3 [
8 C. }( i( P; Y8 s0 D" v
+ @1 w P% ~8 C, B- c8 Z: _ H8 Q h i0 G
static void ys_edma3_init()
6 W; K9 w/ r! j{
5 _+ S3 Q! j. ]1 c: {- k6 E EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
]: s6 K; A+ H- A9 W EDMA3_DRV_Result result = EDMA3_DRV_SOK; D4 v. c. \0 ]* t [! e
EDMA3_DRV_Handle hEdma;
- w- w2 i+ F- v$ ` uint32_t chId = 0;
* @6 q# N7 o3 I7 y uint32_t tcc = 0;& a. G$ `' x9 ^7 `; T: `% z* Z
~9 ^5 o' m, v9 J, V& X" R
print2arm("edma3 driver init...",0);
4 v9 d6 l3 u e& m+ g! W) ~
- F; I/ Y0 f! c; ~" Q hEdma = edma3init(0,&result);
7 T1 D4 O. n7 X6 [4 D) S1 {0 \) L+ L if(hEdma)
1 t, o, [$ @& C5 c# |5 [ {- W8 _9 N: t0 L* _
print2arm("edma3init() Passed.",0);
5 y- y5 P0 a: W }
% e* U0 ]0 V" \8 e, ~4 R& a. ? else
# B/ k5 t' i( X; i {1 W! K1 R, s2 j/ T8 V/ g
print2arm("edma3init() Failed.",0);
- O; _' C7 P4 O0 g1 Z7 s" |6 J4 [ }/ V' A' H5 I! ~* g
$ k) F2 g: b# Z4 Y8 e! A( U, [+ o
if (result == EDMA3_DRV_SOK)1 }& E3 ~; q& V
{
7 o/ c8 Q: G( ^+ z( H' Z; \, q result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," Z9 t4 G; J6 t7 Y# y
(EDMA3_RM_EventQueue)0,( R4 I: z% a. J3 v5 S3 p: a4 M! h
&edma3_isr, NULL);; s$ G, i% E. i- ?
}7 ^- U% ~4 E! `
& h! w0 x$ _8 \% h3 q& P) R- Y if(result == EDMA3_DRV_SOK)3 K: S* r4 b, ?; M. v8 w' ~
{3 b& o4 G- g+ ]% F: _
paramSet.srcBIdx = 0;) h: J2 g" Q! W
paramSet.destBIdx = 1;
4 D9 q# T! n1 V' h! K5 e5 W" R9 j6 ^ paramSet.srcCIdx = 0;" y t5 {" h, [. G' p v
paramSet.destCIdx = 0;- a: g) b! _) n; [
paramSet.aCnt = PING_PONG_ACNT;
3 z" F4 t- J& q: W3 S, y& Y4 A paramSet.bCnt = PING_PONG_BCNT;) T3 y7 H+ w* u! J
paramSet.cCnt = PING_PONG_CCNT;
6 i' e2 \9 l0 t/ K0 M- J
' X8 i' ~: {; G+ Q# T$ t/ ^4 b, B /* For AB-synchronized transfers, BCNTRLD is not used. */6 x0 a/ |+ |1 m) C0 ^
paramSet.bCntReload = PING_PONG_BCNT;
$ j; E' w( c1 ~, j# C( ?: o. R# ^# b; P3 M& Y5 ^) D9 O
/* Src in constant mode Dest in INCR modes */
1 A+ E! a: Q7 K# R paramSet.opt &= 0xFFFFFFFDu;
3 @3 A; V6 ^. L0 p //paramSet.opt &= 0xFFFFFFFCu; S/ B0 j# Q7 e' r2 l; `
4 s$ [( B$ b) n: H5 q' k+ X7 q /* Program the TCC */' ^0 a3 X+ r. Y. U. w
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ Z3 }6 C& J' z, e5 z0 ?2 G! c2 L% [" @- n9 i% W
/* Enable Intermediate & Final transfer completion interrupt */
. S- r" [' z: C. {2 W8 G paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 k' I, ^; [+ u4 s2 v paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 X/ W: f r9 K7 A' f9 z* I7 b* @8 V8 ^3 l- w: @! t+ Z
/* AB Sync Transfer Mode */
9 X& b0 |- |- T8 z paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& r* C2 X5 C; i( T$ a+ w
2 @! }; u! o9 \$ p( P3 n- \: X /* Program the source and dest addresses for master DMA channel */! [: [1 ^5 J. Z0 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);2 g7 i1 Q1 Y: Q+ ?0 g( m5 \$ v6 f/ }
paramSet.destAddr = (uint32_t)(ping_buffer);# x, ]+ p, R8 r7 A: O
0 e$ H W0 q0 j j7 E8 l /* Write to the master DMA channel first. */
9 a# `7 N5 f6 v/ z' L. j6 Y( } ] result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);% z; N3 B( H4 V3 f4 h0 Z, E! {
} 5 u1 D9 W( g$ H; k i5 R; ?
. b! K( y9 Y: I' r) t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ `& M' Z7 p8 l& l) o
" u2 ]4 G2 D3 ]2 C" w$ ^ if(result == EDMA3_DRV_SOK) . k1 q" F& |: r5 L
{
+ h2 Y6 f3 c0 J* n print2arm("edma3 driver init success.",0);
0 h @- m$ k( ^ }
H# C5 W0 A; [& d}
6 X: q# {% ?* s, M1 G+ j; M
! F2 V! t* k/ I) s* g% L# n: {- L, h% E2 m9 C& V0 s0 A/ _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 S4 L7 l8 M+ s
% g( i ?" A/ w2 v, o$ g# c8 p; p, U4 K; V3 z3 Y$ x
|
|