|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( u7 m, N4 f w2 P% O
#define PING_PONG_ACNT 1
' D+ n3 }5 O7 w4 Y, c: J& a! s#define PING_PONG_BCNT 8*32*40 + j7 J/ ^4 [% k! O: L1 M" N
//#define PING_PONG_BCNT 1 9 a6 H0 }8 U- _1 m, t
#define PING_PONG_CCNT 1, R# x" [5 s: s1 K8 u8 q, r
#define MCASP_BASEADDR 0x01D00000. z/ p) z- Z) {$ c/ A8 y! u
#define Mcasp_RXEVENTQUE (0u)
$ M% I! U( O$ z- i& U% h; S# S& q
# _% q& D* z8 R" `# g. i/* OPT Field specific defines */
- E/ d( o5 \8 i0 T* W, U#define OPT_SYNCDIM_SHIFT (0x00000002u)
' ?2 y, p& Z# S. x#define OPT_TCC_MASK (0x0003F000u)
/ g2 s6 I$ _: C; ~- P#define OPT_TCC_SHIFT (0x0000000Cu)- d, e1 L0 N) I$ ^ o; H6 P
#define OPT_ITCINTEN_SHIFT (0x00000015u)5 p% h3 O+ g/ G) y3 a" h8 ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 a1 `( } K( D, M f! C# }
: S- C! p% V' q8 R7 q, dchar ping_buffer[PING_PONG_BCNT]; E! w, O' s- g6 l
char pong_buffer[PING_PONG_BCNT];8 T4 n3 V; g1 p/ r* @
' ^ u7 l( H- w, \ g6 T
) D" k s! u6 r2 A, j' q4 U$ ?: z
: C3 c `! T. v E7 C: u4 z0 b0 _, U6 |9 _7 z3 n B# E8 _3 N
static void ys_edma3_init()( m0 j; N/ d( z( m# \
{1 P' }, {2 ^. G7 D( i. u
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 i: H+ R; s: Z0 |$ v5 e$ v2 q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 i' U6 @' k7 ]% W9 K& R! }
EDMA3_DRV_Handle hEdma;7 T! k) }1 V5 `( W h
uint32_t chId = 0;
( w0 y, h5 h1 D# q, W uint32_t tcc = 0;
+ R9 P/ ~: D9 p1 v6 Z" ^7 {' p9 Z
: v( v2 l* F% M& n* p/ j print2arm("edma3 driver init...",0);- n1 N% u8 f# B. L
M3 }* r* {# d# j
hEdma = edma3init(0,&result);
! c! o1 t0 Z* [ if(hEdma)
; d* T ]# B) ]# r5 X' x( w( `6 _ {: m! ^! g- W4 G+ O
print2arm("edma3init() Passed.",0);
8 z* K; {# U# s. j6 T }
# o7 q2 M0 |6 D; A else
S' `5 b) _4 I5 y( m8 a& N2 U {
| n5 r1 h: T. F" }" W print2arm("edma3init() Failed.",0);
, o8 ?6 M2 N4 W4 V }
5 y/ i& j# g1 X$ B8 C
}( R0 ]( n3 X7 r2 _8 y if (result == EDMA3_DRV_SOK)
; u. v; ~0 G8 k: ~9 _ S3 o {
4 F j0 c: Y. E9 `2 ^, A& ]. t) @5 q result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 l% }- D6 Q' D" o (EDMA3_RM_EventQueue)0,
2 |) _) g, h F, |: T; E. H6 b &edma3_isr, NULL);
, G' l" m0 r9 a, A2 `! R7 u }
! B. e0 Z% E* S1 ~% H" t2 q. ^ 9 P; a& G: L& `; j( a; s
if(result == EDMA3_DRV_SOK)+ _+ M; [, }3 B8 |' |" J) A
{
* ~: ]9 P* ]9 a# b% E1 U paramSet.srcBIdx = 0;2 F* M1 U! t/ {+ Y$ w# @/ a
paramSet.destBIdx = 1;$ V6 T0 \! V0 T/ W) G
paramSet.srcCIdx = 0;$ C1 T# Y+ t( W" w3 P
paramSet.destCIdx = 0;
* j7 U( q7 `. v0 _1 }( I6 a) J paramSet.aCnt = PING_PONG_ACNT;" j# ^4 d# f! t# P2 m
paramSet.bCnt = PING_PONG_BCNT;$ a/ X, l; t6 y8 T$ {6 n
paramSet.cCnt = PING_PONG_CCNT;
/ X' ]) I8 {. c1 ]9 x , ]+ W, I0 Z. W4 p
/* For AB-synchronized transfers, BCNTRLD is not used. */
; d$ t# e$ ]1 b+ ? paramSet.bCntReload = PING_PONG_BCNT;
9 |+ C8 ^! X8 J* g- E- i' K& S4 F
/* Src in constant mode Dest in INCR modes */5 r8 }) E5 E8 Z4 l. {' N
paramSet.opt &= 0xFFFFFFFDu;- p5 u# f N. I9 S+ o7 `1 _- E
//paramSet.opt &= 0xFFFFFFFCu;
- O8 N. d; X: |4 B$ c8 M6 L' L; o , J+ Z: V8 O% j$ X5 E: x* ?& v+ n
/* Program the TCC */: X* S! p: Y1 T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; A: `; O8 V6 L+ c
! J. G9 ^6 M H! I( ]# n7 H /* Enable Intermediate & Final transfer completion interrupt */
8 x7 u q' e. c! i7 Z4 Q% y6 T paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% V0 B* ^. N/ a paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! p, w, j# r: I- A9 {
8 D0 Q9 H/ g' `% c; ^5 r /* AB Sync Transfer Mode */# E+ s. H1 p4 X% P2 x; _+ y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 V! A% c: s7 W
+ E5 o+ r( `9 V2 i( J- S. \8 t z1 E3 N /* Program the source and dest addresses for master DMA channel */% R8 W: b$ k6 T( z. u
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. L2 b* D0 i* n" T" D paramSet.destAddr = (uint32_t)(ping_buffer);
; o1 ^- V& } h/ {$ N
9 Y2 P& c# a, f' j /* Write to the master DMA channel first. */, l' y9 G! M' f1 d, d5 a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 }; f: }4 \" w } " o* o& [8 ?" T. B
" A$ W4 u( u! N9 S4 \4 ]1 _
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( Q" D6 N; G7 U; c2 x1 I0 P . o5 D5 Q& G/ N& U/ G0 A7 ~. P9 z
if(result == EDMA3_DRV_SOK)
1 X& X! V2 t. u2 v8 c3 s$ e {
1 A- s5 \3 \8 V3 D6 L4 ] print2arm("edma3 driver init success.",0);7 j( I8 a3 G( ~" ]4 ^% L
} / B" A; S/ {9 D" b0 ~2 G
}; J- K6 D& A7 ]$ ~1 b" H/ y& M- m/ @2 k
0 N5 s& y4 R6 l$ ~, T2 b8 }
; f8 _/ v/ h& R7 IEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' R! Z L6 t3 H9 j. T7 R, a) C& d" R, ?) J& ~% g; u- T( Q
- g3 P% q6 P0 d3 M: h$ n+ d |
|