|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# z3 v9 D1 H7 T
#define PING_PONG_ACNT 1% x& T- f# |% J" E0 |
#define PING_PONG_BCNT 8*32*40 ) {2 y3 P* r. m/ v
//#define PING_PONG_BCNT 1 0 ^! w! W$ [+ k8 y
#define PING_PONG_CCNT 1
$ Q$ @8 X; V' S#define MCASP_BASEADDR 0x01D00000/ G" M, T- [' ~* H; K& L- @- p
#define Mcasp_RXEVENTQUE (0u)& S+ ?" R; w" x: a; o. @
7 [* Q/ t9 G5 U- B/* OPT Field specific defines */7 Y; S, b* \/ ^$ q; k4 Y2 q! ^
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 O) u& c! G+ e k1 u/ P#define OPT_TCC_MASK (0x0003F000u)
9 r; ^5 @! `& d#define OPT_TCC_SHIFT (0x0000000Cu)5 D7 j h9 u1 q9 y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ }/ W- B( W& f" {. u: T0 N* t4 E#define OPT_TCINTEN_SHIFT (0x00000014u): M" J1 G7 S' K' K
7 y* {' F# X x" Zchar ping_buffer[PING_PONG_BCNT];
( a* R6 N4 f, jchar pong_buffer[PING_PONG_BCNT];
W5 V, M2 X ^1 F: ^# ^* q0 ]5 p
( f# _7 |5 { ?. S5 F$ n6 A
$ T" r! S$ U6 ]1 z' F) A! @8 `* @" g3 x6 K# Q! B
static void ys_edma3_init()
0 C- Z3 u6 ~4 w- y1 L{
& T: X9 L2 x8 d+ o% h: `: z8 ` EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! N# J1 F3 U z, Z. C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; C5 }6 |/ Y) T2 K* [) N EDMA3_DRV_Handle hEdma;
+ c0 N2 Y8 J$ A& V uint32_t chId = 0;
& b( l" U* l( x5 }" ?. N5 ~- q uint32_t tcc = 0;; _$ M6 H O$ ]2 `
. j, `6 _3 P+ e6 Z7 m print2arm("edma3 driver init...",0);
4 Q; Q, U5 @7 h* z/ U* |
) y- y" \8 J) `5 E* _% w hEdma = edma3init(0,&result);
w5 f6 @1 Z9 B2 x" B) g) y if(hEdma)2 L. u- F1 R0 s8 E! M3 h/ {) A% f
{5 d o. s" F+ \5 c+ ?/ U& i% p
print2arm("edma3init() Passed.",0);
3 S/ E: z/ h/ q% n8 I9 O$ J" n }
& [1 T( V; \" D) E3 t1 n else
- Z6 G' \# p$ V$ K$ L {
' B7 Z: F/ m& F3 ] print2arm("edma3init() Failed.",0);8 S) d y, y5 d! V0 w
}) t+ U2 ^( a+ b$ H1 ?5 F
0 n" o; R$ ], ^. q
if (result == EDMA3_DRV_SOK) f6 H- X3 O% e
{% C( Y. F& V8 i2 l1 u( A3 y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 A6 \7 B4 @8 G' l
(EDMA3_RM_EventQueue)0,1 l, a n! p7 i$ B5 p
&edma3_isr, NULL);
% x1 ~# }+ b* r0 g4 J }
6 X( L U3 Q6 a$ `; F9 `
: @, g8 S# g( h; d9 P2 T if(result == EDMA3_DRV_SOK) S% X' y& A7 h/ G
{- f7 T" S4 T" p0 r& X: E
paramSet.srcBIdx = 0;2 N5 D2 ?6 T$ _
paramSet.destBIdx = 1;
P, O: z# d _( w* X2 C i+ V8 }) `! ~# S paramSet.srcCIdx = 0;* e, t& ]- \) z/ N0 U. A
paramSet.destCIdx = 0;
7 }6 Z& |$ k0 t7 r. l- a/ w( [3 a# n paramSet.aCnt = PING_PONG_ACNT;
1 D8 T! O9 L9 U8 A1 c/ C paramSet.bCnt = PING_PONG_BCNT;1 [! X* m+ \2 {: d! r! x
paramSet.cCnt = PING_PONG_CCNT;$ s9 u' ?; N& g. N/ }
+ _' {) d+ w8 x6 f6 H /* For AB-synchronized transfers, BCNTRLD is not used. */
: L. j( \6 h I. [ paramSet.bCntReload = PING_PONG_BCNT;
- q' J& t; y% P/ G& }/ I5 \" I
6 w4 Z" b6 r2 z /* Src in constant mode Dest in INCR modes */
2 F% ^0 s( m1 |) R paramSet.opt &= 0xFFFFFFFDu;
4 Q6 U' E7 b* F& c1 \ //paramSet.opt &= 0xFFFFFFFCu;5 D7 e5 e! O5 e1 @6 c/ s
6 T7 ~. h! B% W) l( \+ ]' r
/* Program the TCC */
# ^6 }! Y9 o& t- d9 O' | T# s$ ? paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' A! o7 [( o" n5 X0 R$ \
- Z4 u, Z- j) c; l /* Enable Intermediate & Final transfer completion interrupt */
3 z( I. V: O9 |* l# I7 p1 U M4 E paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 N6 t% p) r/ w8 W$ G. c/ o
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 d- a. @, ]) x3 H/ ^6 [- O k4 B& `) m" R( s
/* AB Sync Transfer Mode */4 } R& b/ A, }8 p' S: [9 a5 R
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& I, W G: A& {7 ~5 _( ] ) B3 F. Y# _7 l# C1 i
/* Program the source and dest addresses for master DMA channel */5 d0 k% H0 F, Z, `% \1 h0 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ n$ V8 C* U- f( } paramSet.destAddr = (uint32_t)(ping_buffer);. b) |, ^! n6 N0 K& }
% K, h i4 t! u1 x( G% t /* Write to the master DMA channel first. */$ G( h- j: {6 O( d/ q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
& b& j4 m2 m L5 E! | }
5 U: p* [/ {' z E& E" D
7 v9 X) ~' I8 B2 y3 }6 F: D result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 i. i; a" r5 L# e- q) ?0 t/ j
- `% f6 Z3 Q9 ^! V% c" _& J! ?4 \0 k& W
if(result == EDMA3_DRV_SOK) ' ^0 I% K( B. Y, i. Y% a5 Q
{
Y; g' N* w9 g' g- h print2arm("edma3 driver init success.",0);
; v- f9 B& I+ [ } 4 o/ y& P9 d& X) {4 f. J
}( i, o! c; R0 o1 R! | g
( L5 H1 {8 T! r3 Y) a8 j/ L
' ^2 o# ~) N! ?' p% XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 s: V! M' i% @- ~# e3 n0 G& R' q q0 |( C! i
2 S1 X( d# A5 }7 |1 n& L4 s/ _
|
|