|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: Z! A; u' |! @: M7 H/ a0 g$ N4 Z
#define PING_PONG_ACNT 1( F' f; l8 f: L3 }+ |( V( v; O
#define PING_PONG_BCNT 8*32*40 ' \. C2 v$ K2 S" \+ X
//#define PING_PONG_BCNT 1 % x. |% l% i! Q+ a6 e
#define PING_PONG_CCNT 1
8 |# k& P5 ]. Q) w#define MCASP_BASEADDR 0x01D00000
8 c) j2 n8 q) a- J% H#define Mcasp_RXEVENTQUE (0u)& P/ y0 h" g) q4 Y
* |1 Z1 y, }, |/* OPT Field specific defines */. ~7 x6 u8 y5 |7 x! I& I' v
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 y; a: g1 w! F( Q* X7 a, H& b6 I#define OPT_TCC_MASK (0x0003F000u)
) `( B4 \) J- X" j) {#define OPT_TCC_SHIFT (0x0000000Cu)! B8 O; s [- V) K% ^5 K8 r9 D
#define OPT_ITCINTEN_SHIFT (0x00000015u)& s- m8 u1 {6 Z2 {
#define OPT_TCINTEN_SHIFT (0x00000014u)+ \" K8 `& I; F, V) z3 }8 Q* A+ r
! b) v- R% @. U2 o3 n4 i. y: }char ping_buffer[PING_PONG_BCNT];( |4 Z2 ?4 G0 [
char pong_buffer[PING_PONG_BCNT];: J6 n/ q, I m+ ]
3 {* ~ V9 @& i" a8 i; k( `
! [ k# N8 C% k" m) h! q( h, _8 }2 L. y6 L3 d/ t
; o: U6 c" y3 [+ X _8 X) Hstatic void ys_edma3_init()
$ B4 b- F+ S$ r6 e{
5 @6 l3 k: G) |6 @% y, b EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) Z6 @) Y5 K* i# L: ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;- b; y: j5 J5 r
EDMA3_DRV_Handle hEdma;
" v3 t6 \; N$ @# a7 ] uint32_t chId = 0;# Y! R. z4 }' r* q+ }( v
uint32_t tcc = 0;
8 l$ O# C# H* O& _% W
* H# j& D$ R/ s6 C print2arm("edma3 driver init...",0);$ s! Z) D$ N Q. F
- i. @: \* x9 }" b6 [! p hEdma = edma3init(0,&result);: s) @8 c* t+ a
if(hEdma)% V, M: z9 D5 { D8 X+ X6 x2 C: n* c
{" O2 V3 D8 m. j+ g" t$ M5 u K
print2arm("edma3init() Passed.",0);% `2 E, D+ F: S# L+ l
}% }( I" _. J! N$ r
else
$ k' h' T4 V5 t; l1 ? {
8 Q- [0 ]" x7 t' V( N9 E print2arm("edma3init() Failed.",0);
5 W: D* K2 s6 U$ a3 E" X }
4 {0 x& x* \+ p2 m % l: _3 Y& j' h. O: w. m9 Q6 Z! ?1 J% B
if (result == EDMA3_DRV_SOK)5 O) h$ C! L9 r0 V) `
{
8 A" P& K" Q' [5 j6 O* E result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 V$ R0 q2 T% d- w (EDMA3_RM_EventQueue)0,) o3 n3 o9 l: g4 s1 Z
&edma3_isr, NULL); {3 E0 O6 L0 a1 m# q$ a
}
) ?, W. z- H6 X5 Z& K9 l
( b0 D0 P7 }# |1 T+ A& k if(result == EDMA3_DRV_SOK)% V8 ^! L) E/ I M
{
% r; v$ {! q% t paramSet.srcBIdx = 0;/ G5 B& {/ m8 b5 i1 C" {" S1 N
paramSet.destBIdx = 1;
1 |8 k( K3 X" g- } paramSet.srcCIdx = 0;$ E2 W/ x! z) C# L
paramSet.destCIdx = 0;" I+ P: s% I b+ U2 a7 r Y1 U% q
paramSet.aCnt = PING_PONG_ACNT;* T" E2 {) Z2 i# I
paramSet.bCnt = PING_PONG_BCNT;6 Y$ D3 H. g0 m: M! j& s
paramSet.cCnt = PING_PONG_CCNT;; ?, o# i# G+ Z& {
/ j1 L7 `% g. A
/* For AB-synchronized transfers, BCNTRLD is not used. */3 p. @$ c) @8 ?/ U& f8 a7 j* S
paramSet.bCntReload = PING_PONG_BCNT;
' [ d& G/ ~$ \1 u7 t& {3 m2 w
* b4 N4 F* P- p$ n /* Src in constant mode Dest in INCR modes */$ [, y/ p& |2 m7 ]5 k
paramSet.opt &= 0xFFFFFFFDu;
8 j, P* c D! y: p0 O4 U3 s //paramSet.opt &= 0xFFFFFFFCu;1 i$ B0 {% K" H
& M! C8 ]+ R. X; N5 T% y /* Program the TCC */9 J- [8 P/ s5 m: |7 i. F6 z; `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ L F* J/ r& d7 C# L9 G a2 u2 u( j2 e' [$ g. {: g
/* Enable Intermediate & Final transfer completion interrupt */6 ^) @7 e; h& {) }' \- L" G
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 ?6 K7 |5 h. n! B6 v$ X( }, M4 X, F
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);( P7 u Y B* w4 ?* I( c; h) Z
* n, u3 v( b! l8 Z3 h5 V/ d
/* AB Sync Transfer Mode */
! e4 m! @, E6 ^) @. C( H paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& J5 X0 r* \. n: F" |/ d3 _( {
{! o8 R2 A9 ` ` /* Program the source and dest addresses for master DMA channel */
4 B* g0 U$ _; m' F( O0 i- b" o paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
+ J2 D9 Q* x, E. O8 ] paramSet.destAddr = (uint32_t)(ping_buffer);) C: H' C7 o I6 E- m# [
9 r4 F' U7 O+ Y( q1 { L /* Write to the master DMA channel first. */3 O0 A+ b! `! M+ w2 ^
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. r0 e! v2 P& G$ e! \ j6 g) o } : X- S8 a" _! W; ?
2 f' ?5 b9 F2 l- i8 M1 O+ k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" P5 m! S, M7 H1 e9 h
, s/ t6 Y6 o& y if(result == EDMA3_DRV_SOK) % a* s- k8 B* p# m0 n5 v! X
{. j4 n) M3 U+ S: Z
print2arm("edma3 driver init success.",0);
5 B4 f5 W) Y3 E5 @1 x } 6 R3 B) I* D- `5 ^2 ~- L
}
( L; C3 U8 r0 s5 O$ {3 Y! a
% o, U& [* I# Z( t7 a k- ?! V$ q% @: B4 ?
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. Q( N2 H$ h2 q
6 j1 @1 I1 R: d( L% L2 c! e
# ~7 T+ t' R8 ~4 C. C |
|