|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; H g" b* {" Y9 n+ l
#define PING_PONG_ACNT 18 N9 \/ u' f# J B7 b
#define PING_PONG_BCNT 8*32*40
3 k% Y; Z1 L' A4 z//#define PING_PONG_BCNT 1
, V4 s6 p+ e# g t- u#define PING_PONG_CCNT 1' q3 X; }$ r# A
#define MCASP_BASEADDR 0x01D00000
! y% p, C( c1 ~5 J# J2 t/ m#define Mcasp_RXEVENTQUE (0u)6 A8 \) k* o/ V+ Z
; v9 _: i% l8 I% `/* OPT Field specific defines */
% A0 d f9 p5 h#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 h: w5 `" b; K$ F& h#define OPT_TCC_MASK (0x0003F000u)
8 D0 X6 @3 u+ Q4 p#define OPT_TCC_SHIFT (0x0000000Cu)7 z7 b( ]: J n) l" W
#define OPT_ITCINTEN_SHIFT (0x00000015u)+ R! s% \- s: ~' S' ]& ?" V
#define OPT_TCINTEN_SHIFT (0x00000014u)- j- H3 U* V6 u
! V% G+ h$ {6 X0 D o0 z7 g9 m
char ping_buffer[PING_PONG_BCNT];7 z8 X; _" ~" w. _
char pong_buffer[PING_PONG_BCNT];$ \3 T8 b% M4 I+ L# I; I
5 |2 a. Y- h# k1 u$ ^8 B6 P7 l, u6 Y8 ]
. g* F$ _( `: |# i5 O
4 V' v P* U0 p$ ]" g2 g7 X5 b( H3 qstatic void ys_edma3_init()
, N# S: L# k$ T' x{
4 N' v0 \5 C$ G) \$ |3 Y$ J* P EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* {7 h* n1 _& s$ q; O- a. Y EDMA3_DRV_Result result = EDMA3_DRV_SOK;
A# y k3 k1 W: ~+ T3 H EDMA3_DRV_Handle hEdma;7 @" G& P5 v6 L, y. X+ v
uint32_t chId = 0;
% d T/ J) J9 s' R6 V( T uint32_t tcc = 0;
& {+ c5 B+ f# I( L; b# O+ e |7 u2 C6 ?
print2arm("edma3 driver init...",0);: ]2 J+ n5 Q$ O! z2 L0 Z- k+ H
: s" @/ Z: y( Q g8 J9 r# ]0 M# N
hEdma = edma3init(0,&result);; l5 V6 B0 l o# e3 \8 F! H
if(hEdma)
' U6 d# M2 M& O9 w' ?( r4 f {) X' L" p! W! e# G1 q
print2arm("edma3init() Passed.",0);$ V* X- D0 U3 |% K
}
7 F% e6 s" o0 F$ J else
! G) ~, |4 A. _& O) t( @( F7 W; \. W {& a J, c/ f8 p/ ]" x& _
print2arm("edma3init() Failed.",0);
" {' r9 o* J0 w; }/ \* \ }
t" [3 B6 a( y. e1 d: k) J1 i2 `
* o0 s/ N5 b d: h, Z$ x if (result == EDMA3_DRV_SOK)
( ?2 y& {3 g0 y4 ] {
/ k: R2 c- s) r/ g7 E result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( u7 G6 }3 h" b6 M& g8 } (EDMA3_RM_EventQueue)0,
3 y# | ~" I9 f6 o &edma3_isr, NULL);
; P, g, [. _, X; X) L5 H" g' V }
$ s- `; J: d! B' T L8 \
6 s4 K1 | C+ R V if(result == EDMA3_DRV_SOK)$ g" w4 b) S0 b- ^+ |# b
{
2 W# \% Q) R( ~1 P7 j+ ]4 ~ paramSet.srcBIdx = 0;
* v# s8 k* K! e: d2 K4 ] paramSet.destBIdx = 1;
0 a! c; P6 T3 v9 W: h1 f" m paramSet.srcCIdx = 0;
! J, y/ q% `& }% b$ L paramSet.destCIdx = 0;/ a. J( ?$ L S+ W) o, I: n8 h
paramSet.aCnt = PING_PONG_ACNT;6 A W2 `8 ?' p: H
paramSet.bCnt = PING_PONG_BCNT;/ F, y7 k; v( o$ u/ s1 C2 a
paramSet.cCnt = PING_PONG_CCNT;7 |( h' ^- p) U- g! \4 u) ]
8 S. |, [: e/ ~$ r
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 V3 G0 w D$ G0 J paramSet.bCntReload = PING_PONG_BCNT;* q5 o9 R( U3 I
2 @5 s6 M# T$ l1 d% y8 b5 y
/* Src in constant mode Dest in INCR modes */
" J! }7 V2 P0 z1 P% J6 s paramSet.opt &= 0xFFFFFFFDu;( ]- @2 g' U$ B) M; V. {6 R$ h1 P
//paramSet.opt &= 0xFFFFFFFCu;
f5 X+ ]1 @7 ]* Y/ e {, i3 h
# {. f: ^1 e* P4 h6 y$ N /* Program the TCC */4 M3 Z8 n9 \: X0 u( U( m
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' W( ?; \6 W/ P- _# f6 c
. @! Y% O" t7 }* q5 \9 l/ p( ?; G /* Enable Intermediate & Final transfer completion interrupt */% L. U5 {- z1 |' L8 S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- q* Y. {, N( M% x4 } O
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 c# L3 o5 n( q& M% G+ o$ D9 I) |5 l% M/ k5 ~0 X* P; e4 V3 x8 a P- [7 L
/* AB Sync Transfer Mode */
' |5 e( ?" z% Q X, j8 l paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( L/ z! o4 d/ A9 E3 T8 q/ c
/ E; E$ X! V) @) X /* Program the source and dest addresses for master DMA channel */! s# S3 |% s6 K9 n% A
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);: [4 i8 w8 y: H) m: Y% @# s
paramSet.destAddr = (uint32_t)(ping_buffer);" Y6 e% G. N' e
& i5 c' p) r* ?( c# d
/* Write to the master DMA channel first. */
) Z7 G4 Y( I+ Y2 Y2 h8 F- N result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! O q* Z d& H+ q1 P9 | }
: f# W' S' }% x( l6 s5 P3 ]
' H7 J! [5 S. ~3 T result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 X% @9 }3 c( E) `: ^6 q
. z6 j) I7 i5 a% o if(result == EDMA3_DRV_SOK)
$ C5 t1 v) D. u& t: F3 P {( S$ y- y* Z' L& p
print2arm("edma3 driver init success.",0);
( j. S, H: D0 I% R }
+ i5 I. T0 [- M! Z0 L% }}
5 i0 J0 L# {( E% b; U0 R/ [+ E$ u l
, D/ J4 ?. a" L3 v! dEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ s% h( |# X3 x6 T. ]6 C! v! i- n% u
4 d5 A/ Q0 R$ }2 V
1 D) U/ {! `3 F; ?$ P |
|