|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% c1 y2 l- B+ L3 p( m# w+ u#define PING_PONG_ACNT 1- H* f# D+ |$ U# ~5 b1 m# o
#define PING_PONG_BCNT 8*32*40
: X! J, s. n; [3 X//#define PING_PONG_BCNT 1 ) o& G1 C6 A% ]$ t8 X$ l) x; X
#define PING_PONG_CCNT 1$ B( Z# H# [9 ^4 f1 x: t
#define MCASP_BASEADDR 0x01D00000
5 N- h$ m' {+ ]6 a* ]#define Mcasp_RXEVENTQUE (0u)
, I" m; J% J0 f( l5 _+ R7 Q& n8 q/ d! R
/* OPT Field specific defines */8 j6 i, |% a5 L! E
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 z% h# E+ ?) e- K# {#define OPT_TCC_MASK (0x0003F000u)
: x/ \" }" V* t#define OPT_TCC_SHIFT (0x0000000Cu)
3 b0 o; K- c* Q8 B3 d#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 ~" [$ O$ F9 Y3 H9 s* U2 z( V#define OPT_TCINTEN_SHIFT (0x00000014u)$ n7 g% ]. l( \& ], R7 G h
: |$ S) I2 B. h5 x6 r3 A7 B U! f' }$ Vchar ping_buffer[PING_PONG_BCNT];
) P# X* R& E' U2 Vchar pong_buffer[PING_PONG_BCNT];
6 R+ j) E2 d" P& |0 n+ q% b# z% w1 s) H1 d: O' W
2 U# f9 u O2 T3 l
, U7 ~9 u' {2 w) r$ I# r, [# B+ v1 ^- Y$ b j
static void ys_edma3_init()
) a$ h! i' p5 d; h2 W7 E{. r5 Z! j9 v) w" u
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 Y$ h. ^$ |- r2 v$ ~$ S6 C EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 [/ H& U& }, h$ g5 D. a# E# |9 Y EDMA3_DRV_Handle hEdma;
0 |7 X( [+ C W4 _ uint32_t chId = 0;
; D, `6 ^0 x6 ]3 F5 y uint32_t tcc = 0;( N6 T; N, M: d5 H# E: _( C
" t( t, r+ I# i7 T( e* T3 F( ?4 f print2arm("edma3 driver init...",0);& x- X* f E) E) r
9 M5 U# u0 R G! N
hEdma = edma3init(0,&result);1 v$ ]3 U& ~4 J S. u
if(hEdma)
8 b+ P" c l, ]7 \( h {
) V8 }- ^+ {2 b! }9 ~; P9 C+ T print2arm("edma3init() Passed.",0);
* x+ k1 F* i) c' s }; |; k3 d! v% D+ X
else
' K$ ]! s2 U; [6 S2 m8 d {
( [+ q& q8 s1 { k print2arm("edma3init() Failed.",0);
+ l- j/ h! `! W2 R, I+ \ }
6 U& h' X6 l* D1 `2 W+ Q 1 w* e5 r T h% u: }, l% z
if (result == EDMA3_DRV_SOK)
7 v- C2 y- s0 \. z {" l2 }5 q5 N8 ]! O! V: q+ S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, ~/ F* [! x4 H0 L7 `; B- V( h0 ~ (EDMA3_RM_EventQueue)0,) ?& h7 w% o, m
&edma3_isr, NULL);
+ M8 w% K1 L7 b }
0 j( N q7 u- y8 Q
7 O2 N$ @+ _& L3 J if(result == EDMA3_DRV_SOK)7 ?! f- A: A& ?6 P4 k
{
- | E, Q7 y$ z/ V" ?9 u paramSet.srcBIdx = 0;; Y" p& q& C L& j+ O' C- A
paramSet.destBIdx = 1;3 C+ n7 I& b& p7 [
paramSet.srcCIdx = 0;2 m$ [$ p; A( a( {: a6 Y0 c- v7 D
paramSet.destCIdx = 0;
* ^3 P! E) r0 L4 ` paramSet.aCnt = PING_PONG_ACNT;0 @! x6 _% q ^$ P
paramSet.bCnt = PING_PONG_BCNT;9 ~ K8 m% R# f1 [; i! B
paramSet.cCnt = PING_PONG_CCNT;
& r" k6 F4 I/ W, @+ N. z 2 `1 _9 E% [" L3 l4 \% _
/* For AB-synchronized transfers, BCNTRLD is not used. */
. o! I9 g! c2 t3 y" [2 ^; t, Z paramSet.bCntReload = PING_PONG_BCNT;) j7 u2 N. E0 U4 k8 A
9 B, j# m9 f0 H. ]1 F' I1 b /* Src in constant mode Dest in INCR modes */0 u. G" [: M$ ^$ B
paramSet.opt &= 0xFFFFFFFDu;
0 B, D2 f5 W' U" B7 k5 y //paramSet.opt &= 0xFFFFFFFCu;
6 Y% i( ]3 y0 @ r- c; V 1 w _& u0 X6 z3 J
/* Program the TCC */( C( \; w$ {5 T& H& X' B- R
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ E* t* x2 S/ `0 s
0 ]3 K# o2 R) r1 y, I3 Y& }0 T
/* Enable Intermediate & Final transfer completion interrupt */
) c- @; y2 Y; s8 \1 ?/ L5 w3 m/ l paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 X9 h4 V2 o$ M7 L
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% c% ^4 k0 I* u& U: I, }
+ O; a# R, C( M9 [. X
/* AB Sync Transfer Mode */
V! m" q" s# r: P8 Q paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' h' P! l* q& b/ K1 Q) b7 R$ I
$ Z+ x' i, _; V9 u* k: n /* Program the source and dest addresses for master DMA channel */
0 t& b; Q4 f( k4 z) l' c0 ~" [. p: f paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);4 }* E1 P3 x5 `9 I
paramSet.destAddr = (uint32_t)(ping_buffer);
( a# t' \. j) {2 C
8 {* e3 p3 a: p* | /* Write to the master DMA channel first. */
4 O: b6 M$ `# q W* o7 j result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, T5 T7 i0 \7 W- R8 T) F' j
}
7 X% F# e2 C! n! A3 u1 w
2 V: Q; l4 \5 ~4 N/ ]/ g result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) E* a, s0 `2 }7 o# U+ s 2 u1 Q% ?2 M& ~0 E* K5 k. k
if(result == EDMA3_DRV_SOK)
X2 t9 `1 }' C" X8 i9 F; W6 K {7 Q F+ X) Q. n, t
print2arm("edma3 driver init success.",0);+ p- C+ _- F/ ^5 H
}
7 E% u h& h. e) z4 _* F% x7 Y5 C}
) r, \8 ^9 g+ r% z( {4 u( P
& @, ^7 o6 M9 B
& x/ P7 `" |1 m z" [" yEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 A6 \# H* \' {8 b( n* b/ N8 c1 v- [3 I1 n2 y1 E+ l, R
, V; q! J( \8 D: c7 F4 o( t9 M
|
|