|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 U! G$ m- R0 F& F% T& Q#define PING_PONG_ACNT 1
2 F% q0 H0 w5 A& e0 \$ E0 r#define PING_PONG_BCNT 8*32*40 8 D+ l6 a2 G2 i5 P+ U5 s
//#define PING_PONG_BCNT 1 . `8 a$ Q3 _ l0 r A: l1 Y
#define PING_PONG_CCNT 1
$ O: S- U4 T" q/ K#define MCASP_BASEADDR 0x01D00000
z# a0 _# N( T8 d! \# C#define Mcasp_RXEVENTQUE (0u)
9 Y) V7 |) L& p B( c. H- a# R, K: C$ a6 h
/* OPT Field specific defines */
& |2 l0 i1 V$ ^3 ~ F% N9 [* T0 [#define OPT_SYNCDIM_SHIFT (0x00000002u)9 f2 z4 C! H: |, Z
#define OPT_TCC_MASK (0x0003F000u)
+ Y8 z5 b e* y) c) h' o; G0 m e#define OPT_TCC_SHIFT (0x0000000Cu)
0 B, f$ M7 }% A6 X$ L9 g#define OPT_ITCINTEN_SHIFT (0x00000015u), x! `2 U x* g' {8 n' O
#define OPT_TCINTEN_SHIFT (0x00000014u)6 r2 X; i" a6 K; x( ?+ g" ?
3 B4 q6 q/ c: c I$ i( L
char ping_buffer[PING_PONG_BCNT];
) n& M* b9 r! r! T' I5 j2 Q1 \9 bchar pong_buffer[PING_PONG_BCNT];
! P9 M6 e8 o3 v: N0 J ?" k9 o! N6 N4 t* Z6 R
! R# ?9 `! e7 d) ] q" t8 p' Y8 H4 L0 [9 f, j) \$ O' x) l& b
$ G3 t+ l: k+ ~
static void ys_edma3_init()6 t* s+ n5 t* \& c5 x9 V
{
+ n8 H/ ^# B% e9 T1 @ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( m! g1 I4 A4 V. a8 Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;! u' F7 f- @8 L( V6 _, u
EDMA3_DRV_Handle hEdma;+ O# B# M4 \ o
uint32_t chId = 0;
8 O: @# D6 V. e5 P7 ~) a uint32_t tcc = 0; ~2 y5 S0 V4 P9 |
/ R+ a; M% W1 }3 ?) u4 H+ T
print2arm("edma3 driver init...",0); a0 G; v5 d$ A% @9 ^- \
' N; H7 A3 c6 _5 Q4 J! p6 l! Z hEdma = edma3init(0,&result);
! r$ {! H1 O' i3 e. S0 E5 L9 O& } if(hEdma)
/ c* T0 {: V$ U {3 x9 l& w: r; W+ \3 y' k
print2arm("edma3init() Passed.",0);
9 v1 `2 ^- L5 K% d4 K }5 J0 Y5 t! ~8 c0 \* X
else$ B+ q. T% p, `7 |6 I
{) @& ?" P3 K0 Z+ a$ S% g2 o
print2arm("edma3init() Failed.",0);
C" P2 Z4 J+ Y' D8 \ }
( x8 a) O6 ^( v. e 5 l- M! c- {8 z; E1 K: W
if (result == EDMA3_DRV_SOK)& [- G; n7 G) G! `+ ]; q& z
{
6 y) f6 R6 W# d4 q* f, U/ r# F result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,- P1 Z+ v5 ^ ~1 F8 [* Z1 x
(EDMA3_RM_EventQueue)0,
- W% N6 s2 _" A' z& r y" U7 w &edma3_isr, NULL);
# Z5 ]- m; z4 I; w8 C m7 b }
3 s: r# f1 Y. h+ R! h; e4 z - V- O, ^- D6 M) o
if(result == EDMA3_DRV_SOK)2 J3 A6 u% m2 G: P; v+ T
{; \: |- o. M+ H- h, `& j
paramSet.srcBIdx = 0;
f5 k! L9 N f% O" Y paramSet.destBIdx = 1;! `9 ?; y$ `# s' b t/ `
paramSet.srcCIdx = 0;
. U! e- ^7 Y1 p% u$ n! @ paramSet.destCIdx = 0;1 q4 e: u2 j+ ]4 ~1 A7 M
paramSet.aCnt = PING_PONG_ACNT;
5 B$ s9 X. j6 l" P" d paramSet.bCnt = PING_PONG_BCNT;
) `2 @7 l$ I i7 I/ L% ] paramSet.cCnt = PING_PONG_CCNT;! z" e- T6 B0 p3 i/ k- p5 l+ L! @4 U
3 S; j ?! I* Q2 W. W
/* For AB-synchronized transfers, BCNTRLD is not used. */1 ]+ U$ K* z7 S" b
paramSet.bCntReload = PING_PONG_BCNT;
0 Q/ }; y [7 K8 o, w: R( _) g
/* Src in constant mode Dest in INCR modes */4 _0 _( Z+ \' s. {% ?+ y1 C
paramSet.opt &= 0xFFFFFFFDu;
( t9 a( y8 b/ ?+ T! V- W1 V) _ //paramSet.opt &= 0xFFFFFFFCu;: N' o3 T8 R; g n; }* h
\: \: ~$ @3 a8 U. D7 x* Z /* Program the TCC */
8 B0 E! W0 \1 o4 o# B paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: J+ {, M8 Z9 h8 _' s
5 ]1 O4 q4 j- Q% v$ b /* Enable Intermediate & Final transfer completion interrupt */2 N) n1 g" D# s/ w3 k9 m4 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ E/ H& R. d' V- w
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 ?0 D$ m0 T. t. v' w( \
/ e' T7 B g l" u" ~ /* AB Sync Transfer Mode */6 T4 h8 T5 y8 O/ y# _( v
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 [8 J7 X: r3 `0 {- z
4 X* L) u+ C' y* P/ y
/* Program the source and dest addresses for master DMA channel */& V0 D2 k6 W0 a5 R4 z5 O: b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ X3 a# g4 V* G$ Q& k8 q* o. k paramSet.destAddr = (uint32_t)(ping_buffer);
1 f& b: a3 t, y$ ~! z8 I# i& H9 E; g4 s$ h9 I' u
/* Write to the master DMA channel first. */4 K& |6 Y% w ]7 O" g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% K# K2 J4 H. B } 0 d) z, p" L% p6 h
; k1 \! R Q/ c4 H result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ K! ^! E* b, @8 X$ v % u- d& T9 ^; p4 {9 {& U0 V
if(result == EDMA3_DRV_SOK)
: j8 @; f: n, K9 p- |3 D a! X& [ { Y9 r1 @) @ p+ G6 ~8 r- ^
print2arm("edma3 driver init success.",0);% X" u. {6 d, D) X
}
* z, z$ R. E+ F U- h# B}
1 |6 p9 f& i0 B2 C. N" `# Y+ w
1 T& z7 C) P% W* }; c1 J+ y6 \2 C' e# H) F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" s" V) K2 {' z! u- x; ^! T/ h) r) w# p# F6 \! m
' h6 j; H; b8 v% _2 ^6 k _6 z E
|
|