|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ d8 y3 \6 C5 k/ Y% z#define PING_PONG_ACNT 14 P! r) ~- W8 E, L; [
#define PING_PONG_BCNT 8*32*40 7 P" l$ ?1 K* Q; l' `2 w
//#define PING_PONG_BCNT 1
% b D8 |8 M' [! n' T, ?, k) _. I#define PING_PONG_CCNT 18 n: {' p5 A) Z3 Y; @/ ^
#define MCASP_BASEADDR 0x01D000004 j5 O$ g0 |* g8 |; z0 c& Q
#define Mcasp_RXEVENTQUE (0u)- h' r7 i2 h4 ?% p1 @* G
( a: r+ G- \( R/* OPT Field specific defines */* `8 S3 A" p7 m0 d8 A) h% ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 Z* R" G" \5 i# V" ~#define OPT_TCC_MASK (0x0003F000u). t1 m* Z7 J$ ~8 b& K- {9 V
#define OPT_TCC_SHIFT (0x0000000Cu)
, o) z! \0 b2 M5 G: _7 q#define OPT_ITCINTEN_SHIFT (0x00000015u)
" Y7 K1 O4 p* C& q. G5 o" S' I2 ~#define OPT_TCINTEN_SHIFT (0x00000014u)1 J x) u9 v5 q2 f2 Y; |8 ^
9 v. G" g2 ?% h, y5 G1 l g
char ping_buffer[PING_PONG_BCNT];
* W0 ]' i! G) @* Uchar pong_buffer[PING_PONG_BCNT];
! L. y, u; z1 E
3 f' @/ f! k# G$ W$ V1 z/ {2 X5 Z& H; n1 F
# J, |5 r' i! |
0 W$ U9 S1 ^ E+ j' P7 ^$ l% _static void ys_edma3_init()& z/ ?. [+ @0 o; `/ j+ P4 t( G
{ S5 e }7 V: a* v a: q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 ^8 s% m6 x% O% @5 n0 [! t EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 _9 g- m" S. h2 S7 q EDMA3_DRV_Handle hEdma;
+ i% l0 H& A. C8 q* M uint32_t chId = 0; R0 y ?5 S# g6 o8 P3 ]/ L
uint32_t tcc = 0;* S8 J& y2 D& ?# A8 H7 @
' \; o& Q! R p; h) G( X& g
print2arm("edma3 driver init...",0);
* G! r7 }/ Q# o% w" m+ Z3 J1 `6 ?3 H4 E
hEdma = edma3init(0,&result);
. c# E9 ]( T/ p+ Y if(hEdma)
% ^0 t, G! x# h {9 M0 M9 y* N* q! `4 T: o: E* H
print2arm("edma3init() Passed.",0);
. H) e1 B3 W% `$ l) q }
$ B" D0 [4 ^/ b+ i8 | else
: ?" c. u: s0 d, A; ~5 n6 H {
( C; T1 J5 _) ?% M# m: e print2arm("edma3init() Failed.",0);
}( T" W" @8 I9 H! P, Q }
8 A! `# H# C2 H# F) i H. {0 R * E: L6 W% M$ l$ H2 [4 Y* A
if (result == EDMA3_DRV_SOK)- o& @. v: q9 G( O
{
& u: _; Z* B' N9 ~) j result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 ^6 ?3 j1 e, u( C, u (EDMA3_RM_EventQueue)0,
2 q' u* \8 |8 L9 `/ o5 E &edma3_isr, NULL);
" P$ F3 g$ D2 ~$ ]- y }2 E% H: k' R1 g: O) f- Z" } t( ^
3 d- O# m( }' i% V) X+ H8 T$ i if(result == EDMA3_DRV_SOK)
1 O3 b& O" z: y2 Q- C {/ I! v" ~" z1 a6 ]* h5 x4 t) L, M5 N
paramSet.srcBIdx = 0;
! [ ^' ^- Q: |# _7 l paramSet.destBIdx = 1;
# d6 S7 K/ ~0 n0 I I0 K7 W paramSet.srcCIdx = 0;+ ~/ P( }# ]6 Q# u+ N9 ~' L' o
paramSet.destCIdx = 0;
' ?5 X/ y% _ R paramSet.aCnt = PING_PONG_ACNT;6 A' V' `/ \- ^* `2 P9 D
paramSet.bCnt = PING_PONG_BCNT;( B/ Z1 J9 f- t/ K8 c6 e$ T) W/ n
paramSet.cCnt = PING_PONG_CCNT;" a" |+ q: `5 c$ H; U1 c
* j% _8 ]7 H& m; J% e3 @ /* For AB-synchronized transfers, BCNTRLD is not used. */" T8 \5 u. O8 L; d
paramSet.bCntReload = PING_PONG_BCNT;0 h9 P$ v7 G) _: T! o; b' B; B* Q: I: t- q
% O. d& g" W& K- L" m
/* Src in constant mode Dest in INCR modes */
* x. _9 z* T- u" a paramSet.opt &= 0xFFFFFFFDu;5 S4 Y6 K4 y2 x( ~1 b
//paramSet.opt &= 0xFFFFFFFCu;1 c8 P" Y5 U/ ^6 b
/ k. D8 y. @+ |+ k- e /* Program the TCC */
0 p4 q2 O( l% F3 ]! v paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' w9 r/ w2 Z1 F8 }& m& a- c
( _: {9 S/ [- w /* Enable Intermediate & Final transfer completion interrupt */# u7 ^, V# V- f; T: D, D* d
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: ?( X. y/ A* W( O! N% e paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);2 W- N5 L' M2 Y. r1 l
; F: |1 @: Z9 o6 [& {. f; K2 t3 [ /* AB Sync Transfer Mode */9 h0 a0 R D4 s
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 E% n4 f$ |, X- b( B
5 Y3 S# G$ M. K9 i' k' {" q) h /* Program the source and dest addresses for master DMA channel */, Z5 m) Q1 e$ c" U- M/ P8 W
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% e: a5 o0 U; L( j$ D& _ paramSet.destAddr = (uint32_t)(ping_buffer);* \1 r8 L! }" Q7 L* Y
4 ?4 W; Z1 f# I; g$ Y
/* Write to the master DMA channel first. */
- k3 y' B& E; }" O result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);/ L7 S* f. _/ X+ k7 s6 [
} 6 u/ R5 A" F6 m2 ?, i
+ V' i; P; k1 w. ^* V5 F ]' r result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 B7 j; W) v! H+ R+ l. a' u 8 A* |2 x4 I+ F& K
if(result == EDMA3_DRV_SOK) 6 q! N" U* m6 P" G8 M9 g& y
{
# G, f5 }1 ^; ?8 h print2arm("edma3 driver init success.",0);+ Y! o* v$ o' x5 `3 ?
} ; f1 p/ |, G. [% K# w' G! N
}& B. C1 u; P. M) J- M/ Y
J: Y. H. h" W" {6 U; T D# e
7 e. N0 O5 _: W+ j' {7 N% _5 N9 YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- x2 F2 Y& r7 t$ ^. L) V
. y7 o* j/ l& {5 {3 q, s
0 b& ^+ M$ x1 {- n |
|