|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:, i& e8 T( w5 |: [- z( o! p% `
#define PING_PONG_ACNT 1# a" h, n3 x/ R$ m8 f
#define PING_PONG_BCNT 8*32*40 . [1 q4 X( H \% Z( V
//#define PING_PONG_BCNT 1
+ u" v6 Z* _- c& O9 ~2 P#define PING_PONG_CCNT 1
4 @0 d+ G7 b2 C6 I2 y u/ c# ?#define MCASP_BASEADDR 0x01D00000. E! n' w6 q6 V' b! T7 A+ W) l K
#define Mcasp_RXEVENTQUE (0u)
7 M2 z- f. g. ]4 `
7 ]( \2 b i8 c$ R3 |" N/* OPT Field specific defines */
2 g1 e2 K- V* L3 y#define OPT_SYNCDIM_SHIFT (0x00000002u)
: ^9 _; k5 ?8 r, K! B. m% }#define OPT_TCC_MASK (0x0003F000u)5 p" i2 Z( e, Y- a6 P. K
#define OPT_TCC_SHIFT (0x0000000Cu)) D" A- ^; `8 _0 d$ }: i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; t! ]! e% |8 S* i: y/ y#define OPT_TCINTEN_SHIFT (0x00000014u)+ w; S* R7 q! R9 j% q! g
2 j+ |3 Z1 c0 D1 J5 ^
char ping_buffer[PING_PONG_BCNT];
- ]* @( p: H4 @- O M2 n# ~char pong_buffer[PING_PONG_BCNT];
5 Z2 S$ {$ _- b4 G; O8 F
# N% U9 N) A& P6 o0 W$ O3 Y$ C" b8 N8 l+ x
% D" V o" o( m& P) r8 ~1 j
2 g5 Z, |6 i& ]2 T4 `
static void ys_edma3_init()$ F1 r$ ] p3 i1 A: `
{
( ?9 q R5 q+ m# z- ?9 R2 h EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 s, Q; o" H2 @! d EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, q7 p2 }/ P( f+ r" {( b* y EDMA3_DRV_Handle hEdma;
- | g# Q6 L9 f0 X uint32_t chId = 0;3 K9 P8 L4 G4 M" x
uint32_t tcc = 0;3 k& v W v8 u0 _0 r
& i+ ]& g9 W. b0 }, X print2arm("edma3 driver init...",0);
1 u+ {$ a5 A% b
- p6 J4 m3 d* `0 H3 I$ j, O hEdma = edma3init(0,&result);3 V" X* o- M2 F$ j
if(hEdma)+ b' R! ?% ?# k$ S! o
{8 `' v% i; I" T- \! j5 L+ e
print2arm("edma3init() Passed.",0);2 i0 D! C0 U& ~) C! o6 t. V
}8 ^( t' \4 }5 U5 f) R
else' [( R$ a5 T+ z6 q1 n G5 X
{
% f# L+ ]( D3 G- N( n print2arm("edma3init() Failed.",0);
& x, C1 s; v) ^0 B8 p5 \ }
% H& P) e0 a4 }6 m: W# W
5 G( R* u, p7 s7 {8 h if (result == EDMA3_DRV_SOK)
# ^: U; T* L0 h) g+ P- |. c0 t {; n- L5 Z* y( ^/ X: x) u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, K7 R' Q3 k) ^& h. H- @) k
(EDMA3_RM_EventQueue)0,
5 y& N& N0 X8 z5 g8 A5 t &edma3_isr, NULL);/ |; k8 i9 \8 m; C
}
4 |( a. ^$ t3 T" R! c0 Y. ] : i% J2 u5 w" D4 [% Q4 ~. v
if(result == EDMA3_DRV_SOK)) G O0 K4 ]. D
{
2 F' D. Y- h6 |2 Y1 t paramSet.srcBIdx = 0;
" ^7 G( X4 W/ T9 K- w" ` paramSet.destBIdx = 1;
$ x! E# a; _, O* F5 u paramSet.srcCIdx = 0;
+ o$ a8 R4 w% G( u0 N paramSet.destCIdx = 0;- l( l9 R r& ~( B
paramSet.aCnt = PING_PONG_ACNT;$ ~) H. f5 q- x& F o+ d6 F
paramSet.bCnt = PING_PONG_BCNT; q7 j6 L& {* s# {4 I
paramSet.cCnt = PING_PONG_CCNT;& C0 z( z% V, D4 t$ }4 L# F
- S/ Y% y' B F" c /* For AB-synchronized transfers, BCNTRLD is not used. */
8 | g$ e* S. v# D. B paramSet.bCntReload = PING_PONG_BCNT;
% |) v9 @4 M+ j6 q3 Q R: _* z6 d+ C- ]( |& R, u
/* Src in constant mode Dest in INCR modes */: R, [( e4 J7 k# C. Q
paramSet.opt &= 0xFFFFFFFDu;, C8 f9 \" s I1 [# r# \
//paramSet.opt &= 0xFFFFFFFCu;
0 E d1 j( F+ z
% a, h5 }8 W0 d5 A/ U /* Program the TCC */. f, O2 ~7 n7 K$ S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 q2 K) \3 d0 w z
/ t& H) X4 \4 W1 [8 g3 J
/* Enable Intermediate & Final transfer completion interrupt */9 J* B% S( F2 Q3 s+ N$ S: X$ B J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) D c& ^* x! W1 }- B7 e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 _" o3 W) A3 l4 d: h y& s) p* l* q0 P
4 }6 c/ U& k+ B5 ?
/* AB Sync Transfer Mode */9 S+ D8 y( x- z; ?* v! u
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& c" ~; Y6 u! n( {& \ 7 _) \; @" H% ] C
/* Program the source and dest addresses for master DMA channel */! Q, b3 [: q' ~+ w$ a1 C7 T
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 q1 v3 g3 E5 g" x paramSet.destAddr = (uint32_t)(ping_buffer);
6 C4 ~9 E& t: b
: K) _ E, _6 i% ~) V- [9 A /* Write to the master DMA channel first. */
4 {- Y7 H4 ]9 ?& ?% |; U- v result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
X- ^, j: L: Q; X9 e- \3 U } 4 L; l, z, p. z- c1 h7 `
- E* O5 x/ a: r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 E5 E+ L, Z- `! O
, P% V* z5 i. ~. o if(result == EDMA3_DRV_SOK)
2 y0 C; J; V7 u( y {# _* q0 y/ T6 C2 l- @- C
print2arm("edma3 driver init success.",0);) X! H" N) b% i) I' T8 c
}
4 s/ Q7 `$ D( v( G I}
, y( S8 U* ?5 U7 C, q' F& c
: o# ?" b p' ^& z7 S; {' ]/ S! c) d, k* g
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 B, i- h6 K; `- g, K( Q5 O: \2 x: L2 p6 S0 j7 d; R
4 @+ H7 d& h6 t. b* ~
|
|