|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& r" g# b8 l/ g8 I( o
#define PING_PONG_ACNT 1
+ U, R1 E( d) }8 `, b( {- `#define PING_PONG_BCNT 8*32*40
5 U% M; `- |0 P1 |//#define PING_PONG_BCNT 1 ' N* V4 v! Y9 \3 O# Y" A% G
#define PING_PONG_CCNT 1
* r7 b+ B% P/ f8 i#define MCASP_BASEADDR 0x01D00000
( I. E& N% n* x( |+ o#define Mcasp_RXEVENTQUE (0u)4 s( M4 u; L3 ^6 a2 z# c
, |. i$ ~8 E/ F9 c) f/* OPT Field specific defines */
1 G+ {. A6 ~ p( f1 L#define OPT_SYNCDIM_SHIFT (0x00000002u)' [- T% Y: `6 ~0 E# n; @
#define OPT_TCC_MASK (0x0003F000u)
9 K4 `0 s6 \% N; H#define OPT_TCC_SHIFT (0x0000000Cu)8 o: e4 a% T0 N& I$ j9 ] e
#define OPT_ITCINTEN_SHIFT (0x00000015u)* b# U" i e8 ~/ Q. M' ]
#define OPT_TCINTEN_SHIFT (0x00000014u)$ R$ r) B. x9 v. b0 a6 U
6 q) n. B) ]# |( i# E3 g* |char ping_buffer[PING_PONG_BCNT];
* _& I ?9 R: J5 ~$ `( \* d% mchar pong_buffer[PING_PONG_BCNT];
' r1 y. ~( w% c6 U: n, A" n5 u
- K8 H* M3 {9 R1 a3 K- P" |3 m ?9 O# _' o7 x& @& X
/ L, t. v; r% t$ A
% e1 y' G, U2 qstatic void ys_edma3_init()- o4 ]1 r# i0 S
{1 r+ @# @5 _ S: Q+ |
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; b3 f$ J0 D6 z; |; i
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, P5 ~: D6 w2 o0 N$ V& c3 z EDMA3_DRV_Handle hEdma;, u" V8 @* X' F( ^0 P! [
uint32_t chId = 0;
5 X/ f' T, _% ~6 c# j m6 ] uint32_t tcc = 0;
/ E! W+ [2 N5 C6 k# Q! I) p. o; V4 X1 b. d [ g3 L: M$ [
print2arm("edma3 driver init...",0); }- g$ b# w* I* V
/ T) _; j" F* F' @. y w
hEdma = edma3init(0,&result);
+ x4 B$ ]' q6 J; q if(hEdma)/ p* U$ N6 R7 A7 K, i
{
. r9 ?6 }; m0 B0 |/ @7 q, t4 ^ print2arm("edma3init() Passed.",0);
: S5 e1 y2 h' D& {2 b' C& I- K }2 {9 c( ` X) K, t b
else+ X' |& s) H7 R7 [9 n0 b5 u. R
{
8 c9 @9 ^1 _2 C; W print2arm("edma3init() Failed.",0);
' a# X1 W F/ l$ p2 S9 J3 T7 p; x6 L' R }+ {! f' r% }2 {- s9 ^' u* a. f
; h! X Z3 J1 q' d; X# C
if (result == EDMA3_DRV_SOK): W$ P9 z1 B& \. C. \; W, ^/ \
{
& w, o, n! b+ d result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ m# y6 K/ H: j7 Y* r/ w* y) z' P (EDMA3_RM_EventQueue)0," ^+ v) a1 v/ k
&edma3_isr, NULL);
# h+ v( k- e) | }
. V( o2 Y- g2 T
. o% n9 a: S# v7 c# M' v* C/ @ if(result == EDMA3_DRV_SOK)
% i" Y/ w y$ d- w {
* J2 _+ Q4 f0 G4 J3 w4 A paramSet.srcBIdx = 0;: v; O# l0 S1 R1 _
paramSet.destBIdx = 1;
6 g/ u4 }5 m) C paramSet.srcCIdx = 0;
' p8 m8 J* j8 m3 b2 i paramSet.destCIdx = 0;
7 H& G' I' z* m1 o& V paramSet.aCnt = PING_PONG_ACNT;
3 f: x. @% b8 n$ S- [ paramSet.bCnt = PING_PONG_BCNT;
/ M1 h! V$ M: Z( z: P" `8 V1 C7 k paramSet.cCnt = PING_PONG_CCNT;
" o" `+ x4 H0 `8 u ( l% C, _2 b! t$ ?" M& O' o. n' E
/* For AB-synchronized transfers, BCNTRLD is not used. */" B; `4 |5 I! C
paramSet.bCntReload = PING_PONG_BCNT;' U3 W- D' P1 N- I: `: F
$ V1 X4 X+ f% t" T' ^( n
/* Src in constant mode Dest in INCR modes */* |. S' W ?/ }: H: t) j0 A
paramSet.opt &= 0xFFFFFFFDu;6 I- X% O: T% y- n# }, M" H- G; P5 W
//paramSet.opt &= 0xFFFFFFFCu;5 u! b5 T; d. v! e6 f/ l
0 |6 A9 S0 y$ [& [# w# \
/* Program the TCC */
1 p& N- h. D- w3 S1 {- b paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& f! b* ]/ ~( A! ]( E( m
# S' |' Q, ^$ U8 Y, ? /* Enable Intermediate & Final transfer completion interrupt */, _" t! s9 W. Z w( k
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 ?0 y8 _1 @7 y. B( g' u paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 L: U, T* d0 l
1 k M4 t# F3 G1 b. R' K0 q: }
/* AB Sync Transfer Mode */
, w6 O: x' I+ Z$ H0 d% ]" a* W/ U paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 z& c3 R" V$ T$ j) W: n/ @
! l1 i, m. J' n/ Q8 C/ t- r /* Program the source and dest addresses for master DMA channel */
+ Z. l# W1 Y) ~ d, m5 q paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 g1 P- Y0 ]% `( D e" x; k paramSet.destAddr = (uint32_t)(ping_buffer);6 c0 ]* W* ?; X9 r
! j6 N1 Q- I }; W( G& } /* Write to the master DMA channel first. */# J+ X* K" }' I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( q8 i, s! O+ h) L) [2 F } " _. \% t/ ?) b$ W+ {4 T
" L2 P5 n# v) M, w- ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) g2 _& _+ ^7 y8 Q( I8 f. E$ Q+ o
0 I, \: ` H9 e7 [7 p6 ` if(result == EDMA3_DRV_SOK)
( g8 a6 v9 O/ ~ {& U( a; X! m) `3 ^2 y! C8 i1 i, [
print2arm("edma3 driver init success.",0);
Q) k) M, _; R! w6 G }
9 P) v5 v2 E/ N# \}2 W- D6 n9 u! T
( v! V: y' @) O. A
6 P; c a8 M5 J* u' C3 z# F. Y% JEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! D1 g' l. W8 L
/ a/ B9 _ d' E+ s
8 H. F- `. W- ^- X |
|