|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 A' `+ I' u3 q3 e0 L0 I# L#define PING_PONG_ACNT 15 x4 u/ ?/ Q: ?+ n
#define PING_PONG_BCNT 8*32*40 0 X) p7 y2 \- H/ T2 d; H$ x0 ^
//#define PING_PONG_BCNT 1 6 T" P! t' W) o" \+ V9 f+ V/ Q, }9 [, |9 j
#define PING_PONG_CCNT 17 G8 a, Z) m6 Y+ K
#define MCASP_BASEADDR 0x01D00000( f9 {) _1 J; G8 q0 x+ h9 a
#define Mcasp_RXEVENTQUE (0u)9 Y/ G3 e4 e# y, k- `1 g' c0 W
3 \7 b4 T* P0 }7 B
/* OPT Field specific defines */& r, _( V1 ?3 N. Q! w2 {
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 \, F) N5 A. |" L9 v2 e1 o/ z#define OPT_TCC_MASK (0x0003F000u)0 ~6 B V- O2 P0 L/ \, _
#define OPT_TCC_SHIFT (0x0000000Cu)
: U; g/ w: ]9 G4 i$ r4 b#define OPT_ITCINTEN_SHIFT (0x00000015u)" _& V- _0 U5 K2 A* k% t
#define OPT_TCINTEN_SHIFT (0x00000014u)
7 W3 U9 G1 B& ^% w4 s+ l$ k* F2 H! v9 V6 [- F2 J2 |6 C
char ping_buffer[PING_PONG_BCNT];% v" w6 r$ f7 ^: l7 v
char pong_buffer[PING_PONG_BCNT];
+ ?0 R$ R6 J- ?1 J9 S
0 @$ u( h( s3 j' w
1 i! `; {% E; U: Z* o
- G" M: B, B1 `; j* a9 K( ]# t, q
! l1 a( q" v G0 {. ystatic void ys_edma3_init()4 y3 N5 u* W: K( B( u/ ?& d
{
8 P: E: r" S2 n( U1 | EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ `/ _0 N4 T. N0 |. V$ b
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; ~# J# G2 L" ?& L8 |0 E- }3 g/ w8 w EDMA3_DRV_Handle hEdma;- y( R6 S/ k! R" ^7 f2 v" m
uint32_t chId = 0;
5 R0 x- v' q6 n; F4 T6 o uint32_t tcc = 0;
- ?" b% I# W3 p; @5 o0 p6 t" v
! T6 r$ R$ F7 I* a print2arm("edma3 driver init...",0);
+ H2 U& @; b" Z5 s- c+ W; B1 g
& e7 m$ u4 l+ y# |! d hEdma = edma3init(0,&result);% `1 P8 ~! v. I" A
if(hEdma)$ j9 `' b1 q$ s# G' x
{
: |( l7 U, V2 k& @4 q+ c/ V print2arm("edma3init() Passed.",0);; P2 w- i$ _$ d. `" R) b4 t7 F
}
; z% Z; A9 m, p else
3 B- C' ]2 L) B1 T {0 m& R2 M3 q9 \/ t& O* _( ]
print2arm("edma3init() Failed.",0);
& _/ o1 H2 a! t) v/ c! K q1 [ }
; p$ `+ o$ j1 u & o1 t: Y. W. w" B
if (result == EDMA3_DRV_SOK)- i, d' S; i: I6 z( L) o( ?
{
4 H; A0 N% i* J% A result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 Y9 S a6 k. w
(EDMA3_RM_EventQueue)0,
. j0 u5 }# ?9 W2 X* i1 } &edma3_isr, NULL);
) s$ P( p; E3 d }
1 E) N% B! S& L6 k K- K/ ~, t
1 E! a) q0 q" n* v0 u }! i5 }3 ^" h if(result == EDMA3_DRV_SOK). a0 S8 O+ j9 ~9 g0 \& A
{
# }" o. j7 z- D$ r6 R# Z+ f2 Y paramSet.srcBIdx = 0;+ M2 X! x m: B, b; ` U
paramSet.destBIdx = 1;4 A# Z9 a3 J; N/ H
paramSet.srcCIdx = 0;2 Z' @4 _+ P; L E) W
paramSet.destCIdx = 0;
4 E0 K0 V: P$ D9 Y& l paramSet.aCnt = PING_PONG_ACNT;" b. G$ y$ J# Z+ r- m O
paramSet.bCnt = PING_PONG_BCNT;
: L0 I' i9 M, r' L8 K paramSet.cCnt = PING_PONG_CCNT;- R/ t5 C/ G! d! }
# z" Z( U! v# e- e- G* i! A3 h6 o /* For AB-synchronized transfers, BCNTRLD is not used. */7 U9 h9 g" k4 _% p* v2 N
paramSet.bCntReload = PING_PONG_BCNT;
5 o7 Y( n3 i8 f: ~) a3 o* [( b
( `" o( a% E! h3 G; ?6 Z /* Src in constant mode Dest in INCR modes */
4 D+ O/ J1 F0 f3 L paramSet.opt &= 0xFFFFFFFDu;( q/ u% K9 `* h/ p* ~1 M# X$ I' X) W
//paramSet.opt &= 0xFFFFFFFCu;
6 {! K+ R+ \$ z7 y) U# T s
6 I1 o( x" R1 e: u& V% M /* Program the TCC */
+ B4 C4 Q3 O1 ~2 Z! N paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: `* o/ p+ C$ o! }
! ] |8 w$ T$ Y! V1 O+ z /* Enable Intermediate & Final transfer completion interrupt */
2 o0 q3 w6 ?* O" w, ~ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# k1 t) v( q, H# l3 W
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 n4 `; y |( ]* S5 N" `
( r% \) w- j- B! z: C7 L /* AB Sync Transfer Mode */6 M3 g- }6 E5 I2 h! g3 X2 J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 A' Z8 s2 j2 }- K
# O8 p4 j/ q: j0 d: ~ /* Program the source and dest addresses for master DMA channel */
8 M+ c' I7 i- r( D3 u0 V% G3 {+ U paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* C+ l- q4 a+ _7 h$ e' o) e paramSet.destAddr = (uint32_t)(ping_buffer);
9 ]% {" Q; ]5 _- d$ u! r- S/ D. @" Y: u! T! i: ~- z
/* Write to the master DMA channel first. */" Z3 m6 F, J* u) h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- o6 I3 |$ g# G7 O$ n/ A l2 r
} : W5 W' h( o/ P, Q+ B
5 T& w7 x& Q; _. Y result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. q' Z- @- K& X6 p0 I) l ' r2 K" `0 z5 m8 ^! b
if(result == EDMA3_DRV_SOK)
$ t2 O, Y \% M: j; V) A2 V {' d% k& z9 ~. ]% b# Y& s! f
print2arm("edma3 driver init success.",0);
8 r$ D- O6 f; l0 K( X: V# b } % n' ~7 V* N7 a! }% |" r4 P
}& _5 Q4 d. S" q
- q# O7 S, R0 X0 h' H& s3 c$ }
, x( f3 J5 B Z( C* E( a" v% T
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 ~5 \% j( G9 D9 L t1 w1 x+ V
3 z0 ?, y! V9 o- B2 S/ _
5 N3 `6 |( [$ z: ? |
|