|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 J3 b$ s$ q& c0 t8 k: r, H$ A#define PING_PONG_ACNT 1
. U( \! a0 L) Z0 [. K#define PING_PONG_BCNT 8*32*40
8 g9 R, y5 g6 r0 ?) a//#define PING_PONG_BCNT 1 $ K% ?4 h2 Z7 j3 N. s% {
#define PING_PONG_CCNT 1
, ^; w2 x; k) o* e5 \#define MCASP_BASEADDR 0x01D00000
( A$ C$ n9 g5 f" w#define Mcasp_RXEVENTQUE (0u)
# H( V$ _; q7 Z8 g: x2 N) [5 K1 R0 j$ v$ @3 r: i) v
/* OPT Field specific defines */( H* h/ s2 x6 |0 g. R0 V2 W
#define OPT_SYNCDIM_SHIFT (0x00000002u)/ F( S2 z% C* S
#define OPT_TCC_MASK (0x0003F000u)
( ^6 e3 @. l' @+ g#define OPT_TCC_SHIFT (0x0000000Cu)
1 \* M) R0 U: W9 H3 V5 B#define OPT_ITCINTEN_SHIFT (0x00000015u) p8 r' f/ m t5 w& X; s
#define OPT_TCINTEN_SHIFT (0x00000014u)
z) }" z" o$ q0 M
' S8 `) i a! Qchar ping_buffer[PING_PONG_BCNT];. H2 l( E [/ h* E" y8 L( g& N# r
char pong_buffer[PING_PONG_BCNT];0 V! t0 n+ q( R/ O( K) M; c- n
4 Y2 C0 F9 G2 @; h% i2 {$ ~$ z0 f
' y" O4 l& [# v' H5 b
1 `- u. ^/ m r! ^. {$ m5 A( e) s" H1 \* f4 w" C
static void ys_edma3_init()/ w/ {0 l o9 P) q+ c6 ?% L
{0 v j" H2 |& V, {
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: h" L: T: Q* ~9 C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 ^0 x: [- D% O$ a6 c9 P
EDMA3_DRV_Handle hEdma;% ^* N' Y9 b; K4 v$ y
uint32_t chId = 0;. S( M9 ]3 A% R, G! \/ j
uint32_t tcc = 0;$ ]% _2 U$ n( @3 M( ~
6 q6 f* C' B3 B, E4 d1 Y9 @ print2arm("edma3 driver init...",0);
7 ]3 Y6 q3 U* b9 B6 p. y3 Q. V0 j% {+ B; Y# x% o
hEdma = edma3init(0,&result);
8 o+ k: k$ \1 q3 r8 u if(hEdma)
) y! K Y* J( B3 U3 ` {- \2 Y3 W$ `; F( C8 @( S- S7 H
print2arm("edma3init() Passed.",0);
% S" p" R+ F, y& A% H! s7 D* a }& [! h- y/ X/ E3 u! `
else7 T6 e0 D6 k& ?# Q0 p0 `
{
6 S, h/ ^' N- O5 g8 f$ B7 | print2arm("edma3init() Failed.",0);/ W( Z* M [( h$ B) ?6 v
}; `/ z) I: p* ?- k9 I4 s* Q7 m6 ^2 K
x W* ~! t- z, u- N2 F
if (result == EDMA3_DRV_SOK)% M4 [1 O& J& K+ h; j
{
! a+ s; F$ P/ P result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 c' Z, k q `) ^" H I1 t (EDMA3_RM_EventQueue)0,5 t' y. O. K6 f6 V+ p r3 n
&edma3_isr, NULL);
; e& _3 J( A7 i }6 f" \5 L, e' d8 W) @
' X; t1 U+ c _' Z- ]) L
if(result == EDMA3_DRV_SOK)% D' N" ^* R0 J l$ b0 W
{
! R+ G8 B: g% _% g paramSet.srcBIdx = 0;* A* @6 Q3 X7 a1 [9 y9 ^% U4 F% ~# {
paramSet.destBIdx = 1;
3 o8 J( K, d% R7 V8 q0 @ paramSet.srcCIdx = 0;
! Y- E* g6 G" T8 X: {8 Z paramSet.destCIdx = 0;' i" V. W2 r6 N- s
paramSet.aCnt = PING_PONG_ACNT;: w) e' F& Z/ @0 o9 ]
paramSet.bCnt = PING_PONG_BCNT;* K* ?* _& k# P. N3 p0 y" o
paramSet.cCnt = PING_PONG_CCNT;
- q9 p w/ A3 s3 k0 K6 [8 Y& e
1 O1 N+ `, [; M( ^7 C- i /* For AB-synchronized transfers, BCNTRLD is not used. */3 H+ q* t9 {9 U
paramSet.bCntReload = PING_PONG_BCNT;! j( r* _) m! U3 E9 i* W
- N0 ]) M/ v" W2 J
/* Src in constant mode Dest in INCR modes */
+ J7 @2 D: D5 _* P2 m& Z paramSet.opt &= 0xFFFFFFFDu;
$ _6 q; ~9 Y, E/ E //paramSet.opt &= 0xFFFFFFFCu;2 P' r+ M& _5 c6 _# ~2 t; L5 W7 g
, S' |8 e1 D2 g /* Program the TCC */
5 B' U$ Q; v+ L b+ c paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 x7 o$ e5 c# Q1 N( i% s% N! r, r1 M5 }3 C
/* Enable Intermediate & Final transfer completion interrupt */7 Y5 j8 ?. n e& j4 Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! v5 _7 [! J/ P# a
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, S: c6 a* ^. V2 u
0 ?5 P4 E; m# Q* S2 B /* AB Sync Transfer Mode */
6 D4 ]2 r( x( i3 H B* f paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; m1 M+ | a! Z) M! Y
# K; |3 k6 }# Y3 j7 L
/* Program the source and dest addresses for master DMA channel */% C& T2 |0 J s3 V/ \( u& Y% y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 I4 I2 w' ?0 w1 x" u4 k paramSet.destAddr = (uint32_t)(ping_buffer);/ Y0 V9 R' }$ n7 P5 }
( y" d5 x4 @: q+ V c
/* Write to the master DMA channel first. */2 F$ t- A- N: A% g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);. \ ]4 j1 {8 q) ] B
}
- c2 B6 v7 k& ^: M l' A& z `0 f
" H& b3 r% R Q7 X4 o- f; B result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 A# {# h% j( d. C- A
( T4 Z, ]$ ~+ S3 i1 m* T* c N8 \ if(result == EDMA3_DRV_SOK) 6 v1 V. E8 P% h0 w
{
* n* `5 n& r4 r# B: k5 L5 Y print2arm("edma3 driver init success.",0);% f. ~' [4 p) d
} 6 |" g0 T5 ^" i. Y
}
3 b0 e4 `5 E2 { M0 w A$ G& C* U7 s0 q
+ G1 ^2 e( H, r/ ~9 r4 K* |3 D" `) tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. Y! w8 \7 D5 a1 x X# K" M
9 q0 ^; a7 L- `+ A$ _
* m4 r0 b7 u' Q- K |
|