|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. \; x5 d9 v4 J- ?9 J) N% ~2 a
#define PING_PONG_ACNT 1
( p# s* g$ T$ b) H( j/ v- j#define PING_PONG_BCNT 8*32*40
; f, L) q4 `! k//#define PING_PONG_BCNT 1
+ _% O& X. ` _ P2 ~#define PING_PONG_CCNT 17 e" ^+ v! n! e) S' h8 O
#define MCASP_BASEADDR 0x01D000004 L7 M8 m1 D2 Y3 A
#define Mcasp_RXEVENTQUE (0u)" t; }6 I, K/ B$ F& V6 s8 r
r4 D( y0 Z4 Q. f/* OPT Field specific defines */" \% r' z, w8 j% ]8 l
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- ?/ W ]# ?" P#define OPT_TCC_MASK (0x0003F000u)
8 \( N; a* Q7 {9 T+ x/ j3 j+ f#define OPT_TCC_SHIFT (0x0000000Cu)
0 ]2 a8 F% g! v( U8 f# @#define OPT_ITCINTEN_SHIFT (0x00000015u)( W) g# A! ]/ a% N e" Y' ]* z3 m) b
#define OPT_TCINTEN_SHIFT (0x00000014u)
2 l7 ]/ p, C, T; j
/ K0 Y/ _4 A ?5 D+ |6 qchar ping_buffer[PING_PONG_BCNT];* d% n; R7 t' X& u& a3 [8 N: ~
char pong_buffer[PING_PONG_BCNT];
y- V& A# E/ i% ^6 \" c/ L
* N. o) }* y# d) {' ]% c$ T. ^! T2 c" F- h6 x
& [0 m ]% H2 z9 H- o# R, K9 D4 d5 I& z8 ^; w3 |
static void ys_edma3_init()
$ C3 u$ g6 H1 y* @% j{; |" C$ y* R/ G* _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ R3 x: h& V1 ]1 W
EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 Q$ i* {: G; Z* S
EDMA3_DRV_Handle hEdma;
2 n4 {7 @0 o3 B( N' B1 V; B uint32_t chId = 0;4 F! }& z2 E: w9 n9 ^( ? ^
uint32_t tcc = 0;6 @: U6 h: f* e! [/ y$ V
^% m# o( O" @9 }$ |* r6 f# t; P
print2arm("edma3 driver init...",0);7 Y4 w# z3 u9 S+ G: n$ H
( E# B z7 [7 P$ V: V1 u2 z. J4 c hEdma = edma3init(0,&result);
6 z* `, J4 A- {. |! U. { if(hEdma)) `1 T0 A& R, z2 u6 p2 o2 c
{
% F3 G- I" K3 i% B4 W print2arm("edma3init() Passed.",0);; D/ w# K! U$ ] J4 O
}
! ?' t# U% _, R# Q6 w. M else
* u5 v- ^) |" J9 K$ k7 A0 P {: O/ j; B0 E2 _/ G
print2arm("edma3init() Failed.",0);
$ P; Z1 b4 F/ p% f } T6 }- S3 o& l0 C( h: p; E X
3 X5 ]4 u& [! o+ S* J if (result == EDMA3_DRV_SOK)2 P* [ R. F; v8 x4 o+ [+ c6 e. F8 z
{1 I5 p! B& X; o1 `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" n1 \. x2 G3 h( X (EDMA3_RM_EventQueue)0,
8 C6 b. k/ V/ Z1 N &edma3_isr, NULL);) `( o3 }3 x, x
}! T) _2 h% I) B* k- v# @
+ I- |7 P) F9 n
if(result == EDMA3_DRV_SOK)
+ q! s z; i4 D3 n {- @$ p# e/ R( C- _: K
paramSet.srcBIdx = 0;( N& }, I. Z8 W( i1 i( Y# m
paramSet.destBIdx = 1;/ ]; L. ]* V y3 r' e1 ]' t
paramSet.srcCIdx = 0;% O: D! E- b+ G: x) A
paramSet.destCIdx = 0;) N% ]3 d% [* ` V' P4 w) l( e
paramSet.aCnt = PING_PONG_ACNT;
0 o4 {6 i; _+ r5 g, e paramSet.bCnt = PING_PONG_BCNT;
( [. I; I |' @# |* _& F; H) v paramSet.cCnt = PING_PONG_CCNT;2 `3 \5 E0 l {/ a
5 M- Y8 O y, }, {+ R
/* For AB-synchronized transfers, BCNTRLD is not used. */
( f) s) u# {8 m/ ^ paramSet.bCntReload = PING_PONG_BCNT;% k# z& b. A1 Q" c
7 h# z, A3 K" \( r9 u4 {
/* Src in constant mode Dest in INCR modes */, n+ F/ z; ?+ X! v7 \; y
paramSet.opt &= 0xFFFFFFFDu;
6 r6 w) x( Y) f4 {9 a' R/ R/ {. ] //paramSet.opt &= 0xFFFFFFFCu;6 |6 \' n* L+ F, m
0 V4 u" _/ o+ b5 }% f3 b /* Program the TCC */
$ b( a( T/ i8 h' S, |# b paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 Z5 p) V2 I; Q. E- v" Z: k5 R1 e. Y( Y* R& h7 i
/* Enable Intermediate & Final transfer completion interrupt */# d) a# l! F2 ^/ U/ }' l6 A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! u Z3 G) g0 ]8 Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! ?4 A5 O6 c# z3 e& A
. x- w& I7 l3 n- b" o$ Y* A; Z. Z /* AB Sync Transfer Mode */3 U( V% E! \; ]! y7 t, n2 S2 r
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 N; H* S# L- r4 W5 ~) I$ r/ P
0 x+ K8 C, `# T0 O/ f2 d4 s /* Program the source and dest addresses for master DMA channel */. q' H& d8 V# v* F! x( d/ n! C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);3 G7 `9 z! f7 |8 W2 P4 J0 a
paramSet.destAddr = (uint32_t)(ping_buffer);
, F$ {& v3 H) } u) Z6 I; j f8 G+ O% p6 a" {, G& ^
/* Write to the master DMA channel first. */' `- k' g' [6 j; a' h* H6 @; j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& \+ M; C' ?3 w4 j5 a1 { } 8 V9 M$ z2 n6 X( l7 L
) i. _/ R2 ~8 g
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 ?) _$ E1 S) ?6 z, p
; q* p; G7 \0 s% \# ^3 r if(result == EDMA3_DRV_SOK) 8 I8 T! r7 H1 @# I
{
" q8 j# W0 _, N5 i, @ print2arm("edma3 driver init success.",0);
. c+ k; l1 S6 D+ F! { }
4 O" b; W" v% g t8 v. T}
3 V& m4 T) I# R9 c8 G
! }; J G" |6 W3 M
8 d' E( Z6 s+ JEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ n7 _+ v/ Y, @" Y. j! H
9 s- x' _: l% ^1 L/ m
( l1 o) f4 m* N5 A |
|