|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% E8 V0 N. t* X. l' I. ?7 v#define PING_PONG_ACNT 1. ~5 G( W* E, Q& U. @5 I
#define PING_PONG_BCNT 8*32*40 4 r2 Q; f$ S0 [& V% Z5 Y% w0 D
//#define PING_PONG_BCNT 1
) f! N* D7 e7 G8 O4 N. o#define PING_PONG_CCNT 1
S, ?$ q% n" v# ?. O9 b#define MCASP_BASEADDR 0x01D00000' h' O8 s# A2 R: L1 I% U" G
#define Mcasp_RXEVENTQUE (0u)
' [3 W; I; Q8 v- i H% t! n
+ f, H. |) j& l9 U D! V/* OPT Field specific defines */1 w% c: A/ u$ N- g7 n/ t
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- S) U0 i+ g6 }6 _8 f#define OPT_TCC_MASK (0x0003F000u)
; H9 A1 B. u: [: M% k#define OPT_TCC_SHIFT (0x0000000Cu)8 _; k& \. W& j6 u( I- {
#define OPT_ITCINTEN_SHIFT (0x00000015u)- A7 ~! Q: ^; n' _# {$ k) k8 p. @
#define OPT_TCINTEN_SHIFT (0x00000014u)9 x3 Q# U7 P6 T Z/ x
' o( I% u5 V% O
char ping_buffer[PING_PONG_BCNT];5 j5 ~: I/ f- ?" |0 C
char pong_buffer[PING_PONG_BCNT];
: R; Z$ O; O9 H8 I
5 H) ~: ^( a& W6 J3 A8 z' X0 R/ X) ]9 |/ J# M9 {
- @1 L4 W' a. p" B
# V C( r! W, @4 I
static void ys_edma3_init()
$ L1 U( G( ]+ p9 J- S. d" ]* o$ y{! R4 {- w/ n( O" o! c* _5 K4 k
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( @% p$ @; w3 U. Y S, B" F EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. S4 f8 K2 |6 \* T2 l EDMA3_DRV_Handle hEdma;$ U' M! A" ?4 J1 t8 L
uint32_t chId = 0;
7 _( Y# I/ Z8 O+ e! H) f( Y uint32_t tcc = 0;
7 H, N5 s; _% G5 E0 i) M$ G; v5 V* V( u/ k( L8 M3 e1 C
print2arm("edma3 driver init...",0);5 Z2 U! ], V0 _8 M6 M4 d$ h% ]
% D5 ^3 \+ b6 J. Q5 U0 f6 p hEdma = edma3init(0,&result);) L8 t2 ~* z, T
if(hEdma)# C$ _/ v% O3 ?
{' r9 o9 Y i- g! l% D1 _& F1 x* @ J
print2arm("edma3init() Passed.",0);
: \# X; m$ R% R# P5 P }8 O; D w1 j& q) {+ ~ R) M6 E
else
/ F: o; C( X' A! `0 R {
3 G& ~# K) A6 F1 T, u# a* y* _ print2arm("edma3init() Failed.",0);9 a+ a0 W! w) K) ?* E
}# o0 c. h: k4 f+ H+ N
( i9 o3 y! u# W# R8 T) C
if (result == EDMA3_DRV_SOK)
8 [* x% t L, X9 Y* }2 B {
' J5 }2 Q. \" P" o/ `% n* N result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ `9 X+ u1 }$ {) K( ]! S (EDMA3_RM_EventQueue)0,' [6 z) B$ v3 @4 r7 o
&edma3_isr, NULL);
$ G1 u& w/ W% q: G1 B! R$ g! ?7 f }
+ @$ u. e. Y! s9 j
+ z2 j) E7 K% x3 M2 a if(result == EDMA3_DRV_SOK)
0 ]' |& u) G5 k {7 E; s( G8 _$ h3 Y0 k# s
paramSet.srcBIdx = 0;1 d3 a' c4 u! i9 l9 {0 [
paramSet.destBIdx = 1;* C! k3 W0 K$ c; t# E
paramSet.srcCIdx = 0;+ U6 V2 }' o* u1 w
paramSet.destCIdx = 0;
5 c& g- t# `8 T( `# {+ q% x, d; ]; [ paramSet.aCnt = PING_PONG_ACNT;
1 K$ {/ J4 H3 F! x- d paramSet.bCnt = PING_PONG_BCNT;
4 @( z2 x8 Q; o: s8 X, V- ^% i paramSet.cCnt = PING_PONG_CCNT;
& f, [4 \; ~' a, ?
+ p$ L! A. |" Z2 I. N; L6 e% o. Y /* For AB-synchronized transfers, BCNTRLD is not used. */
2 D+ ]$ {. h+ _% e4 k. B paramSet.bCntReload = PING_PONG_BCNT;
0 u3 }9 ^* O6 k" T4 F; F9 ?! W( ~$ h5 I
/* Src in constant mode Dest in INCR modes */ N1 Y( {. @, _3 ]: Z4 b
paramSet.opt &= 0xFFFFFFFDu;
1 |4 Y) N: H3 O7 Z+ H$ K8 V //paramSet.opt &= 0xFFFFFFFCu;
: M. i! J7 ]- }! a0 ]
/ j/ U2 J! Y" `+ M' |2 z1 o' q8 k /* Program the TCC */+ c$ w% U, G/ B$ x1 y+ S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ u1 C- L5 u) j/ K
7 Z7 a A5 ~" a4 q V* X /* Enable Intermediate & Final transfer completion interrupt */. v- J# C5 P+ S$ f3 c3 b. T
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);5 G& g4 Q9 f- e7 z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ X, d4 `' R1 Q0 w" x& q5 s+ u9 u6 r+ N P: W& b x8 ^3 t
/* AB Sync Transfer Mode */
! F7 s3 |% C8 q* [2 l K5 i* g paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 O% }$ r5 E+ g8 j( _' O 7 w, G( i7 G" j% s! Y
/* Program the source and dest addresses for master DMA channel */: s; }* f, ?6 c0 b1 n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 L% Z$ y/ {7 x0 F J paramSet.destAddr = (uint32_t)(ping_buffer);
s% V9 u. Z2 \, Y
( ]* A+ w$ j% P) S) x /* Write to the master DMA channel first. */# B9 l2 ]4 _0 \7 m
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);0 N" }% A+ ]8 F6 y( N
}
$ s% n* {2 _$ j1 k
" d* i/ B S- x- {5 ] result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 J$ M K+ o9 P; X2 ]" x - y, f& v9 _ B: G' a6 N: X5 D: T1 H
if(result == EDMA3_DRV_SOK) # B" D$ ?& ~5 q4 C. e$ m
{
( @( g: u% F1 C4 D1 {2 M# D. a print2arm("edma3 driver init success.",0);; W! M2 f8 S; {' X5 Y W1 B7 U
}
' q$ t' s7 m$ ?}
0 {4 A9 j. L! F% G O" E. _
3 R; i$ y" ]! u
3 }- _7 R9 K$ c+ ]# S, b( VEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 y+ T9 B* S! M. }
3 Q9 ^- G, J- K
8 W" i: n: b' _0 f$ @ |
|