|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 w1 o$ c; u, E" l" Y- N
#define PING_PONG_ACNT 1& X3 W2 p2 B, {5 D) L0 ?
#define PING_PONG_BCNT 8*32*40 * S% u" ?: |) ~7 s7 X: R
//#define PING_PONG_BCNT 1 q* o' D {- [/ A- v2 L
#define PING_PONG_CCNT 1
" C I- Z. |5 k/ f: L; R0 [#define MCASP_BASEADDR 0x01D00000) u- u1 t7 v% I# J3 Q3 G
#define Mcasp_RXEVENTQUE (0u); a& M8 J+ h0 s3 S6 ~1 G
5 }& R+ S' O5 A) a1 a/* OPT Field specific defines */& y L& g' k& [" d+ t
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) d% _5 z( s' w. G#define OPT_TCC_MASK (0x0003F000u)
# k- k4 F' G0 h: n#define OPT_TCC_SHIFT (0x0000000Cu)
" Z8 r* u) S" L) k0 _#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ k g* v" J8 b$ ^#define OPT_TCINTEN_SHIFT (0x00000014u)
% o0 ]5 [6 V! s4 f5 L5 `; j- M7 U* W
char ping_buffer[PING_PONG_BCNT];
' S' a+ P( P2 L) ochar pong_buffer[PING_PONG_BCNT];
' n; U$ ]% r8 ]1 Z; b3 u- `- _: e3 y
: m; `: K0 D2 m% W- o; I W8 J0 [$ X- ~* |% o. Y; t, Z
" s0 i* P0 d7 Z1 }* ^* K4 _2 Sstatic void ys_edma3_init()
# n! T6 `9 G0 \" k7 _( t0 @{
. w7 x2 h+ D2 U2 H! J EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: V3 D# S: \- ]7 a+ _4 B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ @* E# Q& W& n9 \2 |6 v& U EDMA3_DRV_Handle hEdma;1 V5 l" \7 |5 S$ d. O
uint32_t chId = 0;
$ \, S: `4 P+ o6 [, W8 ] uint32_t tcc = 0;) o# V& `- [; R$ L9 A8 ~
7 L* Z b! G% f# q- R& m1 |4 \
print2arm("edma3 driver init...",0);- n4 z& ]( G+ \- }8 @
2 T; f+ k; p& [6 u( S& u
hEdma = edma3init(0,&result);! `8 o4 t R7 c; d3 h, a1 Z
if(hEdma)
+ C& F# j2 `* b3 |7 U {" h" f9 p5 s Z* M1 u$ T. {
print2arm("edma3init() Passed.",0);
7 ]2 W$ b9 v$ j4 Z* x) o, M }% r1 Y g7 R+ ` X3 v; i- M4 @
else' g( I3 L: W. l( V# \- P- Y
{) C# I- u2 O$ E6 h1 n
print2arm("edma3init() Failed.",0);
" A3 j |; e" A3 A6 }% m v }
+ g: Y4 `: i) H. B' b1 X0 K
; B/ _( N8 g' Y \) r9 x. d if (result == EDMA3_DRV_SOK)4 m) R- O. d0 N8 |6 d; _, b6 s4 Y
{- w! ~0 }) e; `5 O2 a
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 X3 M0 @" {0 f j3 G/ c% D
(EDMA3_RM_EventQueue)0,
. Q5 h* [# V$ o+ K; N' J &edma3_isr, NULL);
* i% c! N7 ~6 r" o8 I: l }8 I4 r" ~# R- N+ `
4 c' h8 F1 B" r8 f1 l if(result == EDMA3_DRV_SOK) i8 P9 B% ]( `$ r' M* n
{/ I) d2 I, A' L5 |' P5 o8 c( N1 }
paramSet.srcBIdx = 0;' D' G5 y c3 R& k, m8 R! q: A
paramSet.destBIdx = 1;
2 D/ n# I: s8 j paramSet.srcCIdx = 0;. P6 h) V+ H( A. |
paramSet.destCIdx = 0;! M- E7 j0 X( j: X: l& w% g
paramSet.aCnt = PING_PONG_ACNT;# F" \4 U2 K2 b' @" |$ e
paramSet.bCnt = PING_PONG_BCNT;6 t% G1 K1 X7 R. c: n1 X7 f; m
paramSet.cCnt = PING_PONG_CCNT;
3 \+ s) T4 u9 n$ e( l) Q p G4 V
9 W( J3 d, f0 u( E1 f /* For AB-synchronized transfers, BCNTRLD is not used. */, j8 H; D q0 O$ J
paramSet.bCntReload = PING_PONG_BCNT;, r# c. p- _/ v/ p& E4 s& B6 p
& X. j+ V+ q8 J; R# O2 a, o. G /* Src in constant mode Dest in INCR modes */1 [( M9 z8 R( a6 R& ?# K
paramSet.opt &= 0xFFFFFFFDu;* T. U3 s3 N" P4 o
//paramSet.opt &= 0xFFFFFFFCu;
2 ~& z( H% P/ M! ] . {; i3 y2 ?, x3 q
/* Program the TCC */7 p1 h# U3 ^) O) ] P0 S8 L& y3 O" l
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 [% p, A! r( X, k! U8 A
( {2 E7 T* M6 b1 E' _' l+ p5 M: C /* Enable Intermediate & Final transfer completion interrupt *// G% Y6 M! _9 R. b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* J { i: x& h) o) q paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 V: [. y4 v0 W6 F( o. M
5 I( h8 t5 f! s
/* AB Sync Transfer Mode */
1 y$ o3 k( z) |* ? L( f5 `6 R* j paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& M2 A! f& M% ` K, s% q: l$ I
8 E2 J( ^( R9 a /* Program the source and dest addresses for master DMA channel */
. Z( f+ o6 `4 O4 w j paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);+ }! J6 A, Q( L$ v" F
paramSet.destAddr = (uint32_t)(ping_buffer);
9 s+ }: u: }# x9 u- ^$ A( g6 n: k7 C2 G
/* Write to the master DMA channel first. */& W: G0 M5 S( D
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);8 E/ c2 F5 F2 D! v9 J
} ! b `+ w$ d- }( U5 E
: n% Q, @: I+ [0 `" \3 A result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 J }- U! S1 ^, b2 d9 m
5 H% ?! S* E" x* i L% M4 { if(result == EDMA3_DRV_SOK) + A! f1 A' r/ x+ a
{
1 n+ G( K* m/ B, A1 F0 u print2arm("edma3 driver init success.",0);* {. B0 a6 h, F3 B: T! c, t
} ' u3 d0 m( x! c. B
}
9 _0 n% W7 h1 n3 M( R0 [. c
7 y5 ?- f. d6 t" x1 }7 h" l7 C
8 e1 O. Y" s! `- [/ o7 w5 {& v6 SEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。2 M4 d e l1 U2 I# p
/ H$ d+ u. X3 L: W! f7 v5 b; n+ }) W5 K7 [: o, P
|
|