|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 H4 {/ \- \! T#define PING_PONG_ACNT 1& g9 f5 R6 t0 f- i# g' r4 x
#define PING_PONG_BCNT 8*32*40 + J& r: e. ?* f0 V
//#define PING_PONG_BCNT 1 9 ^( b: i$ e/ M/ s% A: h$ E4 |' L
#define PING_PONG_CCNT 11 L/ s4 u' R8 C; X( s7 G$ S
#define MCASP_BASEADDR 0x01D00000' R# v9 R( D! ^ L; q+ r- l
#define Mcasp_RXEVENTQUE (0u)* c2 |' f* Z, k7 L- Z
) d5 \( U& k a7 y0 _1 ]
/* OPT Field specific defines */
3 q- d a/ j8 s5 {( J& z$ D7 V#define OPT_SYNCDIM_SHIFT (0x00000002u)
% X: [3 P5 j( I! h( U7 u7 J; G4 `#define OPT_TCC_MASK (0x0003F000u)
3 A) @% ]3 g( d- F1 y' n( l#define OPT_TCC_SHIFT (0x0000000Cu); i* i; Q+ P4 T1 U# B4 }
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 p! M& M' U& l#define OPT_TCINTEN_SHIFT (0x00000014u)
5 z9 @! k' N ]1 I8 d1 l& Y5 }. E) A6 `, I
char ping_buffer[PING_PONG_BCNT];
0 C/ j2 R; G2 W5 W" y( O2 R1 dchar pong_buffer[PING_PONG_BCNT];: A/ Z0 n( Z! B* G1 F/ a5 d& ?
7 E0 b |2 ~+ @
T" E w9 W: v& y$ I3 t
# T% }0 R ~/ c" {4 v8 v1 B9 L& g6 _/ n( c9 a8 I4 B, q' X8 G
static void ys_edma3_init()
% x7 j( F' H, m8 r' c6 h2 ?{: a% E! Z; r6 k% B" [
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 x- O3 [$ f3 ~! I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 o+ @* E0 F5 H, |7 H& H, I5 R9 h EDMA3_DRV_Handle hEdma;
1 D, E5 L, {5 d' X6 }; q8 S7 k uint32_t chId = 0;
5 P+ I0 B9 }% K, C: U uint32_t tcc = 0;9 {2 d: Y' r8 w+ v# f& {* E# Z
/ K+ W7 {% S% M3 w( w. c print2arm("edma3 driver init...",0);
- S% J7 {/ {7 b. f
8 V( ^- ^& G2 H# k7 P' c- f hEdma = edma3init(0,&result);
, Z7 e: z5 ^1 \) e: W if(hEdma)
* B5 [) @" q# R# J$ N. J) p y" Z {/ d" v2 X5 n: X2 d3 |+ q
print2arm("edma3init() Passed.",0);
% _6 ?) s$ m2 t% b$ Y4 F" F }
9 D1 t' z( n. P5 N; X# C else
8 r7 Z O) B; n1 o- \1 H {% @8 l, F8 r8 E
print2arm("edma3init() Failed.",0);- f! E2 {3 _' v3 n. U$ p- \; ^: Q
}( l) H$ |4 ]5 N5 y, c& A/ n
. V: _, r. ^" K$ h9 N, X
if (result == EDMA3_DRV_SOK)7 ?: U+ I$ N' T
{
$ ?! g* M, s; \/ {( l8 g! u" q result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 f, ` ^) ~0 U% W7 s+ ] (EDMA3_RM_EventQueue)0,
' N g7 W9 {, k% l &edma3_isr, NULL);
1 p' i9 I; D1 o* F' M6 r% P0 w" z }7 _# c/ u5 Z0 {, v/ b
9 s! d9 V/ U: D2 f4 S
if(result == EDMA3_DRV_SOK). F, f( B: U: c& P- ^4 T
{. }5 q, N7 E7 d- m2 C- M' K
paramSet.srcBIdx = 0;
4 v7 z$ G+ Q* o" i A0 y( V paramSet.destBIdx = 1;
& \ c9 c/ z! x" \ paramSet.srcCIdx = 0;
+ G( v6 z7 `) B' Y# V- P0 ]! \1 y( u paramSet.destCIdx = 0;
; e( M+ }9 C; x) X( ?) { paramSet.aCnt = PING_PONG_ACNT;& t# ^( m( _) a& e7 @/ B! [8 a
paramSet.bCnt = PING_PONG_BCNT;" O% o4 U9 K* F+ V
paramSet.cCnt = PING_PONG_CCNT;9 F7 v. n! D% ]" F
) V3 ]3 g: _7 c; u% H1 J /* For AB-synchronized transfers, BCNTRLD is not used. */7 S+ T% o# N2 h% z
paramSet.bCntReload = PING_PONG_BCNT;8 A7 e1 S1 X/ Y& V
b$ l+ ^& k% B$ L /* Src in constant mode Dest in INCR modes */
! o, p- _. g5 G# A1 x/ Q- n" S* w paramSet.opt &= 0xFFFFFFFDu;$ Y1 z* C1 Z( S
//paramSet.opt &= 0xFFFFFFFCu;
4 F: x- U$ }+ w
3 H b+ l, t% Y" P! o, R8 x) } /* Program the TCC */
* N0 Q& d* x# z6 w paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# }& V5 k3 R( J9 V/ G
7 Y$ W: R q5 f" u' c; P /* Enable Intermediate & Final transfer completion interrupt */
9 Z, T7 m" J5 h8 K paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);& R0 X5 O% n: s& U& R C
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% \: Z6 ]! j& K' m2 c6 E' z9 t9 g, E9 Y9 ]) d3 A* [! u
/* AB Sync Transfer Mode */
; L* P: B. {" ]! J' J8 [3 Q paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# O* w$ O6 y- V
6 k6 ^9 `& B7 Q1 z
/* Program the source and dest addresses for master DMA channel */0 i2 b I; C) z% Y% U+ W. Y, c& {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ L1 U6 f6 _9 D6 f paramSet.destAddr = (uint32_t)(ping_buffer);
; b. K9 w: C3 W: G/ @* A% U& v( Z4 l: t; s. p! o% L
/* Write to the master DMA channel first. */* @9 v. D- y1 ~! t2 A9 h$ {
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);( x _* E! z- _
}
, d& \, U% Y: e+ M7 P& i; t4 v( F. J- [; m! V N8 ~2 P3 B: O2 m. W
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 q6 f8 P3 m8 i/ l
4 _! \# F' i! P+ O% _4 \+ K" l
if(result == EDMA3_DRV_SOK) ! X8 t; Q3 F* y/ v6 b6 R9 Z) {
{
- ~0 ~5 r7 @/ a6 Y print2arm("edma3 driver init success.",0);3 v, t: O0 t# M3 }
} - J* n$ |: F1 f9 F+ D+ f3 z
}; ]- m6 c, W7 S+ n* Q
4 h ]$ @2 W2 q1 A; w
, u6 ^0 C5 Y, ?( K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! v9 J- w7 ~! u
9 b7 f9 R# {2 ^& Z7 x+ W7 l3 y
: h5 \, f# P4 s7 @7 u |
|