|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 C- w7 E/ I, g2 }+ Q
#define PING_PONG_ACNT 1
) E+ h- r2 Y( _6 H& |& Y( ?#define PING_PONG_BCNT 8*32*40
3 c3 o/ V1 s; H//#define PING_PONG_BCNT 1
8 X4 o2 z3 Z7 }5 ^4 Y% P& Z* ^#define PING_PONG_CCNT 1
7 G0 ~) ^, X, n+ H, h7 U% |2 }; q* @#define MCASP_BASEADDR 0x01D00000
" v. z2 r% ?# h0 X3 a1 X#define Mcasp_RXEVENTQUE (0u)
# p8 C# s7 E& ^1 p! W4 l& M* Y9 S4 h t5 c+ ^6 U! V9 w6 z! {
/* OPT Field specific defines */1 t. J. \/ \0 k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& Q, _/ E" o. M+ D#define OPT_TCC_MASK (0x0003F000u)8 T( S, O2 Y2 U9 h9 U% N& y0 P
#define OPT_TCC_SHIFT (0x0000000Cu)
6 t% U" j* b4 Y#define OPT_ITCINTEN_SHIFT (0x00000015u) U6 e( r; v9 T& H
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ `8 z; t1 M) E9 D# {; Z' A4 n& X1 z7 A0 I
char ping_buffer[PING_PONG_BCNT];
6 S2 h( K' u6 rchar pong_buffer[PING_PONG_BCNT];
k: C# R- a0 Z) n! j% S# y
& J& K; e. B! N8 ]0 q
4 ~3 |7 w: h4 u9 _8 y
, O" x8 b0 z( i& s# ]; I/ d1 k( } k/ h) f
static void ys_edma3_init()1 v: D4 k9 S# v; S- D8 W
{
- R9 I& b9 p. t. v- Y7 c EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 Y9 |9 {: }" G) A! {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 g' L# |0 O6 D2 ?; ` EDMA3_DRV_Handle hEdma;
9 V `; ]# Z9 I0 A8 a uint32_t chId = 0;
7 U: B" G; b3 \5 u3 w; | uint32_t tcc = 0;) {( Q1 X; O/ H- j
+ S/ ^2 g* M. m4 q: `& l9 [1 \ print2arm("edma3 driver init...",0);6 f- U) L- p3 p7 j9 G- M C
/ E |/ p4 E! p ]
hEdma = edma3init(0,&result);
! Y6 ^, W, ~ K2 _9 D if(hEdma)$ Y' w1 f6 I' ^9 c* q! d
{) M1 _- y0 S' U. l9 [
print2arm("edma3init() Passed.",0);
6 f. }" r1 u3 b% Z, p! Y! g }
0 t; d/ J* J# X* m else
; f" q2 }2 {/ f1 ]& U/ T( x- G {
' @ u5 _0 [0 F3 ?; s3 [2 }% C print2arm("edma3init() Failed.",0);
8 M0 s# Y1 T- m9 e2 A8 Z ?( m }
. f1 I' M8 ]* g8 T$ n) @3 L
0 j+ J1 z0 `! P1 \' _6 h6 ~7 l if (result == EDMA3_DRV_SOK)
- v; X/ ?! D! L! e' [- z# T# ~ {
& b3 } t0 t0 j! j2 l result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* o+ d, e# F; T* D (EDMA3_RM_EventQueue)0,
+ {' f2 U+ ~0 X! x& }" d. q &edma3_isr, NULL);
/ l( X" g! B* y8 t" h0 G }
+ U1 t! L ?% o0 @6 }1 S, m3 d, o
% _/ h9 \+ S- Q if(result == EDMA3_DRV_SOK)
% @! G* i V0 H9 k$ ]: W' l: l6 H% Y {+ ]% n$ N3 A2 _. N) y z( I9 U
paramSet.srcBIdx = 0;
# p& L. ~( D8 y paramSet.destBIdx = 1;* g( r3 s& n3 o5 y
paramSet.srcCIdx = 0;" I1 { q% i. |" s5 }& a
paramSet.destCIdx = 0;# \ w( v. u* r7 s! C% ~# l0 p. d
paramSet.aCnt = PING_PONG_ACNT;
# ^& L! F! S: D5 S1 [4 ~* l } paramSet.bCnt = PING_PONG_BCNT;4 A: M9 y8 j' ]) P" l: F7 [
paramSet.cCnt = PING_PONG_CCNT;
9 _! j9 S# ^- U: h ' v9 e! N) s( t7 r& }* p% D
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 H, g* j7 |! @) a% C8 D paramSet.bCntReload = PING_PONG_BCNT;6 F1 i- o' ]& B5 I, p$ V/ ]
0 w! K1 F. ~8 ? n! F" D+ H, d, I+ N /* Src in constant mode Dest in INCR modes */
8 T( H& j6 f' k3 m5 I paramSet.opt &= 0xFFFFFFFDu;
' q a7 A) D; ^% j //paramSet.opt &= 0xFFFFFFFCu;3 ]" W: `: V6 a4 o5 P
6 g$ {8 J+ L+ w; Q /* Program the TCC */
! |) G) r8 x! z+ {3 D paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( N8 j6 {/ i' C" ?0 O" r7 h5 ] F3 s
( t* u( e7 m7 | /* Enable Intermediate & Final transfer completion interrupt */# h6 z5 P) B( Y9 Z- A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, m# j8 l' g4 [* h7 J paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 \( X' D/ A& a) C' K% Q5 q( } h" E
0 L& O$ e/ {* b% Z; z! v6 ~# G /* AB Sync Transfer Mode */
2 \6 g# a1 K" D6 n paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' S$ d& M; @9 f
5 r+ g3 C$ q- r! o; V9 d( d /* Program the source and dest addresses for master DMA channel */ i0 F, M V/ ^3 B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);7 T: j; w3 o- Z2 u) U
paramSet.destAddr = (uint32_t)(ping_buffer);
1 @" P, o: H; n$ l4 m
2 l+ x, b/ B$ ~6 E s, y /* Write to the master DMA channel first. */
7 T& q) V; M/ {/ x" L# u) v( A result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" P4 j4 i/ s$ X& M
}
: L8 ~, ]( Y8 _- Q5 m1 ]
; i9 A; X. r1 _6 B7 m4 ^ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 g# l0 ^) [7 Y# c5 S' K; X1 U
7 y3 x; C) U. i) l8 x+ V1 e if(result == EDMA3_DRV_SOK)
& S! p# m$ \8 z! _/ W. Q/ ` {3 [4 W8 q& z- y( F
print2arm("edma3 driver init success.",0);
" F3 W4 P( T& w8 {+ W }
5 L3 r4 ]9 J, e* b8 G}7 Y) E* S6 e3 t
) y" h' ^5 u- k! A0 @9 V/ t
+ H6 J3 j+ H& f+ n* Z" N* n0 o
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: }$ }1 i: {$ }4 U
! T7 a+ h; T! J: ?: b; _, m; G( Q
|
|