|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ s# j! {7 g9 m
#define PING_PONG_ACNT 1
/ v. h6 t" v1 }( M' s6 v! C2 ~3 U9 M#define PING_PONG_BCNT 8*32*40
3 I! I$ S4 l0 J7 ?: G//#define PING_PONG_BCNT 1 % h4 U0 I3 h ]1 F' [: f- W: \
#define PING_PONG_CCNT 1
9 b! G& V' K4 L#define MCASP_BASEADDR 0x01D000001 W8 J) V) a; J+ M" B
#define Mcasp_RXEVENTQUE (0u)
B% T# @( P9 \& A, D, z& d1 ~
4 E. r) H- L' ?3 z) a- O8 J7 X/* OPT Field specific defines */( V+ r! W8 Q7 J$ h/ k- C
#define OPT_SYNCDIM_SHIFT (0x00000002u)3 Z9 U2 ~; }& H' B" T
#define OPT_TCC_MASK (0x0003F000u)$ `, m2 d) B7 f7 R7 d1 M9 y- A
#define OPT_TCC_SHIFT (0x0000000Cu)1 z1 j$ @ M( _. {9 q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: Z: K4 K9 h8 g1 X. c6 n& w2 L8 P#define OPT_TCINTEN_SHIFT (0x00000014u)
* k9 k' o* X8 l5 C \& b. L
" {5 v. w2 ], c, ]5 jchar ping_buffer[PING_PONG_BCNT];7 @/ m: h7 t5 a- b
char pong_buffer[PING_PONG_BCNT];
, L- \& J& L# g1 X" {8 ^: ^# f& V* x/ l' R6 e! t* ?
) _* D8 j% B/ c
# W# i) W0 O0 U8 Z4 Y: g/ H2 y
% g: j& B Q" @0 J8 o8 F( b
static void ys_edma3_init()
0 t2 A- u8 A0 j$ _{3 r. s1 y# H+ O/ i n" b
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 D" \) r9 N0 K0 x8 l$ l% z2 K
EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 l' Z5 f% Q5 `
EDMA3_DRV_Handle hEdma;% f. a- m. ?& K, |: {3 C
uint32_t chId = 0;
# c/ z% V) X* d8 q Z- _3 S uint32_t tcc = 0;
: d" b4 f7 m; ^- ^6 b1 a# `- Y# n2 P7 Z- a9 x) D
print2arm("edma3 driver init...",0);( ]2 y! Z f& o& X! |' P
' k7 r% ?9 O, v) n0 m, N+ N; c hEdma = edma3init(0,&result);3 y2 F- s) u% \, w5 K9 S1 \
if(hEdma)
5 T% B( ~7 A9 G* q# Q2 v5 K {
7 ?9 P& I5 m* g- Z$ O+ W0 d print2arm("edma3init() Passed.",0);0 d" p4 @( J5 m3 ^9 n$ I0 R
}1 z1 u+ ]" w/ I
else1 ?) |9 ] P! z8 w9 Y
{8 W# k' Q& |! x, m* b
print2arm("edma3init() Failed.",0);% d. P5 A" ~) a* z- A
}7 E8 d* _2 S' n
* D% Q- `2 h% @9 V
if (result == EDMA3_DRV_SOK) D. l# F! Y1 }2 q6 M
{7 @5 X) T O& T
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# z8 r, @% r/ F1 K* r2 F+ G+ y
(EDMA3_RM_EventQueue)0,
. ? A4 t2 {5 U4 { &edma3_isr, NULL);4 @* n4 Z' d' b. `2 ]
}
' F' p; \# f/ \9 h6 i- _5 T
1 D7 \) J0 e) a& H6 y- @ if(result == EDMA3_DRV_SOK)- a2 b1 ~( @ B5 M
{
3 R7 I% a. ~$ I paramSet.srcBIdx = 0;
9 Z# A6 N! L8 s! O a3 r9 E% m paramSet.destBIdx = 1;! m8 `# K+ w' v. i3 X! F8 k
paramSet.srcCIdx = 0;3 X8 F8 w( k4 p. E: P3 L
paramSet.destCIdx = 0;
1 ^, \2 e- U9 W' {) O$ X paramSet.aCnt = PING_PONG_ACNT;
% x5 ?$ [: m C, @( k9 c7 a0 ^: N paramSet.bCnt = PING_PONG_BCNT;. x4 S1 B- o3 M3 y S) _2 K( |
paramSet.cCnt = PING_PONG_CCNT;3 B/ F' X" X. [, T+ v- r
. g/ D2 ~. P7 F, g /* For AB-synchronized transfers, BCNTRLD is not used. */5 a8 g3 k1 }/ V: x: Q1 {
paramSet.bCntReload = PING_PONG_BCNT;
, n9 _/ ~6 L, b: [+ j ?+ v" q j* A, M! w
/* Src in constant mode Dest in INCR modes */ A; z: P- `$ A) {. r& x
paramSet.opt &= 0xFFFFFFFDu;
! W/ ^8 N; `! \ //paramSet.opt &= 0xFFFFFFFCu;' d. o( H. \) b
2 D7 {' I/ U$ y% V4 b" M /* Program the TCC */
) w/ c, q6 R( S; { paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: S7 o; v+ x$ W2 i- D N- O; p) h5 U% n. Z' M# |; R% v
/* Enable Intermediate & Final transfer completion interrupt */
N/ r1 o: q% @2 o paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: i' u9 P1 f- d
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' S1 f/ D5 ?2 L: H$ g9 R& W
; ^4 t% j" F& ?. S9 N' \6 n. v
/* AB Sync Transfer Mode */
: c: H) z6 b4 y3 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* `, ^1 s8 r- J* o
+ e1 O% a: q& L ?& ^$ _% j2 g
/* Program the source and dest addresses for master DMA channel */
+ h# o2 j7 m1 k. e paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 `% l# G/ [! @ paramSet.destAddr = (uint32_t)(ping_buffer);
# q4 c; j. ^% u9 R4 {* `# m. i: k8 \: _6 ~, B" T/ y/ n
/* Write to the master DMA channel first. */8 k+ y) Z- J' Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 y) c$ S% G9 A2 \ }
3 z9 B. O# o/ f2 r: v
. c7 Z4 O! U. U7 C+ S result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. r. X! l' V2 C" [* O: @0 b4 D 9 t. L& E1 z2 v
if(result == EDMA3_DRV_SOK)
8 k# N& t$ p, Z! `3 ?. w {
6 Z( w+ W, A5 Z0 H print2arm("edma3 driver init success.",0);1 n7 a# _9 I+ d2 T1 F/ U- I3 o) B+ ^
}
* W6 n8 q' ~ P" {}
0 s0 j1 q6 v3 @/ b* `! [8 I' Q7 E3 A+ `* g( |) Q
1 |: s! e+ o2 { G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 r4 z0 c" B9 H/ e
+ b% }. g1 J& L N, }7 ?" E1 @. A2 B0 ]2 ^8 o7 T
|
|