|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. {9 i G7 {- y& e6 C7 @#define PING_PONG_ACNT 1
3 Z( ~' Q" u! u#define PING_PONG_BCNT 8*32*40 1 R$ ~- {$ q. V+ ]# w2 b& o
//#define PING_PONG_BCNT 1 ; I! H; Q1 G! h) @4 K; R+ \
#define PING_PONG_CCNT 1/ S" V) D4 _9 W" v7 Z( I4 z
#define MCASP_BASEADDR 0x01D00000! \8 G1 [, N7 W/ q7 J
#define Mcasp_RXEVENTQUE (0u)
7 K+ w1 m* N. I- ^3 p& I7 ~2 t B* I8 i T. O, C
/* OPT Field specific defines */
2 Z! ?9 V: o E( X: W6 p#define OPT_SYNCDIM_SHIFT (0x00000002u)
; L, y2 c4 F- f) A( k: q6 T0 f( R#define OPT_TCC_MASK (0x0003F000u)
& u, l* J+ D+ s+ ?, z" l4 }#define OPT_TCC_SHIFT (0x0000000Cu)
9 Y. J" j: s# B$ s% I; N! h% [) r#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 \. O" s- }5 t#define OPT_TCINTEN_SHIFT (0x00000014u)$ J( c1 c. j8 W' \! K. t" Q
; q, H$ ~/ X- R* N- w% c
char ping_buffer[PING_PONG_BCNT];
0 W C6 c |5 z1 rchar pong_buffer[PING_PONG_BCNT];8 n6 {2 w3 J/ S
( d+ H0 @# U! n. k; Q. q7 @) `
' v& b( A' i0 Y! n2 f4 `8 u- q9 V( d( i2 o) @; s* Z
& w. j, s M# [" n; e" V1 astatic void ys_edma3_init()
* f( \2 l5 k2 `2 M' G{' t0 [9 k8 b6 e: [. M1 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: L, o' j, M( ]- W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- K" e7 M+ {! `7 Y EDMA3_DRV_Handle hEdma;2 c/ ~$ }8 ]! i9 R J) [ a
uint32_t chId = 0;; v: Z) r7 w" _ g$ R, T2 b
uint32_t tcc = 0;
. e$ q _ a$ ^% G! }
; O8 Z+ f7 s2 g: V0 z- v print2arm("edma3 driver init...",0);
a+ i3 U# E% s: ?6 {* p d R% a9 U; J
hEdma = edma3init(0,&result);
2 g9 n$ X0 g& n0 l$ Q6 f8 G. d if(hEdma)
$ c0 ]( h, Y( ?3 v: w1 ]- p* U* v+ O {
1 s9 ~# s6 E! S5 _ print2arm("edma3init() Passed.",0);3 _, c# f" R# ?5 n
}
- Y7 t- Z9 \2 R else/ Q5 T( g Y% k2 E% j( c
{# C! z9 R) A9 ^# d8 r
print2arm("edma3init() Failed.",0);
" n8 F/ M4 \. m/ U0 q- z- H }
! d* o5 X0 Y# ^ }2 E) k 3 {. C, x! J( T8 p' Y- ^& a
if (result == EDMA3_DRV_SOK)
5 x6 W2 |8 F' B N' d+ o {
- C* l( g% o* T, O result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
# q9 x7 V C/ U2 _1 Z2 T$ C! i (EDMA3_RM_EventQueue)0,
U" |. L' a# P1 J5 j &edma3_isr, NULL);
8 k* U7 J# K6 s& e y) k3 g }
+ b @. c4 U5 N" L* j
5 |5 |1 I& h0 K3 C2 L+ Y6 X if(result == EDMA3_DRV_SOK)3 O& W0 C2 i" K
{; o# q8 B( j; j! Q, ?/ D- S- @0 I
paramSet.srcBIdx = 0;
$ R6 H0 B0 r- @1 ^- T2 B paramSet.destBIdx = 1;6 ^% p8 N8 q& a* U. Q, Z/ u% M
paramSet.srcCIdx = 0;
0 W' b" L: X* ~3 y4 H1 R4 `0 G& R# h5 B paramSet.destCIdx = 0;# L5 m( n$ a8 G: |) y
paramSet.aCnt = PING_PONG_ACNT;0 l- x! Q; B* u$ g( `% L! s- A
paramSet.bCnt = PING_PONG_BCNT;
8 k# F6 s0 Z7 @' B! @ paramSet.cCnt = PING_PONG_CCNT;; S& ]' W2 @7 ^" q" r9 g
. Q( M# ~/ Y6 Q* {) G' s6 g
/* For AB-synchronized transfers, BCNTRLD is not used. */ ~# G& v7 ^3 W7 {2 ?) o2 r
paramSet.bCntReload = PING_PONG_BCNT;3 e1 p6 ]4 Q, l! n0 a) c" N7 n
9 ^0 @. `; m- f3 ^1 R$ R" m /* Src in constant mode Dest in INCR modes */
4 q8 L, [) ~! E0 { paramSet.opt &= 0xFFFFFFFDu;
7 I' A w, e4 G: f1 _/ M //paramSet.opt &= 0xFFFFFFFCu;
6 {9 S2 Z0 [' } $ i+ q8 a5 z$ L3 v/ j) r+ i a& [
/* Program the TCC */
3 F) r' P: J/ x5 Z K& _& [/ z$ k paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- y/ k- u2 m4 j7 q, B6 ^8 |
9 y W# E; T* u, y4 q; f) B3 w. D /* Enable Intermediate & Final transfer completion interrupt */) c' X" u% @2 m- l1 l
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 h, w4 ]) A& E- n' {; o; C
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 @3 H/ a& Q: i' N! q2 n
" q1 b6 c7 m5 i' c- V) K: D6 C- M
/* AB Sync Transfer Mode */% z; j2 |3 a6 X+ j0 T- |! T$ P
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 o3 j6 l" e' F 6 |5 `) z! F; V& F, D0 z
/* Program the source and dest addresses for master DMA channel */
9 ~) l9 s1 K7 E2 [) x U paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);- D F0 u1 \6 P2 d9 H' Z, D
paramSet.destAddr = (uint32_t)(ping_buffer);
/ u! Z B- z7 N- J! L7 k* ?& H8 M5 F+ Y9 W. M
/* Write to the master DMA channel first. */, Q- e$ [4 p- G
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ p/ T$ y9 A) O- ~$ M } 4 Y9 o4 ?; q- d' f( C* l9 G7 ~5 C% X% t; W
2 L8 K1 Y# y$ b0 U) r2 z; c result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, y; {' S; h2 W8 A# B& U
9 I! K: p8 W2 L4 c4 c
if(result == EDMA3_DRV_SOK)
- W2 a$ Z" g0 X) H% q2 q/ d {
, v, m! l% E3 m3 o2 r! d! F print2arm("edma3 driver init success.",0);1 K; h8 X! [- }: n! S9 W6 V
} / \& U; R% w) Y, S4 Z' O7 T" B
}
6 a. h1 y) |( S0 G4 U5 a, L% H5 ~. x `/ ]+ t0 I) b/ a0 o l4 _ H0 w r
1 M; a& O x. Q4 ~% B& M9 `2 E, s4 bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 X0 N5 e4 P8 H( \$ m6 Y' L! j! f( t6 z$ K# i
% u: @: j( a7 N% z$ d- { |
|