|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- @& O8 V% ^# t/ R8 o6 o: s, D# {- S# {#define PING_PONG_ACNT 14 m* Y4 `2 o% h, @
#define PING_PONG_BCNT 8*32*40
8 O9 D0 N) ? f- g//#define PING_PONG_BCNT 1 0 t# D# B2 V1 I- e
#define PING_PONG_CCNT 1
4 N8 D. S% t+ ?1 d, d#define MCASP_BASEADDR 0x01D00000
! B" I! t8 u3 x0 S) M$ C/ p- B#define Mcasp_RXEVENTQUE (0u)
& S( @" R' d8 t2 j- j
5 T! n" o7 c1 ^0 b/ c/* OPT Field specific defines */# v2 K# ^5 ^4 O! R+ b% e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( y+ C/ K7 v: V#define OPT_TCC_MASK (0x0003F000u)
( O8 F, i: j N" U/ [+ f9 M#define OPT_TCC_SHIFT (0x0000000Cu)
* Y7 B3 N% Z' E#define OPT_ITCINTEN_SHIFT (0x00000015u)
' z/ d% U4 c2 `#define OPT_TCINTEN_SHIFT (0x00000014u); b* ^" s% g% \! @" d" {3 o3 Z
8 b u2 S& }6 ^+ x$ B
char ping_buffer[PING_PONG_BCNT];& x! z7 _/ k' q. P- g; n4 [+ l7 u$ Q3 ~
char pong_buffer[PING_PONG_BCNT];
: b2 ]" H: `! `5 ~
$ t* K: D0 ~' D+ z! |: E. q) U. n9 v$ D' l* ]; a# q
7 a2 C2 Z- E+ T8 S1 A
2 K1 z: j U! R9 y2 lstatic void ys_edma3_init(); Q! Q& _: w+ ^# _8 D
{! h/ H" s" i; @* w) T9 o" X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 t/ p4 |8 Q, w: ^% ^! d N2 J; \' ~6 L EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! Y: f. ?1 b7 X+ q EDMA3_DRV_Handle hEdma;
& r" m: s, b& c$ J& e uint32_t chId = 0;
% U9 b4 o8 n5 P' e% d uint32_t tcc = 0;
* u, G$ `& n) L0 }2 F
, m4 r. s3 T. N0 I2 V0 y print2arm("edma3 driver init...",0);
( s" t& M/ S" d. `$ w9 t* F) d
& c/ |, |# i, p4 X1 }( Z) q* U hEdma = edma3init(0,&result); N5 ]" C9 V/ S0 H& ?/ Y
if(hEdma)
: }/ U1 K0 |& V A {$ J( M x* d* @" Y* x
print2arm("edma3init() Passed.",0);
/ ^5 n C1 D M }
5 h* B9 k* c* ]& @) r. s; \( g else
% y- a3 {" c# e; O5 m { m0 H; }' ~/ l7 ]* k* ^
print2arm("edma3init() Failed.",0);
% \, I8 L+ k1 e }
8 c K* l, Q! Z5 f- E 7 U# u! y k4 M! y
if (result == EDMA3_DRV_SOK)
1 {/ f5 D) q& L! V {! y, c7 {6 t: s3 F$ w* N J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 V' d! ?0 P4 G$ @3 m) p
(EDMA3_RM_EventQueue)0,3 V A" w4 u6 y# Y
&edma3_isr, NULL);
# |4 \6 ~8 A9 i+ G f }
6 D. E4 Z9 K3 E ( a4 C# @" H+ M# J2 G& o
if(result == EDMA3_DRV_SOK)
: m# M9 ^3 Z! A6 [ {
* N% m) S: ?- A0 H9 U4 l paramSet.srcBIdx = 0;* R7 X+ s% |9 H4 h. I. t
paramSet.destBIdx = 1;
' m0 m. I4 J# N6 W0 G paramSet.srcCIdx = 0;5 g) Q8 x' e% x$ B/ O# S
paramSet.destCIdx = 0;
. T8 g' g8 t0 b( ]( ^: o- k paramSet.aCnt = PING_PONG_ACNT;
7 S' ]. ~( Q; J! N& J paramSet.bCnt = PING_PONG_BCNT;* }, w& d) h" ]/ G! k/ B
paramSet.cCnt = PING_PONG_CCNT;
F8 D1 G$ h7 |7 W Q# B1 F : T- ^2 c+ x; J2 ]+ u
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ q) k3 Z6 @7 I% F) {; D paramSet.bCntReload = PING_PONG_BCNT;$ b% q k4 Q2 ?3 o( d
5 J. d# j* {3 ^" K: `: h /* Src in constant mode Dest in INCR modes */1 p0 ?# y" q- H1 K5 t- t7 Z0 R3 p
paramSet.opt &= 0xFFFFFFFDu;0 x0 T0 a6 z) K2 T/ l7 a
//paramSet.opt &= 0xFFFFFFFCu; o% Y' {' l' P1 h) f; C
) I6 G' j3 G4 X
/* Program the TCC */) `* C7 o v1 Y2 u( F! E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
x. W' m& F% g8 q, _0 W8 v! v3 ^3 f5 ]. S
/* Enable Intermediate & Final transfer completion interrupt */
7 Y8 \6 n1 V" s/ T' a! ^6 s5 d paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: y% J& b+ K! ~4 Y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% p. [5 R# b1 D5 P8 v
$ D% H+ }' q; z. e. ^, Z# ~
/* AB Sync Transfer Mode */
4 X6 x( H6 e* }" s paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ j* v! A/ n: I& {# h7 M9 b6 p9 w3 _
& R, T- ~$ Z# r4 \ /* Program the source and dest addresses for master DMA channel */
9 i' T" x* e s9 [) @3 W paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);9 [; y \% |% T. T
paramSet.destAddr = (uint32_t)(ping_buffer);' H7 @" P9 J5 }6 s! g
* Y) a* {7 k; C/ f& ~/ y /* Write to the master DMA channel first. */" p) e4 t% `; [+ ] I _' d! y+ p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 ]+ ?- l2 [( W- `" v6 D } ) J. M( h1 O# `0 e
7 u" O9 O' U$ E h, X' i1 |, B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% @! R# J& _1 Y2 `; d" H9 Q# @$ L
. w$ i, a0 r" H. Z, c# r
if(result == EDMA3_DRV_SOK)
/ J6 o& K3 C" Y) X2 g {% \- t: w, W }- v0 E
print2arm("edma3 driver init success.",0);+ y+ E# ]" z2 A! W
}
! @% t/ ?: B( u# P/ b! X/ G}' ?* S9 ?7 F; W* l' A. R
0 W' v3 c! v t# C* q. a0 q# m% H& f9 F* ^2 ~
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。; _, w) d; t4 c1 [- O3 F5 Y( b
" B) ~1 Z7 j' ]6 v/ w
, d6 B* ]! B1 A9 ]1 u6 Y1 W6 l/ Q |
|