|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% U8 j* b' {2 E- K#define PING_PONG_ACNT 14 n- X9 |- E: T, x. t) `2 k7 M, [
#define PING_PONG_BCNT 8*32*40 5 O2 l( K! Y! t! l; D" j0 `: k! E
//#define PING_PONG_BCNT 1 7 T& [# R% o6 Z" ?+ q7 y. ]
#define PING_PONG_CCNT 16 d! t& X( m7 ^& ?
#define MCASP_BASEADDR 0x01D00000
0 I2 Z {" `$ s, z1 _#define Mcasp_RXEVENTQUE (0u)' J# a! _+ n9 s! [* l
( |' }5 d+ B& f; c% l; A
/* OPT Field specific defines */. F: P9 O9 L% n. t0 B
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, X, `: I' I3 Z+ W#define OPT_TCC_MASK (0x0003F000u)5 s- \+ l5 ^. U# W
#define OPT_TCC_SHIFT (0x0000000Cu), n2 D, ^6 {) `+ T$ n1 e
#define OPT_ITCINTEN_SHIFT (0x00000015u)% A; y L- h) F3 I5 S, C* c( `# z
#define OPT_TCINTEN_SHIFT (0x00000014u); [3 C' y, w$ ~+ d( _' w0 [5 M# i7 I
5 L5 ~* e! P+ f& [1 Echar ping_buffer[PING_PONG_BCNT];* s* p! i7 o( ~0 T2 i2 r
char pong_buffer[PING_PONG_BCNT];8 d+ A H/ N' l6 Z2 C' y% Y
0 R$ F* s9 d0 b, k& | v
! j7 | q$ `9 L2 p* p' M
4 L$ B$ O% J0 F
4 T0 S, N# K$ E8 A' Y- Z( Zstatic void ys_edma3_init(): t7 r# p3 D/ i; q5 M/ ?. D
{
/ B7 C8 T& N7 f- y8 X6 ? EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 T' z% M% V1 u* P4 P, W( _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 P1 J* {, t: ^; X7 o8 U
EDMA3_DRV_Handle hEdma;0 y. ?" h) p* z* ?! E% y9 ^8 ~9 {
uint32_t chId = 0;/ u2 f$ L M; c
uint32_t tcc = 0;
g( M; d% N% h# p) A- Q+ C2 a
3 s0 H% Z& _7 g/ V+ w3 x' h! c' D print2arm("edma3 driver init...",0);
1 r; F6 `- V) h" [ L
( T! d7 b$ g, ^1 ^ hEdma = edma3init(0,&result);
7 @8 E$ X# ?5 t3 t if(hEdma)
: `0 x% e) X, }+ b {
# i! w9 {* [; M& t6 `" B; W print2arm("edma3init() Passed.",0);( E4 e x: T _1 k" J
}! n( l1 c( |7 j' j5 W% A! b6 C
else
! Y% \( |1 X2 c {# Z' Y' O9 g) w$ w
print2arm("edma3init() Failed.",0);% z) X& d! C2 D0 N! k2 ]1 r
}
5 E' C9 [ `) z' H* ~
5 J. _8 e+ V' j1 ~ if (result == EDMA3_DRV_SOK)) K7 \2 ?/ T! K& B. V
{5 |0 q5 H: A+ N* @( B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ ~2 n, N. E; D% m: t (EDMA3_RM_EventQueue)0,: F* p- e' i9 h" N8 G7 B0 n4 f. `
&edma3_isr, NULL);
7 [5 u7 `% s) r- h7 a B }1 E! R5 S m* n9 b2 a3 t2 F: Y
) I+ D+ Z2 j9 L. {9 k if(result == EDMA3_DRV_SOK)
" S/ C: C9 n/ ]) d2 |7 S {) ^& T' j& T& S5 ]8 H+ R
paramSet.srcBIdx = 0;" R8 R1 M1 H7 D o4 j2 F
paramSet.destBIdx = 1;
+ B5 Z" p: @" b t2 d( r( W) F& F paramSet.srcCIdx = 0;
! w" v$ t, x( s5 k3 Z paramSet.destCIdx = 0; ]- V3 K, _' ]8 B& f7 f7 U
paramSet.aCnt = PING_PONG_ACNT;
( z# `- g5 O' ?3 U$ ? X3 Y9 K8 b8 { paramSet.bCnt = PING_PONG_BCNT;
. J% U' U* H- r+ ` paramSet.cCnt = PING_PONG_CCNT;
% D" Z0 s9 J; L* d2 A H6 } # ~* P. A) |+ n
/* For AB-synchronized transfers, BCNTRLD is not used. */
: y; x# N1 O* m0 s( x: M8 g paramSet.bCntReload = PING_PONG_BCNT;
0 B5 h$ b4 |7 v# E: K8 B P( ?! f6 Q
/* Src in constant mode Dest in INCR modes */% e& C T5 N8 [, ^: P, [9 \8 M
paramSet.opt &= 0xFFFFFFFDu;
+ _$ S+ L0 [! W p8 |/ l //paramSet.opt &= 0xFFFFFFFCu;
# t% X q2 \! ^* B* A! L5 q
: [. U0 _, ?1 [$ l3 E) p: C, V /* Program the TCC */
9 I( }: t' `! o% T }: V paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 B* L- ?- U0 d" m( f' F
) _/ _4 \* T" B3 o4 y
/* Enable Intermediate & Final transfer completion interrupt */
; @) j% `& L q( v paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 i" }6 m4 \$ `2 r0 J paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% E4 v* `- y' E* _) N, H/ `% o
2 P' }8 ` A( A7 U. }, ~
/* AB Sync Transfer Mode */
, ]: i- }! E6 ~ n. E( N paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" ^- [; d( s- e& k) |. ^
% q& _( C2 q, }* F6 H0 C- y( {
/* Program the source and dest addresses for master DMA channel */
5 W4 T0 c. b" I7 a+ R Q paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* F. o! _8 i4 d/ K paramSet.destAddr = (uint32_t)(ping_buffer);8 w! U( n, } s- X
: u' P" R4 w! b a! M2 X) p /* Write to the master DMA channel first. */
( n! R [5 X' c7 o result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);. H! V& X1 @7 v3 e; G
} / H1 a3 q. \) e# I
& g0 G$ U8 U& U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, }' U/ p( |2 m* x
, n$ Q$ G8 C6 A+ R3 M. D if(result == EDMA3_DRV_SOK)
1 H& Z P' W+ X: F; X {
$ i/ f$ [- |+ @. Q1 Z* B print2arm("edma3 driver init success.",0);8 A) b7 i7 `! Y- J) A: |
}
1 X- `" e c: O' M}
! p: L: t' E7 s& y' L6 i! j/ l. h8 f, O1 G5 g- H; O5 a3 v
4 o) @ G1 A+ C$ L% N, D8 u- mEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: G! D2 F- s- A: l2 c: w5 h! d8 i+ @$ j l* B8 w8 P, [
8 w9 Q6 ^2 H9 v/ ~+ W
|
|