|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 z; `+ ~# S; Z( k/ ]2 b6 o
#define PING_PONG_ACNT 1/ w F5 U' B7 R0 B$ E" l5 J7 _
#define PING_PONG_BCNT 8*32*40 # z. T& H, k4 m0 ?0 g
//#define PING_PONG_BCNT 1 0 u9 M3 U! d3 J
#define PING_PONG_CCNT 1# o# c) o1 O: G' K2 i$ }( ~
#define MCASP_BASEADDR 0x01D000007 n9 z: J3 x9 H) ?! G0 e; P
#define Mcasp_RXEVENTQUE (0u)
$ l' v0 M$ H0 W3 u- `, h) Q) Z7 i: ]6 ~* T
/* OPT Field specific defines */9 T: W. r, o, t) o) S% d8 _) q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" Z" \. Q' c' B0 u4 P" `2 b! S#define OPT_TCC_MASK (0x0003F000u); |/ m9 z/ b; ]0 Z1 s
#define OPT_TCC_SHIFT (0x0000000Cu)$ X: F* W# N( l/ J+ g
#define OPT_ITCINTEN_SHIFT (0x00000015u) I6 R* r) \9 v) `5 C. ~3 C0 I
#define OPT_TCINTEN_SHIFT (0x00000014u)
, x O* b; Q' E+ f9 A+ y8 f: J9 G$ u& j y' s U% t
char ping_buffer[PING_PONG_BCNT];5 G: P! F4 t( v" w# n$ H
char pong_buffer[PING_PONG_BCNT];( ]1 k# I2 t+ D: q
- k# F4 ]9 j. z
3 ^3 n9 ?. t/ ]$ S2 B3 c) `. m7 a7 Y& f; R
- x8 n( a* p. U1 B4 l v6 R
static void ys_edma3_init()
, R% L7 Y8 C: k7 y% s8 v2 ^{
7 k3 c; \9 |5 s$ `+ x! h. y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 `- O3 T; }. I* R5 W* t
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, ~# m% Z7 B, R4 _' ?! Y: m$ e EDMA3_DRV_Handle hEdma;
2 K6 _9 i" U& @4 {9 t! g; a+ \1 } uint32_t chId = 0;; K' S$ L3 R6 ^4 S
uint32_t tcc = 0;# ~: y4 D* G* {. B! A! l! `
* U/ V; ?4 M: ~) ?- ~& R3 {( E print2arm("edma3 driver init...",0);9 ]8 W7 p# t3 y% \$ {
y( C7 k. N. [! c
hEdma = edma3init(0,&result);
- t0 h# B: D8 K8 W) ]$ [ if(hEdma)
6 L% n% s4 {# } [8 @1 t {
: T9 E& d9 g5 B$ Z$ P& S% d8 n2 p: q print2arm("edma3init() Passed.",0);
5 b2 W7 l6 L5 v' |# Z. @5 X }
2 m" u4 c" t& k! E else O5 b1 A! _% u) y: m! ? @
{
0 Y' e7 X5 e& [8 G5 _ print2arm("edma3init() Failed.",0);5 s- t1 c6 _4 s& _" E3 P
}3 ]8 k z, ~6 x5 U- l; T! _' B
5 f% r" k$ I# f) Z1 @8 i( K
if (result == EDMA3_DRV_SOK)9 d5 l2 d- c% R/ l. J7 W
{
5 a- c' u3 I! F result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 R5 O& ^7 q7 U* s6 Y0 p
(EDMA3_RM_EventQueue)0,7 z3 b5 R4 m+ H# e9 @- A; h
&edma3_isr, NULL);
7 [, l, R4 w, d5 D1 B( M, ` |( V }8 t2 w+ B- u7 g. a
6 v2 I" f- M3 Q0 b
if(result == EDMA3_DRV_SOK), A* w3 Q" \: C( l/ y* v
{% G3 Y4 Y8 T2 o( g7 X+ E: h0 J/ V: C0 O
paramSet.srcBIdx = 0;
$ f4 n- T7 S; n; t paramSet.destBIdx = 1;
, B; r" Z7 ]( \" p1 a2 s7 m paramSet.srcCIdx = 0;) W1 G4 W$ |5 q- ~
paramSet.destCIdx = 0;
! ~5 c$ {; E9 b; V1 P paramSet.aCnt = PING_PONG_ACNT;
) K$ y1 S; T; s! ~ A paramSet.bCnt = PING_PONG_BCNT;3 x' W/ [. ?" M6 C% a" I
paramSet.cCnt = PING_PONG_CCNT;
% u. h) h. e8 h! B3 o ! q, I, ~) ~% B3 o/ D; b/ R
/* For AB-synchronized transfers, BCNTRLD is not used. */3 U6 f" ~, J# r1 M3 R( e
paramSet.bCntReload = PING_PONG_BCNT;
+ {" V( D& p' d4 R) e" S. a, P8 m, E [1 O# \: w$ k
/* Src in constant mode Dest in INCR modes */* Y" W, Z% I7 S2 y2 e/ H. c* s
paramSet.opt &= 0xFFFFFFFDu;; `: I) E* D4 s7 d3 O
//paramSet.opt &= 0xFFFFFFFCu;( I6 Q* F _/ q+ x4 J) x. r w
9 {' e0 I2 j1 F /* Program the TCC */
. @8 c6 w8 g5 U$ @ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 M8 l" J% z; N ?6 ^. `8 Q5 e
5 A$ g, D# q0 z /* Enable Intermediate & Final transfer completion interrupt */% @# |. s+ r5 M, Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); z3 u/ T' _& q1 l& ~" D- [
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 j! c: B" |' ?- k# X$ x: Q1 w. w+ D1 g4 t
/* AB Sync Transfer Mode */
5 Y7 u2 {$ b {7 U5 I paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 K' L8 `$ x; @) P' P% E7 J7 Q 9 ^( n# P! V H: q) f8 F
/* Program the source and dest addresses for master DMA channel */5 h, q; o8 G7 H. q+ E5 Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* X2 Y2 w2 w B: a paramSet.destAddr = (uint32_t)(ping_buffer);
8 x/ N. u b7 X. q+ ^$ ~' c0 X7 i, M: Y( M" g9 v
/* Write to the master DMA channel first. */
2 X8 C: y0 |1 s# x result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ O/ j# p$ ^$ S( X+ _ } ) j+ c3 B. m- V! c- F: f
) K' K$ {( d3 ]8 s, L2 C. o: x result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ ]$ z! L; r* S1 K# l
, A8 E+ G$ a k. }; a [% [ if(result == EDMA3_DRV_SOK) $ @' e3 M; l1 c" }* u
{
! f) t" Z$ f, y4 z2 ?, \- K6 E* j print2arm("edma3 driver init success.",0);
8 a3 Y# @; S( f! }6 g# U. p3 l } % ?& ^. ]- X0 k6 v8 F- _
}
* i: r5 o- X, K% A' Y9 u& U2 a& d0 Z" Q0 w; Z4 Q6 q: a
) B7 [3 |( K [# r; BEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。5 |* a% P8 N7 z1 ]' w
. V4 P' a3 e# I7 w; H
# |% k0 N8 ~/ _ |
|