|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 Q$ U& J4 `+ m( Y
#define PING_PONG_ACNT 1
' v- Q1 |1 m: m- g# z#define PING_PONG_BCNT 8*32*40
1 B2 S1 f- \- m4 c8 \9 C//#define PING_PONG_BCNT 1 2 a8 v0 D% G2 v3 @. u
#define PING_PONG_CCNT 1# B# R8 p' J- r
#define MCASP_BASEADDR 0x01D00000
, K$ i, Y# r1 T l; ?4 ?8 q2 L#define Mcasp_RXEVENTQUE (0u)5 l5 l/ }4 |) r+ }
$ k! v; n5 k9 L% f: W$ Z
/* OPT Field specific defines */& |; T% C( Z4 S& D% w: n0 M
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 x) l0 V5 B6 G7 d0 a& [: Q$ }#define OPT_TCC_MASK (0x0003F000u)
9 _0 N; y/ d: N" a" z/ K* u#define OPT_TCC_SHIFT (0x0000000Cu)5 S" M G( Y: t- _5 M
#define OPT_ITCINTEN_SHIFT (0x00000015u)
]. @- i9 A4 T% Z#define OPT_TCINTEN_SHIFT (0x00000014u)
; @$ n' Y. H2 w o
1 W! e- R4 h& l2 a0 E% l) r, xchar ping_buffer[PING_PONG_BCNT];
3 M3 I$ X0 |% Dchar pong_buffer[PING_PONG_BCNT];* \3 V6 I# W$ _, ?5 Z8 i
! ]9 h' ?# G/ d6 [
! A! C) _. G$ x. U+ q
7 N! p- t2 Y4 P- s$ O) ^
3 |6 Y5 H7 Y: p: c" \& |3 v9 `+ hstatic void ys_edma3_init()
2 S. Z1 m/ y1 }3 a- F) K2 m1 x{
# f, g# S5 M6 Q U2 O% y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& X* {. O' ]- k- \. K# ?8 W EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ m5 |$ ~2 e, _6 m) ?# [
EDMA3_DRV_Handle hEdma;6 G# K4 ^: n$ m
uint32_t chId = 0;2 B% t/ W/ g6 N9 n- J
uint32_t tcc = 0;- R8 d# c" i) ^* ?: c0 @3 z
; ~. S# G! l$ X
print2arm("edma3 driver init...",0);
/ f0 v3 |6 @! C: x5 `8 F
8 `7 e- O( K+ U$ p' z3 H hEdma = edma3init(0,&result);
8 [* S9 U7 |* e0 o if(hEdma)) i6 C4 t8 O6 P% I
{
/ S1 X) i' H. x2 U print2arm("edma3init() Passed.",0);
0 E8 [) s. v) P2 Q }
8 o7 w( Q2 X8 m# g8 ]% L1 N else l3 x" n+ V- S0 W
{. u1 g3 V! x" I1 g) [; B! }
print2arm("edma3init() Failed.",0);
2 i( ?. F5 H2 v: G. Z }
2 m" f" \1 v( I( t , P: g5 L3 Z" Y6 Z; |6 p9 u
if (result == EDMA3_DRV_SOK)
s8 B: B. r; L! U5 n. f& c {/ u3 Y) o3 z" N# ?) Y' P
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) v) c; E- m$ j7 o
(EDMA3_RM_EventQueue)0,: [2 b, u7 \' p, v1 O, m: v) g4 i
&edma3_isr, NULL);
) i3 ^" }5 w. j8 r$ {1 p }
0 u- k: D9 n9 m7 r. x9 A
* W* G7 x% c5 Z! c+ s if(result == EDMA3_DRV_SOK)
3 j( F$ o/ g- d. j {
: b4 L8 ^# u( W4 M8 [. X paramSet.srcBIdx = 0;0 x- l4 j! |' c- ?7 M( D8 u$ P$ Q' o
paramSet.destBIdx = 1;
+ h1 C* ]6 M3 \. S( l L" ?; t6 R8 k3 U paramSet.srcCIdx = 0;
+ _6 H$ S' j1 D7 p7 q3 F paramSet.destCIdx = 0;
2 @. c% U* |( o4 g: u5 \/ Q9 d paramSet.aCnt = PING_PONG_ACNT;2 w6 G y* [' y) w. G9 Q
paramSet.bCnt = PING_PONG_BCNT;# m4 y- E4 G) E( E
paramSet.cCnt = PING_PONG_CCNT;' w3 L' J- H2 u- j6 I4 H1 z/ L! X0 y
: m8 T l0 X% K( Q /* For AB-synchronized transfers, BCNTRLD is not used. */! W' y# ]2 R! e0 K6 s$ m. o6 q
paramSet.bCntReload = PING_PONG_BCNT;8 ^1 Y+ R3 \$ h- q3 _7 G3 \* \! B
4 q, A% ]9 u0 |* Y' S2 @+ s /* Src in constant mode Dest in INCR modes */6 Q X6 n+ J$ \* i
paramSet.opt &= 0xFFFFFFFDu;
6 z$ N7 W* F' w& E //paramSet.opt &= 0xFFFFFFFCu;
* A7 \7 G& U/ u1 v/ f( v% s0 A
! n2 Q3 x5 v% l /* Program the TCC */7 R: @0 A* h; P0 c. I& u2 T0 A; X
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ A$ b/ X- t; P
" t( w( M. `" U/ m/ ?/ d; n' J
/* Enable Intermediate & Final transfer completion interrupt */
- U; Z& O2 p; n" S4 T3 M" ` paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 p" m; t9 r2 Y3 k6 g5 y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 d3 X- D4 Z) k# |6 H* z+ p8 u5 G
/ ]4 b2 h" r: O. N) i3 I9 \& D* S /* AB Sync Transfer Mode */! W, r) A+ K9 Q: j$ o
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 ~& }" P- Q) [; ] F: F0 }0 s
& N. q# w: @# h t \1 R4 ^ i" e /* Program the source and dest addresses for master DMA channel *// |% h! ]: K1 A) @( f
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
X0 r1 ]8 S, \) C8 b) H- J paramSet.destAddr = (uint32_t)(ping_buffer);
* w, h) H- l: `" t
3 j$ w5 e1 V/ V. X( \ /* Write to the master DMA channel first. */0 ~ f! u4 P6 R2 a. }; m" R& ~8 W3 B2 B9 u
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" u1 C+ x, L9 L# `$ r: x% D1 f
}
- v ]$ x6 m3 Y) y0 a$ t8 I1 x/ ~& I+ U! x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( x& w6 W6 I% ~0 m5 s" }
$ F) `+ K( A9 ?. d2 d: @! {4 R
if(result == EDMA3_DRV_SOK)
& A$ U( h0 r$ F5 J {5 e% I# `( q7 _: f4 o
print2arm("edma3 driver init success.",0);
5 T$ W& t' i* x0 D( O4 R, I# T }
( n0 c7 R4 l( ^% n0 C8 n/ H2 x}
9 W* |6 n6 ]/ A8 k" F. z" B; J! [% T( I/ z6 S2 _- B2 e
; Z! m" r, p5 E: f- REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ p1 m* X0 |( P3 l/ j w! G. K n" m0 e8 D) w. j
2 i! b" t) Z* p9 N& _ W) c+ I |
|