|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: [+ e0 ]2 M6 c& o
#define PING_PONG_ACNT 1
- j! g9 l' t2 J, l/ ~+ t* R#define PING_PONG_BCNT 8*32*40
5 D) E1 J, ?8 z; Q* J0 g//#define PING_PONG_BCNT 1
: k( P) ]+ Y. z$ L5 j2 ^, v2 K2 Y#define PING_PONG_CCNT 1
7 E8 ^' O4 s6 R5 b" d- W% m+ S% E9 G#define MCASP_BASEADDR 0x01D00000. a7 M( F+ w( j9 k9 l9 g6 Y
#define Mcasp_RXEVENTQUE (0u)
+ }* X! L @4 J" ~. N4 s& |
; S) h" g) R; B/* OPT Field specific defines */
E, a) W( i; f#define OPT_SYNCDIM_SHIFT (0x00000002u)
, l) ]( O1 P( P9 y: P#define OPT_TCC_MASK (0x0003F000u)
* `" A- B! i( c3 D8 P( `/ ^& [#define OPT_TCC_SHIFT (0x0000000Cu)
/ U" E8 A( O K K9 U#define OPT_ITCINTEN_SHIFT (0x00000015u). b4 u( F- @! F# h
#define OPT_TCINTEN_SHIFT (0x00000014u)
- v7 b0 ?0 q; L f3 V$ w$ j, o/ Q% z8 y
char ping_buffer[PING_PONG_BCNT];+ ^* m1 b( ] c8 b; N) U
char pong_buffer[PING_PONG_BCNT];; W7 u" w: Z( y) s# _$ q$ }
$ o3 A0 M; M/ X) g7 r, D: w# W
8 B8 G; D* \; {6 l' E0 a: i1 }7 w/ B% Y5 p* \8 t
y- d$ n- @0 \ _
static void ys_edma3_init()
- s" h0 f }% r{
" r( S& ~( W' Y5 J3 s EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 ]$ T" f. A3 e' c/ ]( R8 c EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% [* W1 w1 C+ T2 h+ v, A EDMA3_DRV_Handle hEdma;
; R, W, G: W9 J4 x% h( T0 B* W uint32_t chId = 0;& V( M' E& V, y) Z+ o& n
uint32_t tcc = 0;0 ]: I. j! N7 w p+ n
+ ]" I9 s9 E$ f print2arm("edma3 driver init...",0);7 U, r1 s) a. v, q2 M
8 C* z0 k# @ S; X! t: Q5 R
hEdma = edma3init(0,&result);
. D4 | T0 L- N: r% h8 ^ if(hEdma)4 m( n' t' u- r6 `. t+ ^5 S$ C2 p' |
{
0 U6 `# t5 ]( F5 D( T print2arm("edma3init() Passed.",0);
: x5 x9 {' ^. S- ]& \5 `8 x } W4 q1 t$ x' C; ?: \
else
u7 j1 U" f+ e: Y2 T: K {9 c c8 a9 u8 A0 _3 i
print2arm("edma3init() Failed.",0);" [( r/ a2 R' g- a$ k
}
; [# m& R, V$ Y' h/ [+ B4 v
9 T$ a G" q; A1 s if (result == EDMA3_DRV_SOK)
3 o9 N, P% i d# k {8 z9 S, R) Q& s0 P+ v8 y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ L/ n0 e* Z: U (EDMA3_RM_EventQueue)0,9 Y; f% g4 M0 C0 b) R
&edma3_isr, NULL);, v- s1 i+ k* O# Z5 `! C# e# j8 @
}5 p& ^0 m. h; [) d$ G
: f/ k, b" a6 s0 W v
if(result == EDMA3_DRV_SOK)
7 C6 s. Q, O u, h! L$ h {
4 a3 ~9 P6 I* g, i paramSet.srcBIdx = 0;
% P% b$ M& C2 P" z- X/ `: ` paramSet.destBIdx = 1;& f. G& c% H' i$ V6 J" I
paramSet.srcCIdx = 0;4 C0 E* e2 E$ R+ _# m
paramSet.destCIdx = 0;8 n& ?9 T- e. \) y" m* n2 s) S
paramSet.aCnt = PING_PONG_ACNT;
$ P$ M2 Z$ [+ V! `: X" O( v paramSet.bCnt = PING_PONG_BCNT;
6 O& e4 N$ G/ N2 b paramSet.cCnt = PING_PONG_CCNT;
' X: }% Z$ ~3 b3 d+ v# L- s; _
, x2 I* M8 U' }7 ^2 W /* For AB-synchronized transfers, BCNTRLD is not used. */
6 Z; z9 e9 e. U' M5 N5 F% W paramSet.bCntReload = PING_PONG_BCNT;3 n# N; ]+ ~4 U! Z' N, q' [( `
" V4 y, z; G& w! x; M, g
/* Src in constant mode Dest in INCR modes */9 M+ C! d3 `' r. N8 D9 T
paramSet.opt &= 0xFFFFFFFDu;+ o% o7 k* v! F/ R' n9 p
//paramSet.opt &= 0xFFFFFFFCu;; W+ l- ?( g5 H4 a6 w9 Y* M4 I
8 v. N9 P/ z+ C/ v /* Program the TCC */
$ E! u. v8 z; Q9 E: }9 |2 W7 S( } paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 z. k1 D: w' D$ g& q
& ?8 _7 Y; E4 n0 Z6 D6 O7 U. t& p /* Enable Intermediate & Final transfer completion interrupt */
+ U6 ?' C* u7 @, G9 ` paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 }3 r, j, t# J$ C8 L( G7 r2 X8 t S
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 x- |2 }- @" n" C; u
% o; ?$ y/ W* X* u /* AB Sync Transfer Mode */
" ]4 m+ r" t$ Z. M paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; }$ x( C, o* T$ ~5 q* a
/ g# x) {6 l0 ?3 k- f; t
/* Program the source and dest addresses for master DMA channel */6 a$ @6 [% L7 a+ g, _# ]
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);$ ]% n' f% C( F @/ d5 L% [8 y
paramSet.destAddr = (uint32_t)(ping_buffer);" R( }% ~3 E0 G) _ P' ^! ^
9 `! i8 s, i s' Q9 Z7 q R /* Write to the master DMA channel first. */
) R5 A: I. g A' F. \ result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 n( [) B4 R E! k } ; r( {3 j* I' }# u2 e
- T4 N, Z5 M' \7 p: p, u# M$ e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 S3 k0 l8 s+ U* [7 u6 A/ u
: D# v1 V% u3 o/ s( K/ W
if(result == EDMA3_DRV_SOK) " H6 C3 b) L% d3 Y" C( p' L
{
) e3 i, ]/ b5 ]3 X/ f' u( Y# h& y9 f5 { print2arm("edma3 driver init success.",0); _+ D; a1 n- A% q6 B+ l0 o$ [# F; C
} / T; u" z/ Y* T. t" F
}
; D8 N7 T% \) W2 j- D3 `
' v2 {6 L0 d3 [" j' H" n- L
N1 ]0 w; k# E9 `3 dEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' O7 ?5 e$ I; t& l& b
) ?6 K7 d/ A" C
( ^; R3 E8 z: m1 t- z: b' _( x( z( i |
|