|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
y8 i7 [; l0 N3 J#define PING_PONG_ACNT 1
s2 O! }' x1 ]! g. e; K" W#define PING_PONG_BCNT 8*32*40
6 b6 ^3 R5 x- k* V9 _6 M//#define PING_PONG_BCNT 1
, T4 {, T+ f. Y7 D4 @#define PING_PONG_CCNT 17 ^8 h; d( ]# {6 W* c
#define MCASP_BASEADDR 0x01D00000
, v0 D I. ]/ m9 ]9 `6 n7 F' l#define Mcasp_RXEVENTQUE (0u)' k8 K1 I/ h0 D9 t. `
. I, L3 t# a9 P: b( n7 x2 {, K0 A# ], |
/* OPT Field specific defines */
5 v& Q7 j' h0 f#define OPT_SYNCDIM_SHIFT (0x00000002u)
" M @( W) G+ M' s#define OPT_TCC_MASK (0x0003F000u)( O% Y5 ^; N2 C3 R
#define OPT_TCC_SHIFT (0x0000000Cu); f+ _1 i# ~4 \; H& D8 X4 ~
#define OPT_ITCINTEN_SHIFT (0x00000015u) e- l% A3 Y- O. Z( d9 x
#define OPT_TCINTEN_SHIFT (0x00000014u) c" v+ P _. q# ?6 N) @
' W8 S! V' T( X0 e+ w; q
char ping_buffer[PING_PONG_BCNT];
' K$ X: s! N/ X% Fchar pong_buffer[PING_PONG_BCNT];
' ~, Y) O+ f9 T1 O" G* N. c
0 Y5 p4 D& J4 ]2 c: L6 z; `
$ j" i- X3 w& k6 u o( F+ e
2 Y8 W1 [$ t; q+ i' k5 q& W+ z2 {( S8 x( B3 H
static void ys_edma3_init()2 S/ D/ R$ q( r& r; G( L1 [1 Y0 n8 g
{2 X" d* w! m [7 `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 x0 |' h1 T" [ EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. r" }: z/ z# `: A* N p EDMA3_DRV_Handle hEdma;6 k/ a* T) R1 {. J2 @
uint32_t chId = 0;
% [ c3 ^# R) g @: I+ y- C uint32_t tcc = 0;, J0 J! ^$ h. k/ S+ \6 t1 t
: B0 f C8 t' @* {3 l+ u+ U. Y) |% { print2arm("edma3 driver init...",0);
8 r3 ~! Y* B: W" g# O( `" r+ T6 g6 ]0 ^! ]; V) x) t
hEdma = edma3init(0,&result);1 d0 J2 _8 { T# n7 n& m* I- v
if(hEdma)
. N9 Y! K9 b' s% g& V- \ {
# E- f/ a4 _ \- d print2arm("edma3init() Passed.",0); Z( b7 q( x" F. M# v5 H$ i
}9 [1 w5 |; g9 F
else T: |0 O0 z+ `5 R+ e
{3 K1 W* I0 P$ _; E. x: g7 X
print2arm("edma3init() Failed.",0);, Z/ g6 [+ r! W6 A
}
& T: X& O _& l9 G$ k . I$ G$ y2 b+ E9 S, q4 A8 z
if (result == EDMA3_DRV_SOK)
6 o% o0 G! x# W0 }( \1 X9 T {$ O/ `& {1 n6 c- I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 |7 q5 o6 M, ^7 B7 Q3 X! T
(EDMA3_RM_EventQueue)0,
7 E& J: c h2 l3 U% C* M2 r# h, X &edma3_isr, NULL);
% S& g0 {# G( v2 s. f }- F7 a1 B% F9 Y* ~- }
- j4 k& _" R0 u- ~. K if(result == EDMA3_DRV_SOK)9 k/ O) W+ D K. r( d: [8 V
{
) p: I( a8 q7 D( w# P paramSet.srcBIdx = 0;
* j3 q, ^( O4 A/ F* p3 x paramSet.destBIdx = 1;0 `3 N; |& n; {9 P5 N" W6 A
paramSet.srcCIdx = 0;$ Z7 Z1 F0 @: m$ o* d; s
paramSet.destCIdx = 0;6 P8 s8 h' D% ^1 ^5 w. M2 J
paramSet.aCnt = PING_PONG_ACNT;
% }' G1 p5 r, y paramSet.bCnt = PING_PONG_BCNT;0 V% a% b+ F0 Z$ Y& b
paramSet.cCnt = PING_PONG_CCNT;8 m. i9 S Z \; |5 r! Q% H: H- y
4 c9 ]1 q. J8 z /* For AB-synchronized transfers, BCNTRLD is not used. */
9 g7 R, t, Y$ H" d0 j5 V0 g paramSet.bCntReload = PING_PONG_BCNT;) S) E) n6 O6 ~5 j+ N% O
4 R/ w7 h* i& I5 |* ? /* Src in constant mode Dest in INCR modes */* M+ G7 H* U# z: t$ E
paramSet.opt &= 0xFFFFFFFDu;* H6 N* H9 f, `3 N4 n
//paramSet.opt &= 0xFFFFFFFCu;5 V( [( {1 ]9 ~
( i9 e$ T1 v0 V1 z; w, _1 j) S /* Program the TCC */: m. Z5 `- ]+ _. V( [
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 v6 t- T5 V6 q. ^9 p, d% b
; I( Q3 `, x* x" L /* Enable Intermediate & Final transfer completion interrupt */' P, l. V/ F+ m' _0 f, B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# q+ O$ J# a1 X% E# Z+ K+ f7 g# b paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& V# C, o/ L2 |# w, \/ R
# P$ C' I" D3 F, g3 Q
/* AB Sync Transfer Mode */
) U) H# u- Q$ q" w3 i# }! t8 U paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" t9 G7 W& l7 T+ W/ ~ ' G5 W* [& _+ U, L2 h0 l4 s
/* Program the source and dest addresses for master DMA channel */
8 m; E: w7 k5 @. B! z! a. m) H) s paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);* }3 u9 L9 `$ ~7 M
paramSet.destAddr = (uint32_t)(ping_buffer);1 g B. h1 v e" Y+ a
# D5 b5 a U6 |5 ~# D& ^& {
/* Write to the master DMA channel first. */ L& ?9 ?! r V9 ?
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, g* x3 z$ p: c* i: N; U% K
} / z( i$ M. p2 C% _; d) O. B6 E
" }3 C5 K3 b, I# f result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ w, o/ ^* j" w9 A1 B4 j, H 7 d! }# Y9 q* }& I' c# D% o& Z
if(result == EDMA3_DRV_SOK)
6 J8 D" o6 L: z' N4 t {1 G3 _. U8 a* g$ V' @5 a2 y1 {" ^
print2arm("edma3 driver init success.",0);1 Y! r" q) m! T2 a T$ r
} 4 k2 F9 j9 E3 Z ~( i5 h
}
8 n* j& Z) C: y' Q; s
3 z% H6 q; N+ l6 x
( }' J; i E1 u. g$ |EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 u7 U6 B4 q n1 v7 J2 l0 m
1 J# g/ }8 m4 x( v3 d. J
8 ]. j& j- ^+ t$ |: o1 x! X |
|