|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( [. d4 O4 ~4 I* o' V* v, a#define PING_PONG_ACNT 1
* ]/ z- }6 W( B) R ?) j; x#define PING_PONG_BCNT 8*32*40
+ y8 R# R$ g5 X/ N% m8 g//#define PING_PONG_BCNT 1 / T$ J6 G1 ^; W1 Q' \$ h' o; O0 M
#define PING_PONG_CCNT 1 }# N# p# S6 j- f/ q) G
#define MCASP_BASEADDR 0x01D000001 _- n2 L, h/ c
#define Mcasp_RXEVENTQUE (0u)
0 ~, L0 W8 Y1 v2 {- e. R) X- }4 m4 U
/* OPT Field specific defines */
7 }# ~/ T J ?% @; z o% P#define OPT_SYNCDIM_SHIFT (0x00000002u)- w" Q% g2 G0 I7 T; L6 A( K0 B
#define OPT_TCC_MASK (0x0003F000u)" I8 f% z. z/ m3 u3 V! _
#define OPT_TCC_SHIFT (0x0000000Cu)4 y4 Z: Z* T0 u8 u P
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# t* O. e7 Y" g2 M#define OPT_TCINTEN_SHIFT (0x00000014u)
# q9 B' @" i1 @3 r9 q% @" G, ~# f& z
char ping_buffer[PING_PONG_BCNT];
2 V* B s2 N2 P Y6 Ochar pong_buffer[PING_PONG_BCNT];
) f' B& D+ \ ?: W" O0 v
; b- K5 _5 L" g( i$ w6 L( R
8 D7 h* Y, w5 p4 O
- _/ p# {8 [% q7 a: C; w# t- }7 S U F8 H6 Y
static void ys_edma3_init()# P' F; F" r' V% X, Z& t; p
{
+ d! A3 Z* g6 ~5 F: Y EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 _6 \5 U. P0 y$ U" _- \6 H9 s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 U+ y8 s7 l" ~* S" E2 p' b- ] EDMA3_DRV_Handle hEdma;
8 H l+ k* c1 I$ a6 Y D uint32_t chId = 0;; f; V' H6 O3 m4 H" f- f6 [
uint32_t tcc = 0;$ `' z/ l6 J) O/ @, l
+ h$ \/ N% S* Z* C. @6 M. l print2arm("edma3 driver init...",0);. \- x1 s" f8 s4 N
# M2 K# L5 J9 M+ U$ b: } hEdma = edma3init(0,&result);& C4 \: u8 K: G2 v
if(hEdma)7 q9 a0 S M$ s' F' R8 G
{2 |) i! H7 |8 m3 a
print2arm("edma3init() Passed.",0);
p' `6 m- m2 E3 n4 K, H- w }: ? I/ ^! P- c
else
9 f3 ~" T, f l {2 Q& R: j: g; A$ t% l0 W
print2arm("edma3init() Failed.",0);
# x& l& ^% c6 h! _# H9 g2 y. T. P G }* V1 i j! \+ o- o" r8 R% Y
5 X: U& r' L1 D2 n5 } if (result == EDMA3_DRV_SOK)2 {$ r( b0 U9 o/ V; m) j1 l
{* i. ~6 r8 I. _1 H3 _( Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ | L: t: o' ~4 _; g5 R* D3 l6 W
(EDMA3_RM_EventQueue)0,; K3 [/ o8 |. Y w- K$ b7 @, w
&edma3_isr, NULL);
6 p4 g+ @1 Y& m7 R }
8 ~- F. e* ^: D5 x ; Z6 c2 `6 K: _
if(result == EDMA3_DRV_SOK)- [8 Z& [9 Z. b$ S
{
9 X& K3 Z5 k- M, ~8 ~& j4 s. _! F+ U paramSet.srcBIdx = 0;7 ]3 z: I" T( d: l, O% f
paramSet.destBIdx = 1;
. }/ K) J; x& q4 e2 _ paramSet.srcCIdx = 0;
' H/ O# _8 H7 A% G. i8 v paramSet.destCIdx = 0;
" P% s. ` a1 V: ~8 q6 Y1 p( _ paramSet.aCnt = PING_PONG_ACNT;
! H2 p) _' `" e/ s7 Z0 s paramSet.bCnt = PING_PONG_BCNT;9 M0 Z/ p7 N" q5 h+ l
paramSet.cCnt = PING_PONG_CCNT;& l! w* w( J, a% y' c
' j/ z$ z: T) S; F) m2 [ /* For AB-synchronized transfers, BCNTRLD is not used. */
3 z2 n: M( m# \3 H, z* A8 A paramSet.bCntReload = PING_PONG_BCNT;) w8 }8 x2 l* e5 Q, F
% |/ @2 Y; Z0 `" J0 r7 x+ q' ]1 R8 `; k /* Src in constant mode Dest in INCR modes */" `, u, } K3 e, |1 o5 E3 p
paramSet.opt &= 0xFFFFFFFDu;
& {4 {& O# ?& x //paramSet.opt &= 0xFFFFFFFCu;
+ c/ j% R+ ]% b3 f9 F, L % g7 g' p9 f; q* F
/* Program the TCC */
! ^- w- ^# A+ T1 P paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& d2 n) X2 [2 L
5 E! F: G/ Y# } /* Enable Intermediate & Final transfer completion interrupt */2 D9 w1 \0 u8 [& N0 m9 h" O9 N
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% j- |. ]' {' G2 ^, P! c paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) b5 z7 w5 B( c0 F. A
( [2 `) C6 X9 |! B/ F5 [. I) g7 [ /* AB Sync Transfer Mode */. C. Z7 \5 ~, ]6 F# s
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 d/ N( b: i4 E: s
2 a9 L' `$ I, ^7 ?& \6 z7 b/ f$ s' T /* Program the source and dest addresses for master DMA channel */; u/ M9 A: T0 A5 l; J. F
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);9 p" H; c* \! ?9 r( W
paramSet.destAddr = (uint32_t)(ping_buffer);& L6 y: L/ i( I2 C
% J5 k, B# B( x) U /* Write to the master DMA channel first. */
/ ~$ C4 W* u9 r& ?7 t result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);9 M, B! t, C" M. Z2 M
}
/ i) S! T, }6 H! O( U" A2 g
2 b7 a- {5 y. o% }; Z result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 x2 `% A+ y/ x7 L" E( K
3 [% { X2 M6 d3 s: I* R if(result == EDMA3_DRV_SOK)
+ x+ \9 [/ ^$ u9 {0 @& H( j {3 @* z; A# r* T; }+ Q" @
print2arm("edma3 driver init success.",0);
% s- o5 V$ }3 | }
+ _: @! B" E- z3 {. v}9 u! _0 n! R6 ^- a$ y/ G
, z9 N- Q7 o+ F& w* D' k
- K) o c1 u1 O0 LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( t. b0 [* J4 O* _7 i, O* m( u) N
& X9 G; @; U2 d3 I+ U5 e/ n" J. P' A4 P& c {
|
|