|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 L4 X% K' S C. H( h
#define PING_PONG_ACNT 1# L2 H6 N" ^8 w% c+ ]
#define PING_PONG_BCNT 8*32*40
1 I/ C( g4 j; {; v//#define PING_PONG_BCNT 1
) `0 N0 ]/ p1 e/ Z#define PING_PONG_CCNT 12 t; u. \$ U' Q/ P, [: N5 r" W
#define MCASP_BASEADDR 0x01D00000
0 p# n' _) B1 r' Z ^2 \( o* ~#define Mcasp_RXEVENTQUE (0u)
* L' D8 J4 k% v5 }* h0 L( U8 R" y
+ @ q% y. V) y( X/ q/* OPT Field specific defines */
( w% b$ n6 a1 f! l, U#define OPT_SYNCDIM_SHIFT (0x00000002u)
" @. `/ U) l& O#define OPT_TCC_MASK (0x0003F000u)
- ?3 }) n( z/ O0 g( |9 }( b6 N% ~#define OPT_TCC_SHIFT (0x0000000Cu)
- q3 l4 k$ q6 I" ]( j1 `#define OPT_ITCINTEN_SHIFT (0x00000015u)
% I1 R. L/ [& M#define OPT_TCINTEN_SHIFT (0x00000014u)
4 Y, n' I% P% \
m( H" L/ r: `" p2 u# achar ping_buffer[PING_PONG_BCNT];0 ^0 s1 ?! @; e
char pong_buffer[PING_PONG_BCNT];
! F" l/ Y" h, ` i0 X. w* F X7 w
! P. c! \% ^. P' N+ M
* B, S' \5 l* o3 v8 k9 [
; g9 C4 P4 ^ T1 c+ X" K2 s* P# }1 w' {* Z: H9 E$ ?
static void ys_edma3_init()
( k$ X$ S% g) p; W) [1 {# H/ j{
; M% H3 V, b1 H+ N, L EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};. v! q5 b5 r1 g& }7 P/ V+ `8 \ c. B! I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ U) Y, `, e) X/ J( v0 Q! C% [$ {
EDMA3_DRV_Handle hEdma;
+ H% ~) r2 i _ uint32_t chId = 0;( {7 n% w6 ?1 L- f2 a; V* Y
uint32_t tcc = 0;9 m7 ]4 N* x3 y8 W/ z
! L8 f |0 ~1 O7 \! z4 l1 h
print2arm("edma3 driver init...",0);7 Z$ U. Q3 \ t2 v8 T* B
+ z! m6 M# K5 K+ X
hEdma = edma3init(0,&result);2 P i1 p. h, V k* d u7 D5 ?
if(hEdma)
, m8 E+ G8 F& [2 k. j1 S6 z, a {
0 V/ o2 t" K& H6 E print2arm("edma3init() Passed.",0);6 q- s; k% s6 g
}
9 n+ R' L5 r; Z2 a, E else9 H" E5 a0 @& K
{8 P# r7 G1 S4 @" \1 X
print2arm("edma3init() Failed.",0);7 [* V$ ]7 { v. N" p/ z4 R
}
$ w# R) g) I4 B
5 A: ^4 v% q5 I- s' ~ if (result == EDMA3_DRV_SOK)
7 g* y. V. a$ J {
6 m$ Z! j6 n7 J [% r! _. C" T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 A2 D: U' H, u2 D7 \" [/ W; p (EDMA3_RM_EventQueue)0,* i" X5 A. z$ Y
&edma3_isr, NULL);( Q9 E' v% F5 C* h. S
}
- I: v1 U$ u4 C3 ]' k5 J* M6 `6 O 9 k$ H9 v* b2 N9 A( G! {7 h$ C
if(result == EDMA3_DRV_SOK) A) z8 z! B4 ]' ^
{
! A5 j- m$ N: q, ]* ~% [ paramSet.srcBIdx = 0;
. ?3 W8 K+ O* H Y( H) G paramSet.destBIdx = 1;
6 C. d$ a2 }4 D: p7 z) M% E6 x7 j paramSet.srcCIdx = 0;( s) U' K& ?1 K7 |" M- E1 m
paramSet.destCIdx = 0;: L9 P8 N; ~# `3 {2 X9 T. N
paramSet.aCnt = PING_PONG_ACNT;
# {' V( F) e2 m1 Y paramSet.bCnt = PING_PONG_BCNT;
5 t4 ^4 M. O, y$ L6 ?0 Y1 i paramSet.cCnt = PING_PONG_CCNT;5 m: u4 F, U' E9 G/ J+ m, P
0 X) u! l# v' ~; e5 y- p! F /* For AB-synchronized transfers, BCNTRLD is not used. */) `% [5 r& x; V) v" A% T7 w
paramSet.bCntReload = PING_PONG_BCNT;
8 R0 U6 `: v- J5 k0 W/ P+ c8 e$ O0 X3 E @5 }
/* Src in constant mode Dest in INCR modes */
6 \" B5 i+ f% V. V5 G9 d& A& ^+ ~ paramSet.opt &= 0xFFFFFFFDu;9 f- F$ B! n% S1 c
//paramSet.opt &= 0xFFFFFFFCu;
$ A$ R! |9 V C( ^3 v
0 l+ M$ J. @8 n5 V9 G0 B& ~% }* G /* Program the TCC */, Q, F9 D3 h3 E2 K
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: N3 p& ~7 k% e
4 i& U& N2 U: J ?% d$ d! u
/* Enable Intermediate & Final transfer completion interrupt */ I) p2 d& [* ?- }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 `' a; M' e( E4 P0 { paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 Q4 S$ E ~* A' x( ?; I9 l+ d( @3 C# _3 R* b6 i/ I l/ \3 S
/* AB Sync Transfer Mode */
$ r7 x: A, h2 W$ C2 j3 N paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); P/ H: c+ s# {
: U3 L5 a% z6 M7 e /* Program the source and dest addresses for master DMA channel */' _, H1 r7 I7 |) }# @: ^+ F
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);( p% n3 v. p" ~. U
paramSet.destAddr = (uint32_t)(ping_buffer);6 C% p4 f3 S* r! w+ q
6 J: l) d( f& r& H7 [' g /* Write to the master DMA channel first. */7 }0 W) W& e/ d* I0 q! x% u) J
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);# U Z) d1 i* ~; j5 D$ [6 n) F
} 4 C' ?2 h, C+ p8 a$ x
; k# t5 A0 ] C* ] result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; l6 x# b# b4 i" T% F: `: |' g
7 ^( |" x+ u# Q1 |' v if(result == EDMA3_DRV_SOK) 4 K/ {- w- ?9 I- `5 `8 n/ }
{
% X* H" _: l! H) B' B l print2arm("edma3 driver init success.",0);
# y1 z6 p4 E5 S" u } : X0 j1 C2 s8 P! c3 Y; [( l
}
4 f( s5 K3 p* s) M4 |* Q" X9 j9 H4 }. Q. }: V' A( L: t* ^5 X
/ S! t. @+ C1 |7 h. xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 z @' d% x: U0 d9 Y/ T2 \& Y2 n' j, A. i
5 [+ V" k0 a) [/ q2 j |
|