|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ n3 s, K( g" Z# w$ O8 Y% g c
#define PING_PONG_ACNT 1
8 i; O b9 q& Q5 \( T#define PING_PONG_BCNT 8*32*40
# ?* L0 U. q% n/ R) A//#define PING_PONG_BCNT 1 * k* V. f/ R( n, z4 n* n2 n; e1 ?4 j
#define PING_PONG_CCNT 14 v; L+ m) h* M ^, N
#define MCASP_BASEADDR 0x01D00000) c$ w% S* e! f# p- C# T, e3 Q
#define Mcasp_RXEVENTQUE (0u)* a; P3 N- L/ Q4 M# x' k+ _6 l/ A+ D
4 I- h* m' B# }$ R. T/* OPT Field specific defines */
$ c: m: U X/ I2 M#define OPT_SYNCDIM_SHIFT (0x00000002u)
; Z( k% k, h# Y1 ?8 A) [#define OPT_TCC_MASK (0x0003F000u) t) R' D' ?+ T- G1 `
#define OPT_TCC_SHIFT (0x0000000Cu): w5 S: q6 [ i# t" F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 ] k; V" L1 B5 l! G V#define OPT_TCINTEN_SHIFT (0x00000014u)$ Z Z$ E; ~) F4 u
8 o) v+ k1 S$ N
char ping_buffer[PING_PONG_BCNT];
2 ?3 r8 Y7 o! | b" M" L' vchar pong_buffer[PING_PONG_BCNT];4 O' ?, r, F- `" h
8 b! `7 v9 B3 W& Y
# e2 i2 ~& {$ w0 f/ b, q6 Y1 K* }3 @! ?' K" T' L5 r+ E
) k$ u( ^% I+ c, N' @0 B$ I& D
static void ys_edma3_init()( [8 X8 J) `6 a! g0 J6 \# @
{5 p, E, Z* {% e: \- A
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; w! n7 A' }3 M! {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 Z, y7 x1 W: n* U! u3 u3 D. J EDMA3_DRV_Handle hEdma;2 p5 d- M- Y7 h3 w0 f
uint32_t chId = 0;
/ A9 N6 g) n# O uint32_t tcc = 0;9 e( B& [ \6 O+ }2 |7 C
5 T" N) j8 h' J' d
print2arm("edma3 driver init...",0);$ ^" f" `: z0 X! r5 ^
4 q* E; y: H, u4 Z! ^5 u hEdma = edma3init(0,&result);, n- a% J( l! r. n+ S7 i
if(hEdma)
/ W, {2 j% S( ?# i$ A$ d& E$ v! E7 @' f {$ z& S8 }# U+ U8 f
print2arm("edma3init() Passed.",0);, {7 C1 ]. L4 Y! ~# q
}( X! t- V2 K9 Z6 J
else1 e9 y- G; s7 u9 ^7 l' [
{. f( O& H8 G- Y0 t
print2arm("edma3init() Failed.",0); j$ B1 H) A- F& [
}
- j0 N2 n+ U: {7 `, M n1 f' e
$ ~6 e' L5 J! G1 h if (result == EDMA3_DRV_SOK)/ I8 p0 J' v% ^2 p4 D& V
{* ]9 E9 i% z% u' V; b: m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
v8 k+ O M! o! i (EDMA3_RM_EventQueue)0,
5 I" R! Q1 Q( ]9 C4 q &edma3_isr, NULL);1 H; s! L! v7 C4 ]! \
}
0 Q* H4 T( C, [* h: b
S/ j7 T- S' B* h* t/ r1 s if(result == EDMA3_DRV_SOK)
, P/ {* m4 _3 i7 n: V& X {9 X8 ^5 o4 \! o, M
paramSet.srcBIdx = 0;
3 x* q0 w6 x; A! Z" b" [, Z; t% ?/ V3 F paramSet.destBIdx = 1;
3 r+ |0 Y( c+ w( s paramSet.srcCIdx = 0;; F4 A7 r5 P: f! L) `% U9 f
paramSet.destCIdx = 0;
6 X1 a* S4 L, X8 V+ Z2 i$ S paramSet.aCnt = PING_PONG_ACNT;; L: ~0 U0 m! q( Z2 V3 W& E" w
paramSet.bCnt = PING_PONG_BCNT;
. u9 y" f1 L, O- m8 v9 y paramSet.cCnt = PING_PONG_CCNT;( F0 C% U: B$ d) i. N, x. V
7 N% c+ V3 l. c3 P: O" S /* For AB-synchronized transfers, BCNTRLD is not used. */8 Q0 z/ p( R. ]2 C0 x& C' H, d6 D! F
paramSet.bCntReload = PING_PONG_BCNT;& [, h) ~0 ~- l2 p' ]2 {
2 _+ A& M5 t7 ^: K, c, f
/* Src in constant mode Dest in INCR modes */: ?7 x8 S! t4 C6 b D- T
paramSet.opt &= 0xFFFFFFFDu;
9 y8 a/ l; I% R! ^' C //paramSet.opt &= 0xFFFFFFFCu;
# z6 A7 H- C2 J3 ], k5 e. z w3 D9 L; G& Y& k; a, w$ j* e
/* Program the TCC */. t$ s9 j' Y t! |
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 o8 ?; g3 a1 ?1 v- ^- L. V6 _
/ E! z2 B& c, V& X, c9 d /* Enable Intermediate & Final transfer completion interrupt */ ]3 Y2 @8 P; @2 @- ?
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( C, w" R" a) n2 f# o2 h
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& o4 @ T5 _9 q. K6 [9 z3 D; _# Y, x) f! V
/* AB Sync Transfer Mode */
# g, o: N8 I5 v3 [2 Q" ~ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 _7 o% g" s; u4 c
& J/ T8 D; h- l& d, r: Q /* Program the source and dest addresses for master DMA channel */
/ E! @% k# i' a7 N3 O% i. }6 t paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);7 n- c/ `; A: o9 D1 T
paramSet.destAddr = (uint32_t)(ping_buffer);0 @2 k, N1 B( `( L3 K c* \3 p
3 h& o. p1 I2 }' s- T. L /* Write to the master DMA channel first. */2 n9 @ ^: Y4 j, Q' j7 e
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
) [% V- y+ H6 k. ?" u8 @ }
) ?: d7 y: {" o' s# M" r% R6 z9 Z* d+ k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: _6 x( P, P5 |
v$ x0 t7 n) L+ ~
if(result == EDMA3_DRV_SOK)
/ l8 J; A! N, [% ]! d' | {
# [ d: r0 I2 h' A6 P2 U8 f print2arm("edma3 driver init success.",0);
. t2 E X# R1 @9 H+ Z; C4 h2 Q/ e } - N+ h$ N% g5 x: s8 l2 T, M1 ^, B
}4 P; F; y, J3 u+ t- ~1 @, b
8 u$ e9 N3 I/ y2 K3 k0 J
6 `! e$ ^% [6 M# a! r5 v+ `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 k5 v3 v7 D- ?8 |/ B
$ _" x) C3 \+ t9 V
9 b+ R1 c" \& w8 [/ r |
|