|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' |* K, W( x" I, i4 ]#define PING_PONG_ACNT 1
( T* w; p f2 R1 q8 G8 ?#define PING_PONG_BCNT 8*32*40
2 t* C: u. W# I4 |5 y( v* `//#define PING_PONG_BCNT 1
! T4 `" q* C# s, [#define PING_PONG_CCNT 1( J2 p; V5 x& f
#define MCASP_BASEADDR 0x01D00000
. R1 P8 q6 Q1 E7 D# ]#define Mcasp_RXEVENTQUE (0u)6 |% k" Q0 ~* @. [, H) ]6 s
1 C1 P0 j. ]0 E8 |
/* OPT Field specific defines */
. j N: |# G- x2 y#define OPT_SYNCDIM_SHIFT (0x00000002u)' z* K" R' X3 ~' u% m& H6 G
#define OPT_TCC_MASK (0x0003F000u)+ J3 M' h4 x$ ^3 m9 \+ x$ ?# q* {* z
#define OPT_TCC_SHIFT (0x0000000Cu)
* w! d, K) `9 r7 `! N' f6 O- G#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ o+ }1 _* {* ?& O V2 ^#define OPT_TCINTEN_SHIFT (0x00000014u) }. E6 l: B# `* L n+ z0 [8 |
6 V5 E6 n# I1 C
char ping_buffer[PING_PONG_BCNT];
) r1 ?! m- f" Gchar pong_buffer[PING_PONG_BCNT];
: _, H$ l* a5 m( {
. h. W/ A: \/ U0 b6 d$ d& I
" j6 U' N$ M* l3 x1 j$ e* H
$ f8 l3 a y+ r$ e; B$ h
/ ?. {$ h' E0 ^: [1 Y9 lstatic void ys_edma3_init()
7 U: W' [! E5 C" f{+ n/ j+ V4 Q! i
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; G p% |) w! v6 S; d' f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) J' N+ ~4 S, I EDMA3_DRV_Handle hEdma;9 |4 z7 K9 t3 F$ V% Y
uint32_t chId = 0;3 }) X/ v% j' J% T1 d& S; U* O/ T
uint32_t tcc = 0;
* v; x# ?$ c0 _! l% I* @) ]7 N' h* ]7 i1 A# H) h% m
print2arm("edma3 driver init...",0);
6 j6 w! [, X( r- E; A% a# O: D' k# m
1 T1 A3 m7 |8 e hEdma = edma3init(0,&result);9 A9 w# `' I1 T' _
if(hEdma)
3 E5 k! q! ~& m {
% v( |7 d' j% R s print2arm("edma3init() Passed.",0);9 x9 T Q+ B) \- a t0 {& r
}6 T- t, P+ Q* V
else7 ] n! W) j& T$ a( w7 U
{
2 q" b( g/ V2 z" q+ e print2arm("edma3init() Failed.",0);: r9 v7 ]2 P2 Y3 [/ r5 l; E
}2 t/ e( T% o" h# L
& q, P8 @- `' ~% N% C$ r if (result == EDMA3_DRV_SOK)
! C$ {) P3 B- U9 H& t {
6 X: J, {& k7 T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ T, B: k; C4 J
(EDMA3_RM_EventQueue)0," F( H! v. ~9 |( l* S; X
&edma3_isr, NULL);
# Y9 ?+ t. e- ~! y3 L8 X2 ` }
* ^# I( f6 j) `0 I: ^: x* f+ `6 M
3 d3 J& A0 v" t/ K6 R- `# P g if(result == EDMA3_DRV_SOK)
- o' T, @, M1 d% g {% m; s7 }; z+ o
paramSet.srcBIdx = 0;- r& C% i+ A* b9 s9 {
paramSet.destBIdx = 1;4 B5 D$ h& m$ R5 _
paramSet.srcCIdx = 0;
$ F: g1 P0 O# ? paramSet.destCIdx = 0;2 y* \+ n/ d2 T& p# Z* J
paramSet.aCnt = PING_PONG_ACNT;% T5 b9 {3 g A4 L
paramSet.bCnt = PING_PONG_BCNT;
3 m3 K. M1 f7 } paramSet.cCnt = PING_PONG_CCNT;
+ c) O+ |* x! ^" I+ {& F; K
) Q. j; f* ]% W+ `0 w* c% \, `( P /* For AB-synchronized transfers, BCNTRLD is not used. */ c& F' C2 n' O6 o' l
paramSet.bCntReload = PING_PONG_BCNT;* Y [6 P; ^9 `/ `
, W( f) |: Y& U# _ /* Src in constant mode Dest in INCR modes */
, c4 V* h! c$ e paramSet.opt &= 0xFFFFFFFDu;$ ` }6 v$ Z. C/ m" ]& h& |
//paramSet.opt &= 0xFFFFFFFCu;
$ G* h. k& S2 }* b7 R/ ~4 R! H
" r( H2 G: E% L% M( [( X$ V8 k; Y /* Program the TCC */
+ J$ Y6 s# f( i D5 l paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 \: y4 i+ z6 q) b& Y& r
* }# m; r" X+ J0 e
/* Enable Intermediate & Final transfer completion interrupt *// C. a ]6 R: X8 \! g3 u2 R+ k0 }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ c7 I+ |- u* q/ Z- h% @
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ p6 Z5 X- U) S; R3 a' v" y+ V
4 i' j2 [- X$ d' o /* AB Sync Transfer Mode */0 V' D& ~4 C! V# R+ h
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 X3 D2 B$ j* T% F1 o( c * C8 H0 V) d+ I# u
/* Program the source and dest addresses for master DMA channel */! _5 ~- m1 Z+ n, M6 ~" Z$ P+ E& ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ j; l5 [, D6 Q5 G0 }* |/ f, w
paramSet.destAddr = (uint32_t)(ping_buffer);9 S9 h9 l- p0 q Z- z
5 e4 @9 P* c6 _* |3 C
/* Write to the master DMA channel first. */2 k: O% A7 c0 F& C( g$ I/ g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 R h8 O! J" ] T }
) g5 N+ T G E, R8 E9 k, A
, i$ M) g2 Z/ K, P! {* t result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( b4 u6 S/ D* |: A
2 n9 Q! F: k" w$ e) Z$ y if(result == EDMA3_DRV_SOK)
( l; X1 N5 W- U {
8 ?3 i& U) Q7 J4 @ print2arm("edma3 driver init success.",0);! H4 F- M" n( Z1 D7 b
}
$ E6 s+ g1 D! m3 q- M" S}& m" k8 ^. U5 s1 F6 e3 }* b3 Y
* h1 q- r4 q0 ?2 l1 m# z$ \. U u- K q4 q, O; X7 L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: F& I s0 Y' D# x$ }
% } b& e5 y5 V
" @: P7 K2 e4 F4 d& @! n- r* \1 x |
|