|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& h/ x, }; d( M* `
#define PING_PONG_ACNT 1
9 j: V2 c0 F5 G#define PING_PONG_BCNT 8*32*40 ( w. Z8 ]* M @' z
//#define PING_PONG_BCNT 1 : P+ @. Y% D/ K$ `: Q0 [
#define PING_PONG_CCNT 1- _) @: I$ K/ M3 [
#define MCASP_BASEADDR 0x01D00000
5 g6 s- Q1 o0 \% o#define Mcasp_RXEVENTQUE (0u)$ `8 Y1 D$ f* L4 U! H- n
P- Q+ w9 I- I7 P J$ d9 V9 `5 _$ |
/* OPT Field specific defines */# V7 N6 b' R* ]) T! N$ y( i- v
#define OPT_SYNCDIM_SHIFT (0x00000002u)1 [/ b; o) s- T2 L5 y' Q6 j
#define OPT_TCC_MASK (0x0003F000u)
+ T6 T4 ^8 u* g& y# Z7 l2 w$ @#define OPT_TCC_SHIFT (0x0000000Cu)3 d. C: Z# C% C8 H& ~; y
#define OPT_ITCINTEN_SHIFT (0x00000015u)% U0 K. s$ a8 w) a3 @1 F8 c
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 Y: ^9 K" @- U! o! n2 i( q- U% j5 E* Y0 l8 t
char ping_buffer[PING_PONG_BCNT];
/ X a: ?5 i3 Q3 S/ d7 `& S* V. echar pong_buffer[PING_PONG_BCNT];. |$ M; s _6 x: j
- N p( F9 p# t
' D8 y% C" R# m, n( z" ]
# x/ r3 C1 m' P v0 d3 q
! w2 P) J; Q) estatic void ys_edma3_init()( _# w& S% c/ l* }7 p& j/ z
{
6 c" m9 g% f, i8 I W* ` EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' L n2 S3 c: O3 n# U6 `# y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& y! M) t9 _" l2 O" P4 p2 [ EDMA3_DRV_Handle hEdma; q( `5 R- t8 F! D3 {/ Y( t! n4 K
uint32_t chId = 0;0 o/ W: L( K! s' E7 {
uint32_t tcc = 0;9 ^0 Z9 R% `% \$ j; C) i) t
" J2 b {8 q3 j+ A* l" c7 Y print2arm("edma3 driver init...",0);4 ~5 s, H6 e: r; e
3 c9 t. u4 T' \) w# O hEdma = edma3init(0,&result);
! \. K# O/ d" i/ D1 q if(hEdma)) R+ {/ @' n) ~, T
{
( N* N( O8 p0 B( D8 m' c print2arm("edma3init() Passed.",0);, X' l0 t# Q; }& `- o
}( G5 [, x; J0 u
else* S, v# b5 F: o, E4 f; o6 O
{
; Y6 {! h3 ~+ |4 R print2arm("edma3init() Failed.",0);; z9 _: z: j# K( B
}( `7 k( O, b- N( q' D5 b, s
8 P. a7 Q7 @6 p- ~7 f
if (result == EDMA3_DRV_SOK)
+ E2 x5 T6 P" J4 Z; B) p T {
& c2 I5 ?3 P! m+ b5 l1 v result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 f: Z" n+ d2 H# `: d0 A4 Q
(EDMA3_RM_EventQueue)0,4 H% U6 k" ]0 W6 p7 J9 S! [2 @
&edma3_isr, NULL);
2 z: \! v. o% G0 c6 j( Z }# ?6 I/ H( J( J3 d, W9 a
+ d9 q! G0 C) l, ], y if(result == EDMA3_DRV_SOK)
5 t% x. ~" h2 N/ F$ ]3 b" F. f {
$ r; m! N8 }8 s1 Z) D$ F paramSet.srcBIdx = 0;
& Y* j0 Z: c y3 P& i& M2 Z$ z paramSet.destBIdx = 1;+ ?/ W$ I5 h0 |# E. E# G: [
paramSet.srcCIdx = 0;4 {, Y5 H. i- ^, ~ o; {* D9 n
paramSet.destCIdx = 0;+ K" h d, c4 I- r7 h" h; Y9 X& A
paramSet.aCnt = PING_PONG_ACNT;
9 T( g$ K3 q- P# a3 N: u. q paramSet.bCnt = PING_PONG_BCNT;
* F% C6 L6 l6 C: l* u8 J" C paramSet.cCnt = PING_PONG_CCNT;
' P$ g# p% f6 o g
8 i1 F# {% s5 l8 e) ] /* For AB-synchronized transfers, BCNTRLD is not used. */4 d1 z- A3 c5 v2 r
paramSet.bCntReload = PING_PONG_BCNT;, ~ {% z3 s. B: k: h% ?( \0 M
" a M. \5 e; }+ s. C2 | /* Src in constant mode Dest in INCR modes */- y8 I9 w0 d3 |; G* P# F5 C1 F: q
paramSet.opt &= 0xFFFFFFFDu;, Z# V; B6 P) R t% Y
//paramSet.opt &= 0xFFFFFFFCu;
! \: r4 m& v" i7 Y7 r: }' c5 j! ? # R/ i% P5 Z/ v1 Q) g% x8 S) _
/* Program the TCC */, D- H! r ]1 J; u0 b5 X
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' X0 p9 R, _/ y E3 N4 \ J7 n, b6 Z1 o+ I, ~( ~& ~
/* Enable Intermediate & Final transfer completion interrupt */. z A* R' K. w+ Y& G
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, Q4 N, l& D. X# d! }, Y! l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! g% G- M: r8 g. z
; y9 H; [4 P7 \6 J, s* u* h+ \ /* AB Sync Transfer Mode */. s, I8 r3 S, P, b/ p6 |
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 D) F7 g$ l H5 }
) D9 E, [$ N; e0 \9 L
/* Program the source and dest addresses for master DMA channel */
# L- f9 z) }5 ]1 L& x- G paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 b2 c, D( [8 q) M paramSet.destAddr = (uint32_t)(ping_buffer);. L3 u/ x3 n( u. E2 N6 [
$ c$ L6 K3 _$ D) p/ P
/* Write to the master DMA channel first. */$ `/ u6 ^" H9 |0 ~0 S0 E% h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);$ B7 W3 F5 s- E: h$ \* \
} 7 }6 ]" U3 P& x: ~6 b
4 v& n. m; ^" W" ]% y result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. V/ M7 S$ S( E. J+ Q6 G# \2 @/ f) @# ]
* R9 S5 g$ f0 A5 Y/ x9 J" i if(result == EDMA3_DRV_SOK)
& m" g' u; |, Z# V& ` {: r# o2 k3 i/ o0 C
print2arm("edma3 driver init success.",0);
/ m/ | E% {( G; i1 _ }
; Z) t5 l/ c+ U P7 w. j}' r: `2 d6 @4 J
. Q2 a: [; U+ d- d+ }1 {5 b
0 J! j0 y* u3 b# X7 @+ Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 e- E1 _3 Q0 k! }; l
! \9 H, B# Q! t/ F$ @2 I" h
! @; x: K- i- O/ D' l. P- Q0 V; e7 J: o |
|