|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: j* z8 `' d' a# ^9 |
#define PING_PONG_ACNT 19 J. o, M1 x8 J, Y& }% ]- z
#define PING_PONG_BCNT 8*32*40
# k: O5 _8 T- w$ J2 f//#define PING_PONG_BCNT 1
2 Y, w: e5 m- x0 i#define PING_PONG_CCNT 1
1 q% Q) x$ ~ y, i) l* \$ t# Z#define MCASP_BASEADDR 0x01D00000$ ~, M. _, }) s0 r
#define Mcasp_RXEVENTQUE (0u)
6 v! W8 m2 J# r
5 Z7 b* v6 Q5 Z, D: I. Y/* OPT Field specific defines */
( ]- o2 A- I7 }4 F9 I" Q8 V/ [#define OPT_SYNCDIM_SHIFT (0x00000002u)" R% t8 C- x* q% t1 A
#define OPT_TCC_MASK (0x0003F000u)5 C- H, F; o& E! u6 {
#define OPT_TCC_SHIFT (0x0000000Cu)
" R( v5 ]' K1 t* J" H2 t#define OPT_ITCINTEN_SHIFT (0x00000015u)! n3 @, ?3 c3 _' E' M& [ |( K
#define OPT_TCINTEN_SHIFT (0x00000014u)
- t& U; |0 K! a# i* r" l' Q9 ]+ P+ Z+ A5 |6 Q( }# r" U( `/ X
char ping_buffer[PING_PONG_BCNT];
& d* s( Y2 \9 _4 rchar pong_buffer[PING_PONG_BCNT];( U8 }* e$ {" j# n$ k% r0 M
9 f4 `. F, Y/ V
0 _: `3 U+ _# F# C2 N* `. Z6 M$ X
/ n% c9 A1 Z3 O5 m% o: i6 C5 E; m+ m. D
static void ys_edma3_init()5 {/ |& k. o4 J
{
# z$ a9 F7 b) ]1 h0 B" ? EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 Q/ b8 q) d u
EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 |% V4 i V+ d1 M1 @4 e, r# [
EDMA3_DRV_Handle hEdma;" r- Y/ P2 L) V
uint32_t chId = 0;: l, J2 A7 G/ Y* {* h; }& H
uint32_t tcc = 0;! a+ b) n! ?: l/ x
- K, v. _6 b' |/ s0 r5 C4 j print2arm("edma3 driver init...",0);3 w5 Q" u9 `1 H2 E* Z) c
" X' m! c, g, W4 c0 B8 |9 Z+ u hEdma = edma3init(0,&result);9 \: m- L- `5 S0 a3 e- I' X
if(hEdma)
; Z+ p: V1 q7 i3 Q {* w/ }. ~, K- a
print2arm("edma3init() Passed.",0);
* q/ X. l* u& F }" \0 L' d: e1 j1 d7 A" B# z
else
4 s# B0 R }0 Z {8 j* g. o: F( }' H! m5 ^
print2arm("edma3init() Failed.",0);
9 }5 t) ~+ h" f" h$ `2 U1 l }1 x" K- i# h* @, Y' u' T K$ x7 C7 b: T U
4 ?! _. F. \: |& s$ P% Z
if (result == EDMA3_DRV_SOK)
: n8 D7 ^; E+ V' V {! F: [; ?( z/ @* l) M+ N! G5 m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* `$ M6 h, g9 t& p8 d. k (EDMA3_RM_EventQueue)0,
2 K4 |( @: ^: R8 | &edma3_isr, NULL);
; l S* ^& @& { }/ S8 ^. T9 D6 X' \0 ~
1 R5 F; e% [7 M if(result == EDMA3_DRV_SOK)
) s1 v" Q) y0 w# i1 W* C {
7 y- N1 ]! ]5 }2 z1 |7 P+ v paramSet.srcBIdx = 0;9 F/ i+ W7 \1 O) f" w
paramSet.destBIdx = 1;
- Z$ o7 X4 I, }. }0 e paramSet.srcCIdx = 0;
, Z# P @6 {6 L9 |" U% J4 \" P9 h" v paramSet.destCIdx = 0;# P3 D o8 q' {. X& c1 t
paramSet.aCnt = PING_PONG_ACNT;
1 ]# f* B0 G7 E- K3 o9 P& g paramSet.bCnt = PING_PONG_BCNT;) v. @$ z' F* T {
paramSet.cCnt = PING_PONG_CCNT;& C4 y# E! `1 X" O" M
1 Z- M5 B- O3 b$ s7 c
/* For AB-synchronized transfers, BCNTRLD is not used. */3 S, {8 }+ x& k) X4 y) J
paramSet.bCntReload = PING_PONG_BCNT;( ~' f2 a$ U0 a* q' S/ N
( ]0 d6 M+ Q1 k! M7 l
/* Src in constant mode Dest in INCR modes */
# k B( r! ~8 W1 W% S. I$ ^ paramSet.opt &= 0xFFFFFFFDu;2 o0 D3 H2 o5 L% h6 ^# D
//paramSet.opt &= 0xFFFFFFFCu;
, T e x3 X' l3 e$ L . W4 |2 D7 h; B/ `3 U- ~7 g, G
/* Program the TCC */! ^& e+ p& \3 u. E4 @) `: F3 i
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! Z, @ ^2 s" f: |
+ E) G" V' M: y+ b2 g! y /* Enable Intermediate & Final transfer completion interrupt */9 Z( L% J! H9 Y7 h- V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 }4 F# G; A" g paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! y/ W$ [1 A0 @
8 _( ^5 v/ W) c6 m; \) h /* AB Sync Transfer Mode */1 U, Z2 i5 b# L+ K5 f) v) B
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 o# v! Q5 c4 \ S; a) q 0 [& h' E8 |: d
/* Program the source and dest addresses for master DMA channel */: G# m& X* n( L* F7 ~8 L5 b$ h3 c: l) b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, p: _8 I2 w" d0 h paramSet.destAddr = (uint32_t)(ping_buffer);
! u& W- ?& x! t/ Z4 V: l8 O$ D# o- t, z* K2 F/ T1 c
/* Write to the master DMA channel first. */. i( N z+ F! p) w: b1 S1 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( h2 W" B! |) n. z' E/ s O7 s }
" v! ^' V) F2 J3 v- a) A& H9 {( y, I; [2 e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 b/ @+ N# x8 P) b$ S
4 ^" R0 d, k+ U& F. k' c
if(result == EDMA3_DRV_SOK)
! {+ s% Y6 `6 r9 `) D {' r! }7 R' s7 ^) W @3 M* k9 Z3 E
print2arm("edma3 driver init success.",0);& U" ?5 Q3 _( x q, t9 L: J
}
3 S1 r3 t" P% o C1 P: `}& y3 X: D$ T7 K' g4 p
/ P- g: g6 w; \% w0 @. C+ i
. u' ]1 w0 n4 P9 {3 f Y3 p8 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# Z& \6 M) \* |$ x- o9 _
9 `5 _9 i) B) d* G5 V/ m
: z+ p! R2 z' P5 }0 J' E |
|