|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 _8 W- A9 a; \. E#define PING_PONG_ACNT 1, D5 \, D. O/ e0 h( S# A
#define PING_PONG_BCNT 8*32*40 & V o0 |6 d; H' d% ~
//#define PING_PONG_BCNT 1
* _- K2 G( ~5 {3 W$ Q4 w4 ?: \#define PING_PONG_CCNT 19 j( K) s$ v9 N* T) Q' {
#define MCASP_BASEADDR 0x01D00000
/ x, N& U9 `- }' _# Z3 O! j0 k#define Mcasp_RXEVENTQUE (0u)
6 Q* [6 }, I7 {% v( e- r) X
& O V7 ~. R0 Y6 W$ D/* OPT Field specific defines *// K1 D6 l3 Z8 P7 x* I% e' q
#define OPT_SYNCDIM_SHIFT (0x00000002u)! C# L4 a, F/ b' a% |
#define OPT_TCC_MASK (0x0003F000u)
* c6 u0 a1 ]3 _! w z#define OPT_TCC_SHIFT (0x0000000Cu)2 y' Y; u% k) C' M' o) h
#define OPT_ITCINTEN_SHIFT (0x00000015u)4 z" a D9 {: R& a
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ Z3 F* l$ F' j& J6 P) m# G& ~% b" T* Y
char ping_buffer[PING_PONG_BCNT];9 S* e4 ]# H. ]0 c4 O6 K
char pong_buffer[PING_PONG_BCNT];) t' k. y( x. m$ V/ ~
5 D+ C- t( W. i6 h
% x& \3 G' \& E6 M6 s0 z3 x, `* K. e9 K& h' i4 W
# v, w9 H8 M% u1 Q8 _# T, rstatic void ys_edma3_init(): o/ y9 E/ a7 ^# q" Y* j
{
- o+ d( @# ]( a EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: y1 K$ i8 g6 s1 t+ Q# X
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 I( E: _. ^" n EDMA3_DRV_Handle hEdma;
, Y9 F; z) D; b2 ^* }* } uint32_t chId = 0;
: e+ C( r2 z% z1 q6 u3 A uint32_t tcc = 0;* C# ~' M2 v( y
/ W9 l' W5 X; N9 L
print2arm("edma3 driver init...",0);
9 o, P" g& @* D
9 {6 t; t4 J y% [# k2 u) V hEdma = edma3init(0,&result);, S8 H( B4 }% G
if(hEdma)& J& {# l4 H, c: p( `
{. ?; L" h {7 _$ Q$ M
print2arm("edma3init() Passed.",0); d/ H& b( t: l0 k
}, j7 r1 D3 p0 T$ z, v& [6 U
else
5 ]$ A( i! {, O# J {
& L( [0 [* l' T print2arm("edma3init() Failed.",0);
8 f% B, b! c, F9 w/ e- g }
2 V. ?0 C, ^3 n0 s$ b1 q# G2 r
$ u+ G: j1 I9 G8 N8 [' b if (result == EDMA3_DRV_SOK)
5 `! g | Q0 n3 K& u {4 B! a) `8 L& W6 I* }$ c6 E
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; C8 b6 K4 j' B5 a5 n* d' k (EDMA3_RM_EventQueue)0,7 f8 i P1 {6 z: \ ?, N
&edma3_isr, NULL);! _0 A4 R P: F, V$ A( G# ]
}
* S: D1 d% M" u# v9 |, p: v- K
0 l5 Y: j- ?4 J) L N if(result == EDMA3_DRV_SOK)& d& S0 r4 e- m) r% P$ a
{
! T1 C" H& s( G paramSet.srcBIdx = 0;
( k6 Z/ X. u9 ?. [0 \# L paramSet.destBIdx = 1;
w5 M$ S& w, f* x$ C" o8 d paramSet.srcCIdx = 0;
4 \1 b6 S; Z3 y4 h, N% A paramSet.destCIdx = 0;8 U) I3 v/ Z; Y$ Q2 U: _7 O4 u( g; m
paramSet.aCnt = PING_PONG_ACNT;
+ N9 f8 k# z& n1 @ paramSet.bCnt = PING_PONG_BCNT;4 b1 w S% A* B' G
paramSet.cCnt = PING_PONG_CCNT;* n/ H( ]- I& ^( O
2 f) J" ], S; E: V
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ v' F% K$ `/ l5 j' K& f paramSet.bCntReload = PING_PONG_BCNT;- Y9 W# r3 Z0 l1 N1 I; J0 u$ I
, j1 `# t; F) q& |* `: e) K /* Src in constant mode Dest in INCR modes */
7 t8 X! s: \: g6 _& v3 x paramSet.opt &= 0xFFFFFFFDu;5 X6 p5 g, d S4 o' P! ]+ M
//paramSet.opt &= 0xFFFFFFFCu;
6 ?/ j0 B8 N0 \* v9 L # C$ q% ?2 d1 L7 y7 u
/* Program the TCC */3 U* m9 q: q; z# C" D: ], p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ S: J- ?8 j% `& s/ F$ m& N& S* ?, O& K/ P
/* Enable Intermediate & Final transfer completion interrupt */& l4 q8 p% q j5 b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 D6 x2 D' m+ Q$ B( H: _3 ?
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ f; Q, U% l* N6 a+ i6 V
3 V- d" b- m- A+ {- O+ A /* AB Sync Transfer Mode */6 K0 Y3 l- x' {+ H0 T+ B
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 v7 P k8 K! V
0 z3 E/ q9 ^" [/ R! f /* Program the source and dest addresses for master DMA channel */
/ N" E6 D s$ v. V paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' n6 W4 t8 u* X [6 t- x paramSet.destAddr = (uint32_t)(ping_buffer);
. y; k" m/ n2 w8 T7 v2 T" E7 C
: V e6 x, @' V \ /* Write to the master DMA channel first. */# ^/ w# a7 S& J5 M( ]' j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
G0 R4 i }( v/ C: X X6 _/ A } * f. c C- G6 _/ d1 F/ _3 ^* @7 X& h8 B
5 V* f' ?$ j' p" j7 ^5 V result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ I* [5 h E0 ^6 e M% S- k8 @
7 m4 a# N9 r7 G l% z- e+ y- [ if(result == EDMA3_DRV_SOK)
* j8 ?" B6 t/ \5 r' P% i {9 t4 N) s1 U4 v% @9 S0 q
print2arm("edma3 driver init success.",0);
* V0 z5 _/ B, }& C } / R# d2 y6 O3 Q4 a( |) W
}8 q% @0 K2 O# g, f# t. Y
6 s2 r+ P/ W0 C4 V' w+ y- H2 Z& ^; B! w' {/ }; X2 o9 a' o& z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ V5 {( m3 e% c! @3 O$ b
+ |. \8 N1 ^6 C( M9 O$ d
- m6 q; g- r- U& ^7 r \4 t# W
|
|