|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. I3 a+ W* n# u' J1 @1 D#define PING_PONG_ACNT 1+ O' g- `+ q! {7 W' O' A; Z
#define PING_PONG_BCNT 8*32*40 % ]: P# [) J- w3 M( P; B
//#define PING_PONG_BCNT 1
# H! {+ X7 h2 X6 G1 J#define PING_PONG_CCNT 1
9 [5 r7 a( J6 ~7 j#define MCASP_BASEADDR 0x01D00000
. o1 m9 i3 B5 ^2 Z$ D4 x#define Mcasp_RXEVENTQUE (0u)3 O: m, U" L$ ^. I
/ _; e: a# V& T$ m/* OPT Field specific defines */
8 u+ M( v7 Z% h* v6 j#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 l& r9 m) ^3 V" N#define OPT_TCC_MASK (0x0003F000u)4 R7 K8 q0 ]- I6 S6 z
#define OPT_TCC_SHIFT (0x0000000Cu)
f2 Y$ s$ E+ r8 h% E( f: i#define OPT_ITCINTEN_SHIFT (0x00000015u): u! k _( P, q
#define OPT_TCINTEN_SHIFT (0x00000014u)$ U- s- n7 y8 x3 h+ H) x; T
! J5 w w1 R- k) w# r% \char ping_buffer[PING_PONG_BCNT];
3 } C; I# Q6 `" R3 `3 q/ j8 Schar pong_buffer[PING_PONG_BCNT];* P$ N: Z) ^ t, ?& }
' T1 }3 d1 `- ~( ~. p( K
- Q; x: V3 d* j1 }
- p8 m( t3 s$ M, y; i V0 L$ P6 L! z7 A! {% p
static void ys_edma3_init()% ?- R( K5 G- m, I7 K
{
& |- ]! ?5 w" [" W! ^* j$ _- Z EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 Y9 i# x0 W; ^: {0 P
EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 u0 Y, K8 r& y3 c3 X& q$ t5 X: m
EDMA3_DRV_Handle hEdma;9 M" q4 R# E }( v. u) g
uint32_t chId = 0;
, D5 l6 [1 e) K+ C5 e$ ` uint32_t tcc = 0;8 b# Z8 K" g# Y; E9 L+ g( L
% j9 K9 [* B- g9 d print2arm("edma3 driver init...",0); o, L8 [& N/ s1 m3 Z
, D# [7 [$ F7 M8 x& O hEdma = edma3init(0,&result);$ ?% d9 [, I" E7 [, I, j" U
if(hEdma)' k. k* e/ p6 ?' a1 P
{! \$ }. q R& w# T1 P8 e
print2arm("edma3init() Passed.",0);
% y2 R0 M8 f3 o! S" D/ ] }0 q" [6 b; r$ N3 g$ J: Y3 C
else
0 K' Y }$ D# a# z6 A9 N2 p2 ` {( v# h! y. l# i& b0 X! A
print2arm("edma3init() Failed.",0);
6 K7 c7 l$ k7 k8 j) e' e- _ }
+ b& e- I. H8 ?; @7 |8 _: l
, m5 g/ x# l( e8 b$ s if (result == EDMA3_DRV_SOK)4 X7 P) b* G! f! O C! p
{
$ S7 ~- [% c& i+ p result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 v8 o! ~$ `% J0 q
(EDMA3_RM_EventQueue)0,
# b6 r2 X _ K/ P! {: {; {/ q! V &edma3_isr, NULL);
; T+ S& g, d: Z y4 F5 J0 y7 K }; p5 }( n- B# n% X8 F3 ]* v
4 L+ v7 `% X2 h6 K$ E% D8 p
if(result == EDMA3_DRV_SOK)
/ O" @5 ~; O$ G5 K# S {7 J0 T6 U7 ?& u) X/ U: R
paramSet.srcBIdx = 0;3 m9 Y F+ g/ i) Y
paramSet.destBIdx = 1;
1 r- }$ R) ]! @% |" G f paramSet.srcCIdx = 0;- {/ q7 T8 z7 w2 o l* z/ `
paramSet.destCIdx = 0;
4 ~1 g0 r$ E' V$ U b9 _4 \7 W paramSet.aCnt = PING_PONG_ACNT;
0 P) Q8 n1 e8 G; P- z5 L+ `- H paramSet.bCnt = PING_PONG_BCNT;
# i6 _) v( q- S( f4 s: u T paramSet.cCnt = PING_PONG_CCNT;0 n; }, b" W- }" O' Q
9 s, W: ?; q+ a- t$ b5 i /* For AB-synchronized transfers, BCNTRLD is not used. */9 H4 j( J, r: v; r' L
paramSet.bCntReload = PING_PONG_BCNT;
2 }3 G {6 \$ W% E# j9 C, ?; Z. ^6 [7 Q) m" D+ N8 U
/* Src in constant mode Dest in INCR modes */8 I. g* G0 l: v) s1 @- n# \
paramSet.opt &= 0xFFFFFFFDu;
7 f9 h! {/ Y9 L* ]) k5 X2 E- c; @/ w //paramSet.opt &= 0xFFFFFFFCu;: [' p3 q( v6 j* E7 G4 j2 W
0 k' B3 T! r0 r) m1 G* Y2 [; q
/* Program the TCC */
" u" [' P }' K6 I paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ C. Y1 A: ]4 H' `; Q
; ^: j& H: ]- g' `8 ^/ d /* Enable Intermediate & Final transfer completion interrupt */+ A" u; S$ L; q) _, Y# J t! Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);1 A7 s, @: a0 w; W L2 v# ?9 k
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 B" L3 r8 l: y6 l) Q% o/ Q3 t& y9 k
/* AB Sync Transfer Mode */
+ z" f0 ?) G1 I; ^0 q" h paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: o4 e3 |. S; L' ?# ^) N( Q ?6 U
9 h6 z( x7 ^+ d. W# P& u /* Program the source and dest addresses for master DMA channel */- m) a) z0 A; F1 r3 a, r6 S
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 ]# M( |5 H) Y& K) \* | paramSet.destAddr = (uint32_t)(ping_buffer);
* P. T% j& s: b6 B
5 I; o( [4 J1 t8 W `: z0 @ /* Write to the master DMA channel first. */
5 \; Z) M# d. C; G" W result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& R* R/ ?8 A# X, a' D }
8 ^* F/ x9 K; T* k) x
& T: j# t& n# j result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) `7 h2 }( ^7 |8 f7 Q 4 o Q0 U. K4 V' d! H# d
if(result == EDMA3_DRV_SOK) # K' A S/ T& @/ M
{
9 A/ F4 n& r8 @7 R) |* C print2arm("edma3 driver init success.",0);7 }0 a, I! F& |+ _" N8 q. d3 U3 \
} , Z; ~) o% Z7 Z: _" e2 g
}
Z& P% P% M2 V6 ~& x2 |+ w" Y( A( l2 o- A' M N
- u. l0 O/ l- mEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) Q& W- I9 Z2 q+ R' q' q
. ^& O' K) g- Q, W5 K
6 @* ?) y1 D, l+ h* ?2 _# r |
|