|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, l8 N2 p4 E d( U/ P#define PING_PONG_ACNT 1! c- B9 n1 a) s5 i
#define PING_PONG_BCNT 8*32*40
?6 [+ _/ F1 u: z1 c- s( t- j//#define PING_PONG_BCNT 1
; p5 u- j' b5 D1 O) D#define PING_PONG_CCNT 13 o4 H, z/ K0 M9 B. f) R
#define MCASP_BASEADDR 0x01D000006 j ^% ~! X. u
#define Mcasp_RXEVENTQUE (0u) a6 L. a( s3 [' r
( ~, B ^: J; k( A }/* OPT Field specific defines */
+ z! ]/ y* p0 n1 | ?, j9 J! G#define OPT_SYNCDIM_SHIFT (0x00000002u)
k2 K' t- ~3 }3 {9 V#define OPT_TCC_MASK (0x0003F000u)/ `1 u# b7 Q. k1 F
#define OPT_TCC_SHIFT (0x0000000Cu)
; T8 {5 \, S/ @ k#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 n% X& F) o; B2 h: D" j#define OPT_TCINTEN_SHIFT (0x00000014u)! K- z7 I' I6 b n
# r! c& [" C% uchar ping_buffer[PING_PONG_BCNT];
5 x, W' t0 H' Y& I" a) ^' _char pong_buffer[PING_PONG_BCNT];
' s8 D4 L: F( J2 A [
3 o0 \8 |$ x: N4 | m9 n1 l( }5 {; P, l4 g( u$ ]( A9 R' X
o" j! V% l0 s5 v2 ?
$ |+ d/ E3 N1 V( |- S9 C
static void ys_edma3_init()/ |3 c2 z: L7 S0 g4 m
{2 r7 y. f* C* @5 W! v" J: E; j
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, F9 m: Y0 A9 |3 s7 O% c4 N EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 I, Q: `5 q% N
EDMA3_DRV_Handle hEdma;2 a9 e7 m3 [9 {! u4 G4 l& @4 |
uint32_t chId = 0;: J8 e$ E, c7 h- G1 e, I- t' K; k2 H7 G
uint32_t tcc = 0;. l |2 b* g1 W6 ]5 e$ {
: B* q0 M3 a2 n9 T' l4 T: z) x print2arm("edma3 driver init...",0);; S8 U/ u& `9 L* ^& X' N
8 [7 C5 D: z4 F8 v/ h; ?" Z hEdma = edma3init(0,&result);
% o0 D1 E# P. f. z* j+ ^- s$ _ if(hEdma)
2 @$ k* z( o$ w- r4 C4 j# [7 u {
. K0 H' c. |! t" Y0 c print2arm("edma3init() Passed.",0);1 ]+ L( l4 e D
}
. T% K8 E4 E- e0 ? else1 Z) ?; L0 C" X6 r
{
% ]0 H. x' O1 F3 I8 Y' } print2arm("edma3init() Failed.",0);. u( V$ l1 ~3 j. s/ I: u
}
9 Z8 \5 m( r- C$ O7 O * g3 |- s' C- H6 ?- f$ s
if (result == EDMA3_DRV_SOK)
1 O9 H/ D& R# _& W1 A0 w {
- I ?, w1 n! h5 m3 n' N) Q$ Y) |+ N( u result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 n3 p% K8 W6 b! @) B (EDMA3_RM_EventQueue)0,
" j o7 H8 {8 x- D8 p5 C0 F &edma3_isr, NULL);% x5 r$ E$ ]( ~/ |+ I/ W0 s
}
$ @, @, W( n7 A% Q* U! b + a( M4 a1 v0 H, `+ j- O
if(result == EDMA3_DRV_SOK)
; I9 t K. i7 S$ B {7 M0 O: R# w `5 ?5 ?
paramSet.srcBIdx = 0;. `: x2 m7 m" t& I2 S! i( H+ Q3 Q: O
paramSet.destBIdx = 1;% z: Y+ k; L0 w/ z8 m
paramSet.srcCIdx = 0;6 O8 \" L( c2 G5 \" V# \; v, `% s
paramSet.destCIdx = 0;! N8 F3 \/ S/ _0 H6 d( [
paramSet.aCnt = PING_PONG_ACNT;4 D. E: W& | V l4 z1 g- O
paramSet.bCnt = PING_PONG_BCNT;2 B7 M5 ]! m$ x
paramSet.cCnt = PING_PONG_CCNT;3 i- X# n- s. T' G) s+ q
+ j/ z) G% G L6 \8 w* |
/* For AB-synchronized transfers, BCNTRLD is not used. */" k! X1 U' O' o5 w2 f, f/ z
paramSet.bCntReload = PING_PONG_BCNT;: ] a/ k; T6 L) x B
3 F- O1 \+ l( ~. k1 h* j# w* i, p
/* Src in constant mode Dest in INCR modes */
4 r+ }' p1 G0 t% j. u paramSet.opt &= 0xFFFFFFFDu;, C% ^0 X1 z8 |4 e4 v v5 f
//paramSet.opt &= 0xFFFFFFFCu;
5 e) d: o% E! O1 h! [% v , t& L; i: ?3 v: t7 _: O
/* Program the TCC */
% r, Q! ^9 f* J" i/ d paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 N5 w' v% i, _9 F; d0 k9 u* l
/* Enable Intermediate & Final transfer completion interrupt */3 p! X6 F0 v# @: z, w' V+ n0 `+ f
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. Y# @5 g c7 n- [9 A paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) b5 n6 }: q6 T6 M) H( e
2 [2 n, b9 t: v* d /* AB Sync Transfer Mode */
+ F) ~3 O% M5 H3 D+ e6 Y% c) r6 C paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 A0 h b& m) V& a8 l' l0 ~ & I0 i+ z( b8 x/ k3 t) t6 D8 V
/* Program the source and dest addresses for master DMA channel */
- O) A7 Z$ o, k |& T, Y5 s" z paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 s* V! @) `0 X paramSet.destAddr = (uint32_t)(ping_buffer);
7 i) R9 U, f3 p) K
h# O8 {! X Z- ^ /* Write to the master DMA channel first. */
, \9 U" z9 \9 o- V5 K result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);' Y+ ], j3 t7 F4 E2 O" g, ]
}
2 {* t8 P. g( E5 ^% u
8 i. A+ B0 M8 h! o+ W result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ l% W: p( [# n2 S' G6 g5 W : {) Y; V' H: {8 i: g
if(result == EDMA3_DRV_SOK) 3 j; _& B. c4 }, ?5 A! K. |/ c$ m
{/ J! c' [/ c; ? ^+ s: W8 e& N2 a
print2arm("edma3 driver init success.",0);- _5 @" R9 z0 D) O
} - _% @- B" I: i* x7 f: v' z# t
}
+ \: n% o3 G' h" t, N' Z% c& e6 M' c/ l
( Z7 N# u" [& n( U( [$ }% c9 U' y3 [4 k% m- l5 d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ U0 M& V$ A- Y' H7 B3 I
6 Q2 }7 e$ R8 ]7 Q/ w B$ F+ _6 i. `, Y g
|
|