|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* G2 w& H1 F2 S, c+ ~/ O$ g9 O! C
#define PING_PONG_ACNT 1
* ?/ R9 X" |# V#define PING_PONG_BCNT 8*32*40 ; j3 V' b3 m$ [6 G2 E% R: c
//#define PING_PONG_BCNT 1
1 a3 D' L$ b1 U0 v#define PING_PONG_CCNT 12 |3 H9 @, }) d
#define MCASP_BASEADDR 0x01D00000
; u5 @/ U5 W+ Q$ g$ q2 {#define Mcasp_RXEVENTQUE (0u)
1 ]4 e2 ~# W) }3 L% H4 n7 P' g( v) W4 I& f
/* OPT Field specific defines */
8 `. P" j* H" n5 w* o* ?! L#define OPT_SYNCDIM_SHIFT (0x00000002u)! _ Q+ U. _; I3 T
#define OPT_TCC_MASK (0x0003F000u)0 F9 L0 G5 t3 x3 r$ X8 k, q
#define OPT_TCC_SHIFT (0x0000000Cu)2 I6 u0 E" }4 E" J; h; \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" I3 |: ^7 W* S: n/ y* d8 A/ Z#define OPT_TCINTEN_SHIFT (0x00000014u), V; P- U2 m7 _6 ?
0 o" g" b r$ X8 cchar ping_buffer[PING_PONG_BCNT];4 }- s$ p; X; U1 H7 X) F( B% k
char pong_buffer[PING_PONG_BCNT];: h( q8 H3 F+ I" W& a& B
- f j& q& c; W
! S. G! G; s9 s; F' {2 w, I0 Z% [+ @& h# M& S( @( M0 Q
+ q* m6 H4 L+ p5 \: nstatic void ys_edma3_init()9 R- |' P; ^7 f& B, J- N8 E
{
[) V8 S3 i3 ~, q EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* t% K9 ~6 l: q. |# O4 {0 t& H+ T EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. v" ?9 k- D! K& i8 k EDMA3_DRV_Handle hEdma;
4 J6 o6 E+ h' G6 |" ]4 k uint32_t chId = 0;9 p4 M; K% G! r* |; P t$ y" p
uint32_t tcc = 0;+ m; U: H* s. l3 Y6 v
5 k8 K3 Q- P. n/ z1 w9 ?0 {* f print2arm("edma3 driver init...",0);' }7 B9 [" l; m0 J7 k6 [% L8 N
3 ]& o0 |& r$ [ hEdma = edma3init(0,&result);
! e( Z* z/ D- P: [& }/ ~ if(hEdma)9 S J, b* X+ L
{
; { w( R8 w, x3 i2 G; b P print2arm("edma3init() Passed.",0);$ T. L5 C9 G- Q3 @5 k. Y2 v/ L1 H7 u+ z
}& F8 A& j' v1 c T- T2 E; C* p
else
& N/ r& x$ t' r _8 E {
3 ~% v( w: D& B2 R& O/ W# ] print2arm("edma3init() Failed.",0);% L. L- x1 ~9 O, E7 c
}5 J: M. m0 w! h
{0 y. J0 }3 X if (result == EDMA3_DRV_SOK)
! z$ j$ Z. l: t( ^ {3 ~# a7 G8 `1 K; R7 s1 Q! _6 o
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. x* @2 C" A$ q
(EDMA3_RM_EventQueue)0,
$ n' k% m( I: e w4 j9 z &edma3_isr, NULL);' n7 w8 B$ I. ]' I/ v) j
}0 U, E' i) O* @. _5 j, N6 K& c
2 V1 B D$ F+ [: H2 P3 f6 x+ @2 F
if(result == EDMA3_DRV_SOK)* U) @3 d- r2 z( I# p5 D Y. k* k( y6 C
{
n2 h3 \: T/ F. @ paramSet.srcBIdx = 0;5 M, O6 }! A! `/ e
paramSet.destBIdx = 1;
8 ]1 j0 Z7 [% [8 {6 u paramSet.srcCIdx = 0;
0 ]$ N& e+ u. W5 P, v paramSet.destCIdx = 0;( f; ?1 Z+ a5 Y% C1 V
paramSet.aCnt = PING_PONG_ACNT;
; l) L* N7 ]# w/ o+ P) N4 Y paramSet.bCnt = PING_PONG_BCNT;" X" `/ _3 c, u* X+ n4 c
paramSet.cCnt = PING_PONG_CCNT;4 C4 W- [# q+ f. C. x' P
- ^# N1 H/ ]" u
/* For AB-synchronized transfers, BCNTRLD is not used. */0 y5 j" m. K7 I3 l3 {% L
paramSet.bCntReload = PING_PONG_BCNT;
: B' G8 L* E8 z& b6 [# h
* c! r! _/ h6 L" D /* Src in constant mode Dest in INCR modes */
2 \8 t# y- x# |+ g paramSet.opt &= 0xFFFFFFFDu; y5 ~8 Q: D+ t! [) z Y
//paramSet.opt &= 0xFFFFFFFCu;& s. d. l% n. e
2 i/ Z9 N0 g _- x: W1 e /* Program the TCC */
' [: E9 }1 I9 v* C9 B6 Y3 N paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* L' y: o1 v0 ]( Q0 g( \$ `
8 l9 T6 z8 ^( [9 t) e
/* Enable Intermediate & Final transfer completion interrupt */9 |6 ~4 o0 o' P1 G
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) X- L' Y& B* q( E" W
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% v. {0 A: Z$ r4 f3 n2 z+ i
) `) c L' R5 v; I6 C/ ]1 N) V /* AB Sync Transfer Mode */: M7 m. ]2 v4 |. S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% {& \: b8 N2 ^5 ` ! T4 L' f+ m0 c2 @% _- l
/* Program the source and dest addresses for master DMA channel */
- r/ \) j* {8 k* b paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); X+ M% t& l8 h; x5 y3 q; _3 v
paramSet.destAddr = (uint32_t)(ping_buffer);) o- t2 K$ i2 O+ J8 B
9 @6 D! k2 x0 b2 r% a& e2 j0 s /* Write to the master DMA channel first. */. @7 F4 C4 ]2 w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ `2 I3 X, I; I1 c! f( d }
% l6 p5 w+ L! ?) Z$ D0 q" H1 h0 v4 Q2 y- T) Z( H! t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; p+ F5 T2 k1 S( O& { 8 {5 [' a6 t& J) i, D
if(result == EDMA3_DRV_SOK)
# D' A/ q& S# c5 [" `, E% N8 t, V {
$ p: g; ^# N6 A+ s' V% D' c2 a8 n print2arm("edma3 driver init success.",0);
2 r( P2 p- k7 T3 q0 y* l! p7 F# ] }
5 H1 f, d) V0 Z; Y% y}
. W% P" M" e( C8 n6 M3 {
9 H0 _! K$ U2 R( L7 @. @, y
6 H/ M8 K7 w! K6 a9 H; V+ REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 P" D# J5 }1 y4 m1 h, r: l0 F- b
' ]: d: E4 O6 A5 _
; l! y; Z; d: W; x |
|