|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* P7 M3 N& _3 L, H#define PING_PONG_ACNT 1( B( b: M- N$ Z. ]4 e
#define PING_PONG_BCNT 8*32*40 , L8 S1 b3 x+ i4 h
//#define PING_PONG_BCNT 1 : m0 U# V" M* X( v5 D
#define PING_PONG_CCNT 1; R4 l. W5 r/ d1 e% e( h0 ?) `
#define MCASP_BASEADDR 0x01D000003 t" p- ~. [3 q, _% ~
#define Mcasp_RXEVENTQUE (0u)
4 @7 p n, A1 l0 d
" f$ a* k! ]: k( _/* OPT Field specific defines */0 a5 K5 D1 D8 r
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% I- a) A! h9 T#define OPT_TCC_MASK (0x0003F000u)
9 Q9 S+ Z, k( i* h+ r. b#define OPT_TCC_SHIFT (0x0000000Cu)
- O8 B! W, w. t. L. x+ n" l! [#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 B2 q/ q+ E; {3 C7 W; a3 ]7 q0 t#define OPT_TCINTEN_SHIFT (0x00000014u)
0 D; u$ i/ z, t) e5 G% P( m7 i% m5 B7 J6 U0 ~0 s
char ping_buffer[PING_PONG_BCNT];
; K/ I, P$ H* @7 Q# \& L0 X* F3 Gchar pong_buffer[PING_PONG_BCNT];
# g5 a" G+ T% ?5 H2 t# s/ U3 r5 L7 E2 ] t5 `
W1 ]6 l1 k! r1 z% z' L
5 f# `9 H3 ^+ T3 {& K
, J$ ?! F& C# \9 d( Kstatic void ys_edma3_init()
% `8 S( r* O; J Q& |9 v{! ?# X# K( ^' { L9 f
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. A4 Z+ h. t! M" d3 d7 Q: m/ ~ EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 ~( v1 ~4 w' K: g1 V
EDMA3_DRV_Handle hEdma;
0 }, H$ Q7 |% B( E- M uint32_t chId = 0;% Z/ U, y2 {- ?; }
uint32_t tcc = 0;
+ w$ P e7 q7 u9 r) B- f1 K, H7 l* y; a0 Q C
print2arm("edma3 driver init...",0);$ e2 R! y! R s. Q# j
. f O2 s! O" L6 j. ^' d0 Y, d
hEdma = edma3init(0,&result);
L3 Z; w) C" h3 e. B: T, \2 A& x if(hEdma)
' `& I1 f2 ^- c, c' M {' \) n% t/ l/ d0 v+ z7 s
print2arm("edma3init() Passed.",0);2 _; o2 [" Y1 p ^& c
}( y7 j! l& Z* @$ `4 H# q+ T* q
else. O4 x) u* G1 I& L5 O7 u, N( u
{5 Y4 x7 J/ P4 W/ {
print2arm("edma3init() Failed.",0);. f# D4 [0 U1 c8 W
}
9 _1 v* Q& g* O1 }- \4 w # q% p# O& H% C+ r5 M. m. Q1 S5 \5 X1 _
if (result == EDMA3_DRV_SOK)
. Y( g8 ^8 g0 O1 Q1 j7 B {
/ @8 D+ @6 x0 x s( C, _+ I# s5 Q( Q3 G0 ~ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, ?6 }( w7 D8 M* o C4 A ~
(EDMA3_RM_EventQueue)0,
, w: b1 `- u9 M &edma3_isr, NULL);3 p4 B0 e: C5 X. q& T* b, D
}
, H# G" W! d M( q6 W$ ? }6 R
. E" _% @. X, H- { J3 m0 Q' k if(result == EDMA3_DRV_SOK), s. E: ?2 m, ~( l) g
{3 @) T* J1 F. S( F$ ?# r$ c
paramSet.srcBIdx = 0;
. [0 {! j, a }: ^9 T/ G& Q paramSet.destBIdx = 1;
! ^4 J2 e+ a# G* ? R; x$ T' q9 S paramSet.srcCIdx = 0;3 B5 o1 A; o# P3 Q% f2 \
paramSet.destCIdx = 0;
7 z$ l! O0 K! v paramSet.aCnt = PING_PONG_ACNT;
0 f7 x8 @9 K# { paramSet.bCnt = PING_PONG_BCNT;
8 P: D+ [0 P; `2 Q! S; x+ K paramSet.cCnt = PING_PONG_CCNT;6 @& o9 D8 K7 ^; R, T
) o1 A1 Q! [ G* |* S q# S
/* For AB-synchronized transfers, BCNTRLD is not used. */! D8 }! F& H) E8 y
paramSet.bCntReload = PING_PONG_BCNT;
1 g X- [; j i5 f" s
; |3 q& Q { V' I; b& D /* Src in constant mode Dest in INCR modes */
1 a5 y6 s5 j9 ?* | paramSet.opt &= 0xFFFFFFFDu;( N" d8 ~5 \; _$ M! m8 k. }7 `
//paramSet.opt &= 0xFFFFFFFCu;
+ d9 U8 n5 w" K2 C* t
6 _; I; x, @/ _( Z$ Q2 Y9 A /* Program the TCC */
( r! Y& X* Y1 }' q paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' j1 Y5 ?2 G {) t7 [! { v d0 \7 D8 d! ~ p" m8 `, e3 j
/* Enable Intermediate & Final transfer completion interrupt */
R/ D2 `+ v/ {+ ^. W+ ^ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( H p. L1 S' X2 R; Z paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 {: K) q' c$ b$ [9 w, l
9 F9 N; z3 A3 @
/* AB Sync Transfer Mode */
6 g0 C* I! R/ B% u) U' X" J6 y* l paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ [( S/ Q: `# K6 T t5 ?5 K- @1 J" N0 H+ V; G
/* Program the source and dest addresses for master DMA channel */5 G! X$ Q9 o( `- c2 s# p4 E# {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);7 H+ ~4 Q8 y' P+ O
paramSet.destAddr = (uint32_t)(ping_buffer);
2 y8 k) K) h, q9 [% V# V; B" u' F* |4 x- k; P3 t. Z! m3 x% Z' \
/* Write to the master DMA channel first. */1 ]( i) i. }1 Y8 Q: s( c
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. O7 I+ o' g. s `4 _- o: w! l/ d } 0 W! i3 d: P1 I( g
. [9 N9 L4 D4 I( L1 ^1 J0 [5 y5 X result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 a2 u+ C& O; p; _ M / h- G9 q/ |: R/ l3 j
if(result == EDMA3_DRV_SOK)
0 s: V( I b9 f: [ a. ~8 x {
9 l+ h/ r9 U0 B$ D print2arm("edma3 driver init success.",0);
! u8 j! O' k" O* H4 v# g6 U% M } # H( i/ p8 c- `2 u
}
* H2 V: ]- w2 M# r2 w- u4 C/ D1 [7 U: u. P
0 F0 u$ w/ o5 l4 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ v0 N9 `& i A+ a. l$ q+ h" ], M6 i) S1 h/ y$ p
3 T# n7 ?# i- G& Y$ T6 k" `% B' F
|
|