|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" M- L# B- l0 |+ H#define PING_PONG_ACNT 1
9 a6 L# ?0 E; ~4 u& x#define PING_PONG_BCNT 8*32*40
, j% Y3 K6 X7 y% _//#define PING_PONG_BCNT 1
' k0 I( o/ Z1 `! @8 ?8 j2 A#define PING_PONG_CCNT 1
1 Z- P7 @! O8 M- d4 O#define MCASP_BASEADDR 0x01D00000
6 p/ g6 U: v# l: u4 m. Q1 ^#define Mcasp_RXEVENTQUE (0u) B+ z9 [; Z1 p8 I3 i: @( Z
$ W- `; ]) P' N2 [/ t9 [4 g2 g' {
/* OPT Field specific defines */0 |2 D( _! r$ c* ]" a* H+ }- Z& \. j
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 `% [3 d% h' ]+ ?) C; @: J* h#define OPT_TCC_MASK (0x0003F000u)
1 }0 r7 M* F. ]5 v J7 I#define OPT_TCC_SHIFT (0x0000000Cu)8 w- D$ u+ j: `! X/ i
#define OPT_ITCINTEN_SHIFT (0x00000015u)6 m! x6 U, B8 `# [0 l* c/ W' g
#define OPT_TCINTEN_SHIFT (0x00000014u)
; \$ A }. i& |& G7 e/ [# x# J6 o2 r- | Q9 a6 [ P% J0 _$ \
char ping_buffer[PING_PONG_BCNT];# M7 t& g7 z/ |3 j! s7 F( I- {
char pong_buffer[PING_PONG_BCNT];8 Y4 A; Y3 b& _6 X( @1 M- k
4 E6 P4 }: Y4 D5 P9 k% Z/ R1 O( v2 j4 y
. P$ b+ E, @2 k p5 Y/ Q8 v' ?
d) C( l) P5 T/ W3 L
static void ys_edma3_init()' E6 V/ p T0 _! ?4 R& X& ~
{
$ V- n1 z4 Z9 D EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' c) X. Y9 H) ?( ?% q |' q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" v7 x- i9 S5 i8 `5 e0 T EDMA3_DRV_Handle hEdma;5 m/ q% ?9 p/ o) L+ P3 b$ k: N
uint32_t chId = 0;
6 H& a8 m" C6 C2 U7 R8 [0 R# P uint32_t tcc = 0;
2 Y/ l( b0 l, w) b7 D( g- J9 }' q h! j c( ?4 U
print2arm("edma3 driver init...",0);
7 i( u8 E* p, ]/ E+ F6 C
g' q! L1 _; g# h, t hEdma = edma3init(0,&result);
0 N+ ~2 k/ Q0 z: v1 {2 |, [0 ^ if(hEdma)' ]0 v! ^* ^! _7 c. l2 f, |$ {$ h
{9 J# C+ S+ A% X6 c' R' |/ p
print2arm("edma3init() Passed.",0);
, Z/ @ f( k" O @2 d; O6 z: O }) a; j' e4 [' J
else" r4 J G7 P( ~& M, v' m& p
{% B' h+ a7 F7 ?) a3 y
print2arm("edma3init() Failed.",0);- w9 C4 m7 Z' q# Z
}
; J$ m& e7 B# f5 x1 N3 @# R& l 8 u' a2 H( }$ ?7 z$ L
if (result == EDMA3_DRV_SOK)+ w7 o% u" S8 }! Q2 v; b
{; X0 w( Q# Z4 e+ m0 I$ X! p7 {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 x. Y5 b% a; n! a$ P (EDMA3_RM_EventQueue)0,
( U& v' w- h( A7 {/ j. m- N &edma3_isr, NULL);
3 N; u! _4 M. |, d' e }) b7 u, ^; L/ G) d0 l) v
. } c+ {' F# i& C
if(result == EDMA3_DRV_SOK)+ G' G( R; n% }; |: m8 j9 m* ^
{. e! s* A. I; d1 n2 d
paramSet.srcBIdx = 0;
# K! v" |2 u S# e# ]# N paramSet.destBIdx = 1;
2 C5 F- `2 \# n2 _* v& P paramSet.srcCIdx = 0;, a8 V/ p2 U. T5 M
paramSet.destCIdx = 0;2 H# K6 V9 j% H3 K" y! m5 [: G
paramSet.aCnt = PING_PONG_ACNT;
6 I: C+ R% U4 P. E4 t8 U paramSet.bCnt = PING_PONG_BCNT;* I3 `- t( ]) j4 j, r
paramSet.cCnt = PING_PONG_CCNT;* K" T$ [. `* w6 ^$ i
4 r5 V- r6 ^8 ?: [/ x( B+ ]$ a: W
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 T& O# b$ Q' r" ^0 D# [! f3 Q6 d paramSet.bCntReload = PING_PONG_BCNT;6 `( E+ X; o! E+ }0 X1 c, [' P% ~: e5 U
5 w7 ~7 q) ?0 [$ t% T
/* Src in constant mode Dest in INCR modes */: b# b! c [3 K$ d% N$ e; y/ }$ l
paramSet.opt &= 0xFFFFFFFDu;6 X' M9 l( J& k, ~/ X( ]
//paramSet.opt &= 0xFFFFFFFCu;- C# L+ F1 }8 B( J# |0 P6 t
4 Z& h) B* C+ Z" i- O
/* Program the TCC */
3 y2 U3 Z1 q2 }* O- N paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ Y$ G% c1 f5 S
/ S5 _7 U* I3 _" r5 |$ A, x /* Enable Intermediate & Final transfer completion interrupt */0 d( [4 d7 W9 C( h6 R! v$ C! H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; ^& [! p: \# q paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* H; M& p5 j J+ f3 a5 b7 ]1 h
. C2 t& B. m) y1 y /* AB Sync Transfer Mode */6 b$ b0 z; q7 L* q
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: H5 M4 O# _2 v. S# Z& b. a
* {/ G) T/ o7 F /* Program the source and dest addresses for master DMA channel */
! n( g( }' n0 Q4 Z paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 k% S' ~1 j$ C paramSet.destAddr = (uint32_t)(ping_buffer);* ^& m* [' k& S' ]* t
$ V: Z: g2 p# w3 C4 F: b3 [! n* d /* Write to the master DMA channel first. */
; `7 v$ o% o% K$ ] result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, Q0 S% A+ C+ h; t& Y
}
9 O& f1 [1 d1 P
( S% w5 b3 A& ]8 b result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 E! r0 ?3 X+ q! _2 {
% q: e# L- q% G6 }
if(result == EDMA3_DRV_SOK)
& Y" ]2 `3 f6 {: ]) F {9 T! p K( B5 [' T. c( T/ t
print2arm("edma3 driver init success.",0);, E! W& S3 M. n
}
1 a5 f6 x% j( e7 d( ^# }) i1 @6 K$ K}
$ v. ~$ [9 Q O) Q$ T7 z" Z0 ]" |& B4 N: @
/ b- A" L, m; E- G+ u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: \! z- m. w$ T: `$ y. U/ @: Q% f- j+ N4 K- A% U
8 X3 S( M4 Q% x6 V& }
|
|