|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& M4 O$ ~% m* o& v) K8 ]* T: b+ J
#define PING_PONG_ACNT 1& @( K4 q4 Q# V% C
#define PING_PONG_BCNT 8*32*40 8 E( S! C4 H `4 M% f- Z- f( f
//#define PING_PONG_BCNT 1 8 r! H9 }+ U; K( |1 P4 N O
#define PING_PONG_CCNT 1) S$ P" B. {9 n2 W& h, g4 R% Y
#define MCASP_BASEADDR 0x01D000006 e3 ?5 T) `$ k! T
#define Mcasp_RXEVENTQUE (0u). O6 @6 k7 d+ s0 M; n& L$ I$ t8 o
5 u" E/ q5 `+ S" d+ q" n% [
/* OPT Field specific defines */
# d0 c$ J$ E6 B# |9 B#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 F. Q, b# u& S" O- e8 x1 \#define OPT_TCC_MASK (0x0003F000u): X& I0 }5 v) d* t& c) w
#define OPT_TCC_SHIFT (0x0000000Cu), l# u3 r% M3 [& M8 t
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 h) Z# z% u9 d( z. s. @#define OPT_TCINTEN_SHIFT (0x00000014u), z# R' \- \# L0 _' b! {) n( y y
( y5 c7 J* v# t# B8 ?char ping_buffer[PING_PONG_BCNT];, _1 W5 O0 P9 m2 C
char pong_buffer[PING_PONG_BCNT];- J8 E7 g9 H0 o
/ o7 G2 \7 v- K+ d* E
$ I5 M- s: {! y) D+ f1 R6 a+ T4 T0 a# U% h% _- F6 O
3 @. y& ^7 H* ` R. _static void ys_edma3_init() t4 I4 k* i. P- E
{, r; G# B1 R1 H: R( M0 v! d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; d$ o, i* X* v, D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;" v' [! ^( B9 G
EDMA3_DRV_Handle hEdma;4 C0 i, |& E% ?' d2 S- G
uint32_t chId = 0;
- ~+ V) }: Y' u$ W! e- f2 `# J uint32_t tcc = 0;
# p1 B7 l/ }% q& q1 f# ?! C7 X! u" E& _7 L; o' _
print2arm("edma3 driver init...",0);
2 l6 v$ J8 F& K, v0 R% s
! T# h! d- o8 V1 Q% P1 L# t hEdma = edma3init(0,&result);8 X$ t7 ?: f9 U& S1 v
if(hEdma)/ Y! k& ?0 O* K, J. a
{7 M W/ h$ P1 @' U( F0 f0 l' }
print2arm("edma3init() Passed.",0);
U, ^# x8 g! D" G- x$ r3 x! V7 }7 D }
. t K! j0 `8 Q else( d3 ^1 J+ |. y+ q9 b5 F: T0 S
{% @" w) Y h) x
print2arm("edma3init() Failed.",0);
% C' k! n, O6 g f, I( I; ^% y }( n5 ?+ M& r' k8 a y" x
" ? x5 J( C7 e6 N O) p
if (result == EDMA3_DRV_SOK)
( B6 R. X2 p% ~4 |2 M# c# U" i {
; ]4 _/ R2 O* \ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' d6 {) }7 L) J' r- ?8 L (EDMA3_RM_EventQueue)0,
% r0 `2 s. O/ B2 O; K &edma3_isr, NULL);- B; U U6 d f1 c# J, n: q+ u
}
% m6 m1 L1 H: r& n% v
: E6 Y: |" M- l& c4 s) i* ^ if(result == EDMA3_DRV_SOK)
+ g# C& y4 @& U. h0 W7 L- [/ M {
7 ?- p- b+ k# M0 _ paramSet.srcBIdx = 0;
; F0 H3 Z$ t+ |# m paramSet.destBIdx = 1;
) Z( N. h* w) w2 j paramSet.srcCIdx = 0;) g: d/ u, g! }# ]" d% l
paramSet.destCIdx = 0;9 ^/ G) I7 m, m# d; ~% a
paramSet.aCnt = PING_PONG_ACNT;
* d: q& c) U. H# z& b paramSet.bCnt = PING_PONG_BCNT;* _1 e5 r, l% h
paramSet.cCnt = PING_PONG_CCNT;+ `2 b: N+ t0 K7 x
6 y9 D/ D7 o* a1 J" v- x2 s
/* For AB-synchronized transfers, BCNTRLD is not used. */ A0 P& _ n. i* q# }1 `+ h. n
paramSet.bCntReload = PING_PONG_BCNT;. B) l( ^: ~4 p; \) s6 g% {" c
% B; K. o# L9 R, v3 G
/* Src in constant mode Dest in INCR modes */
+ s! d! Z+ T: E9 v7 {/ M! t; X paramSet.opt &= 0xFFFFFFFDu;
6 u! v0 {" q: D2 Q0 W' S4 P //paramSet.opt &= 0xFFFFFFFCu;2 k% e2 a$ c0 c2 f- }7 n5 J
- d3 H, {( v/ i" M$ N4 J% x /* Program the TCC */
1 F' Z: N+ i g. A# g paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& L5 [! l6 I. G3 I& I4 f$ B
* `1 |( {1 B' @$ B% x: s /* Enable Intermediate & Final transfer completion interrupt */
1 \2 y& w4 @& K( C A L; K+ A+ A! B- d paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- T0 u" u. M% w+ N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 B* I8 G1 P# ^8 q# b
* k& q# T2 n0 Z/ ]" U$ l
/* AB Sync Transfer Mode */
$ C4 E$ [* s2 j9 K paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 j) G l2 d f% C! A1 g
5 N1 i& O/ m7 d. g* L, Z /* Program the source and dest addresses for master DMA channel */
2 ]5 c( r+ S7 B* r* i: E. L paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);; J5 u1 z" E' o% b( v
paramSet.destAddr = (uint32_t)(ping_buffer);
7 [, A" j$ d* l: F( ^
$ Q. x3 \1 G5 T /* Write to the master DMA channel first. */1 d7 p$ K5 O; w6 L; H
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 p' R" x2 d) q& {/ l }
M- O. w7 b$ l" K
' g: c8 T1 \! C8 r$ S result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 N0 L1 W/ r. V3 t% O$ J. N. m
" ]3 N$ t: F. z: L* z3 U if(result == EDMA3_DRV_SOK) & {2 R4 n0 f: B S
{1 V% A0 U% H% [
print2arm("edma3 driver init success.",0);# q l/ h# g4 P0 ~& [) P' @
}
9 F# |) q* L0 N% c, \! e2 q}
& x2 B1 ?- g7 y( n# D# N: u
$ N1 {* A* Y8 R6 t
, L4 R( R) r+ ^' I; @( REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 X2 R! q% z% n( s/ O$ G, i7 P. [1 ~. ~* ~1 ]- `8 R- V4 s4 A" W
# ^0 `: t; m A! |
|
|