|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' v$ N; g0 k6 e* T! l- w4 e! N' x$ g7 r0 s
#define PING_PONG_ACNT 1
& V$ Z6 T6 e/ ~' E4 A$ G& p+ S* _; R#define PING_PONG_BCNT 8*32*40 ( ]4 h/ h$ K F
//#define PING_PONG_BCNT 1 6 o0 [( V( X% W) X, i3 y- d2 @5 t# O/ B
#define PING_PONG_CCNT 1
p5 M& r6 u5 U3 r: G+ o#define MCASP_BASEADDR 0x01D000009 f: \7 W( w* Z6 a4 ^ A
#define Mcasp_RXEVENTQUE (0u)
/ j+ q: u' e: f1 d# g3 k% e* s3 i9 t" |, `
/* OPT Field specific defines */
7 ~. F" x1 z/ e+ O1 W! _' S' s/ m#define OPT_SYNCDIM_SHIFT (0x00000002u). o7 b ^& n& s7 @( C: n/ p& r
#define OPT_TCC_MASK (0x0003F000u), g1 s/ J) a/ ~7 t# P! U% P
#define OPT_TCC_SHIFT (0x0000000Cu)3 m( j3 ?0 U$ g9 h! \" e( Y
#define OPT_ITCINTEN_SHIFT (0x00000015u), H" u4 b4 b8 S- L
#define OPT_TCINTEN_SHIFT (0x00000014u)" q/ Y( N3 s' M4 d* u
) r2 Q$ ]$ W# m, E4 G0 l1 x
char ping_buffer[PING_PONG_BCNT];
* E7 O+ G! Z' w3 {5 I4 _/ A6 Achar pong_buffer[PING_PONG_BCNT];
# A& B& H5 y( Q8 x& d1 q
* S; B# V! n! p1 b; P
% M2 b4 L6 [1 c. P& e* ?' X' J& a% L) t
& C6 ^' z) W0 B
static void ys_edma3_init()
) A2 |, H4 f/ ^" ?7 d{
# S+ \7 G8 k* ~1 M EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% n c8 D: S* b% ^! H/ _& H% v
EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ `+ ?' J4 Q' o7 R2 y6 ~
EDMA3_DRV_Handle hEdma;
+ J& s2 B3 w% i2 h, J uint32_t chId = 0;% q- M8 |' J3 G1 j+ [9 k8 Z
uint32_t tcc = 0;6 R. h9 J# ?- G' \/ Z
3 g' Q+ L; ~' w8 Q4 T
print2arm("edma3 driver init...",0);+ a; ~& V' T6 X7 l6 j Z( Y( L
( z! a8 y r' Z$ ?0 X
hEdma = edma3init(0,&result);
* J) R6 g" Y) G, L7 H: y, g: i if(hEdma)
' l) L5 b2 {% c5 H$ w9 R {+ Q; V8 O/ l5 t; T$ Y
print2arm("edma3init() Passed.",0);
+ B" {4 u. K% o$ L v" V }/ q( C" O- J* h% {1 \1 b
else+ v: l5 m5 y3 R
{
3 _- V8 u/ Y2 Y* j; N- z% z: p/ ? print2arm("edma3init() Failed.",0);/ E& H5 g' q: m5 V% ~& ^
}
- _2 I2 @* o1 ] * k ~8 _, H6 L5 a
if (result == EDMA3_DRV_SOK)1 \' w" a: I% U& w8 ^6 G; G
{
. ^) b* c2 L& O( O result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," N8 e- H) W: W( Y$ Y& r# M- i
(EDMA3_RM_EventQueue)0,
8 X, U. K! s7 w" V) _$ p5 G* C3 f &edma3_isr, NULL);/ Q0 q! J3 k0 f# l) t Q
}
8 B6 D/ C4 e5 P # I7 S! ~ V& v0 ~* O2 h* Q
if(result == EDMA3_DRV_SOK)# Q/ r& `- R$ ]6 j: x: I
{! k" Y( {! q% b' n& @5 {8 n8 H
paramSet.srcBIdx = 0;
; c; A; o6 k$ i5 R& O ^; S paramSet.destBIdx = 1;: y L1 f0 y5 s' n
paramSet.srcCIdx = 0;) ?4 g6 {) _9 A
paramSet.destCIdx = 0;
$ O* F3 u3 x; N9 M% V paramSet.aCnt = PING_PONG_ACNT;: i& V2 X" Y" {( p0 i% B' x( G
paramSet.bCnt = PING_PONG_BCNT;
" { @* \; Y8 ^% K! y paramSet.cCnt = PING_PONG_CCNT;
2 [8 ?" Y- ^! ~) y * O8 G0 R) Z F! {
/* For AB-synchronized transfers, BCNTRLD is not used. */
, f+ e! b) Q. b paramSet.bCntReload = PING_PONG_BCNT; _: i l6 y2 j
+ _; o3 a7 p; @% _* y4 m# ^/ Y
/* Src in constant mode Dest in INCR modes */
/ {; }6 V9 ]% M' H" f3 r# ~ paramSet.opt &= 0xFFFFFFFDu;
& u( L3 u8 d4 n6 S( i' P3 c //paramSet.opt &= 0xFFFFFFFCu;/ [' |/ O& l; v
" @6 c0 F7 `1 @) S. Y. R2 k /* Program the TCC */
; ^5 _2 `8 l4 K6 n$ x, Y paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: y, t/ p8 \; ^2 v) ]7 L
% [# W+ F# s& L; w+ k" q3 J1 j0 c
/* Enable Intermediate & Final transfer completion interrupt */# a2 W, O1 q+ ?" v8 L6 u$ I, W5 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! {! D% z5 h5 _; b# R" u, R paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( c' [" C- R' Y" t$ m- F, [) |( {+ L% j* `
/* AB Sync Transfer Mode */
3 s" K# F' N& `! M& [8 Z" d paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 W4 ?( r0 `9 H% J
" E( V7 ?7 j8 M
/* Program the source and dest addresses for master DMA channel */ w$ K. v5 P4 n8 G$ A6 E0 [7 J
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);8 R% w4 N) O+ F. {. A( H/ ?6 Y
paramSet.destAddr = (uint32_t)(ping_buffer);3 f" n1 g5 V/ p4 y
5 |3 `$ ~/ o( ~1 J7 | z: V9 \) @1 i /* Write to the master DMA channel first. */ }3 _" B5 ~2 V$ c; S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" h. {* y. p& W4 u
}
9 d4 e# P! B C; D% d) g$ ~% i! h, N$ o. e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: q! v; i! w. M
9 M( g6 z L% K, _% a3 Q0 A if(result == EDMA3_DRV_SOK) 2 [ x1 H" O" \$ Z+ p0 \2 F7 V
{
/ L3 M/ o. g9 l G$ o print2arm("edma3 driver init success.",0);; K5 w3 A# r. Y6 [ p+ Y
} ' v+ l3 z' S8 w/ R: m' a$ ^
}% k/ A( Z7 f; K
% n! G' n- Q$ h# x& Y
: y% m7 ~3 @0 c6 c3 `7 U3 UEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
{4 Z- h& ], m- k# A9 |/ ?# ]' E
% W7 r) G. [- ?3 ^ |
|