|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( K4 v5 ?: Y7 R ~% z- C
#define PING_PONG_ACNT 16 `4 U. N2 P/ z9 t* X$ V) k8 ]' K q
#define PING_PONG_BCNT 8*32*40 , g- Q# G: K8 E) `1 V
//#define PING_PONG_BCNT 1 ( g, o3 P- e. E- \: f9 T
#define PING_PONG_CCNT 1
' J. t5 l4 q7 j( P, o. }- e#define MCASP_BASEADDR 0x01D000009 t# ~9 Y8 d# z8 a
#define Mcasp_RXEVENTQUE (0u)# v6 t T8 W2 ?: S
3 o, v- V# `( Y: u5 r5 r/ ?/* OPT Field specific defines */( U1 O. G8 \6 C! ~& ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)$ h/ W d/ S; t
#define OPT_TCC_MASK (0x0003F000u)! L! H$ l7 ]. e$ w4 ^, W
#define OPT_TCC_SHIFT (0x0000000Cu)( r) p: u! v3 e
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 }; r, O% V; j' \( n#define OPT_TCINTEN_SHIFT (0x00000014u)0 G: G: C/ `8 b: m4 X* G
9 j6 B$ t2 m* j1 G$ D- mchar ping_buffer[PING_PONG_BCNT];
7 c' o" [/ y5 @- B$ ?char pong_buffer[PING_PONG_BCNT];
0 q% J( M% i% B6 J4 T3 I& i# ^7 ^: J2 v' h4 g% b3 Q; {
$ ~; B6 X9 K2 K& D) O }9 E. P) n% D3 F. W9 r- z
% p7 P! G# Y( A$ ~7 nstatic void ys_edma3_init()8 {* t- q; V# Q }2 L
{
% {/ a: @7 y Y4 V( Q+ \ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 a) m) X2 |8 J" t q3 h" K3 A0 p EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 T! p3 m+ u6 z) b- @
EDMA3_DRV_Handle hEdma;
6 f. m5 p2 I) l% r0 b8 N: o uint32_t chId = 0;
& g* `% p$ y$ E9 Z uint32_t tcc = 0;
, ]2 O2 y X7 E! j* L8 H" [7 p& l" {
! \) i6 E2 ^2 m! l- }" T; T print2arm("edma3 driver init...",0);8 B3 P, H% r* I2 K
4 @4 E! u5 @) M, w: _4 v* l hEdma = edma3init(0,&result);
) s( }- j: c. |1 F4 j8 k if(hEdma)
+ k1 }- Y* r1 E2 s1 X {) |; ]- u# A E9 H
print2arm("edma3init() Passed.",0);
$ |5 e' s2 f. R3 q/ @ }- P& a0 l1 m8 [5 G6 o
else* C! p2 I: _: {, F& c
{% I+ I0 F6 b+ _
print2arm("edma3init() Failed.",0);
% J! D$ t* Z' G2 { R }
$ x& Y/ o' Y* [& \* E' M) a' i
+ t( C2 R& I, J! _. c* T9 k5 H. K, | if (result == EDMA3_DRV_SOK)
: O" @! A+ o+ B {% r. Y. Q9 r# W$ Y" B2 E2 Y7 j7 `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, C- u; C4 Q$ Y- _, u* W, M
(EDMA3_RM_EventQueue)0,
2 _: D- R+ N, |% S# W; Z &edma3_isr, NULL);
+ L% Y# ^7 Y) }) l8 s$ Q }5 b( z4 w* j3 C/ ~! w }8 @
* l* ^2 J( T& R! ^5 ]$ s if(result == EDMA3_DRV_SOK)
: j- t. j( D& a0 g! \ {( ?2 Q! }3 D7 q' A8 u: ?7 r* X- T$ S
paramSet.srcBIdx = 0;1 }5 O7 R8 P9 R
paramSet.destBIdx = 1;
: }6 y+ b8 b" |5 x2 x3 b paramSet.srcCIdx = 0;, w4 z6 H) D6 N' ]8 s9 d) d b
paramSet.destCIdx = 0;2 {' p5 k; U$ b$ u! L( H8 t
paramSet.aCnt = PING_PONG_ACNT;
( ~3 _& O4 g. z$ ]/ W2 |# H) ` Y) H* ? paramSet.bCnt = PING_PONG_BCNT;
5 y- u) |6 x9 I paramSet.cCnt = PING_PONG_CCNT;
4 s/ E" [6 a- h3 l& t0 W5 G& I
7 o5 }& o7 }+ l" v /* For AB-synchronized transfers, BCNTRLD is not used. */
# k7 K* Q& P1 p C' z" N, \ paramSet.bCntReload = PING_PONG_BCNT;
4 K; {2 B* O% i4 H1 D6 ~; |7 M
, X8 J5 Z- C( p/ F( ?6 @$ [ /* Src in constant mode Dest in INCR modes */0 H+ Q' ?' N* D% |$ m6 |
paramSet.opt &= 0xFFFFFFFDu;
% [6 [0 i$ b, } r- m; \ //paramSet.opt &= 0xFFFFFFFCu;) c0 `" T' X0 s* [& R, ]7 c
" x9 m& i0 { \2 V( U /* Program the TCC */9 P/ D, G: m6 G. E, l
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* ?2 a. Z. T5 e& j, Z: v: Z+ z
5 d; P9 u# ^& f8 U! z% D1 T /* Enable Intermediate & Final transfer completion interrupt */
3 Q! `2 y. B2 a& n1 U paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
z& |: B. k* t8 j v paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 X' ~7 ^; o: X; ]3 V5 `
+ ]! v* \) ?# e7 A1 ?) ? /* AB Sync Transfer Mode */
+ g$ U: q8 ]) d- G. \, I8 o paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 S# z" W# C) }! i6 ~ 1 b3 O& u8 ~* ]7 k4 k; @
/* Program the source and dest addresses for master DMA channel */( H/ y' z6 Q- S$ {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ B4 x! M& u/ E+ O
paramSet.destAddr = (uint32_t)(ping_buffer);2 g# K# |$ s2 E# i3 u! o& L. W# E
# E+ m$ [7 N; y, P3 y. D5 ?5 L /* Write to the master DMA channel first. */ B& w3 A* g. s/ @3 n
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% Z, C j8 q3 n' C! J }
* ^- _: J2 ?/ M4 \/ J7 @
& p7 m: x$ v0 q+ E" g" |. M result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! }% m- p& m1 o& _! ?( N
+ h$ @8 R+ \; |* ~0 g
if(result == EDMA3_DRV_SOK)
( l# `7 C" t/ i+ r {. D0 b2 {9 _, y! w
print2arm("edma3 driver init success.",0);
7 e2 l7 ~8 K! @ } 4 @' k9 Y; d5 e3 k. ?
}/ V0 W0 ?$ q. s& T3 x# G
6 G% m, w* h) k5 h, Z
1 B# ~) E: _+ G$ e6 C" ^2 ~) l; REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) g2 E' z" {) C" |0 u
/ C$ U% |5 g' p: O Y' C/ G7 K# z' I" w9 B l* B
|
|