|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& d: t; t2 M; b3 z1 E" g#define PING_PONG_ACNT 1
/ {* N7 t; N3 g#define PING_PONG_BCNT 8*32*40
- }/ @# X/ [3 K) t7 W6 r//#define PING_PONG_BCNT 1 9 `% J6 q. u0 L* m! n. {
#define PING_PONG_CCNT 1+ L0 E+ f+ v. I$ r: S3 Y
#define MCASP_BASEADDR 0x01D00000
: k c2 x" x6 H) j; k( h% |#define Mcasp_RXEVENTQUE (0u)$ X9 j2 C/ e2 D
) D# k! \5 Z; k* j; `, U, p' x/* OPT Field specific defines */. J+ J) M3 G( z
#define OPT_SYNCDIM_SHIFT (0x00000002u)0 U; Z6 T& M! i: M& Z1 F Y
#define OPT_TCC_MASK (0x0003F000u)
3 i( |. S3 I0 k8 O: ~#define OPT_TCC_SHIFT (0x0000000Cu)
) U( f. t; w+ A! q& ]$ w4 E#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ s/ o% f% I. ~#define OPT_TCINTEN_SHIFT (0x00000014u)5 q( R' Y# L. K% x0 i5 \5 ^
0 H; D" {! H$ I- t: t! |char ping_buffer[PING_PONG_BCNT];& c* _/ z5 Z& |7 v$ w, x
char pong_buffer[PING_PONG_BCNT];
- a+ g" M4 H" A$ X" Z/ Z) V0 M& i1 M; r" S+ X0 ]
* u! X- A# y; x$ m
- x1 e5 b& |- ] }% \" ^1 g2 q. _$ j( A1 S) O8 l0 i, B$ m; N6 S
static void ys_edma3_init()
# L/ c! a: T" i{
4 {! D" i0 N- v3 v# B3 x EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' w0 k9 x4 F8 @- q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 \' y7 u6 f4 L4 r% T EDMA3_DRV_Handle hEdma;' m# U# x) y. K% b( X4 R# N& i
uint32_t chId = 0;
, n: f" e; J: b* ?$ H uint32_t tcc = 0;
: c3 G: O% V# h7 y% @0 t Y- C1 N4 t
print2arm("edma3 driver init...",0);' n5 ~6 T7 s9 M/ s F% t5 u
" T0 L; ]: D. }: Y- w6 h' Z hEdma = edma3init(0,&result);# z0 b8 b' Y) L1 h
if(hEdma)* s5 v6 n: ~9 t; n+ C
{# l; q1 T. g9 a
print2arm("edma3init() Passed.",0);( o$ G+ \+ k6 s9 Q- x
}
2 [2 r" p; e# }7 ~4 ^/ k else: s/ G4 j) z$ U$ g i: ^) b" C( J- V' x
{
2 |5 h4 k7 E2 {9 m, K print2arm("edma3init() Failed.",0);1 D$ ?0 `$ f. Y% P
}6 ^3 ?1 h- a* O, D, N4 M2 _+ y) e
1 _7 D' c+ p; v1 ^4 T) \
if (result == EDMA3_DRV_SOK)
% ~ z2 J8 I7 q! n" v' @4 j, {) o {* x% {' _& n* J1 I: F T' O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 Q% J( E, r0 c/ s5 [. G
(EDMA3_RM_EventQueue)0,
! [5 g6 i+ ?' h, B [ &edma3_isr, NULL);# I" W; G8 ]$ m9 Q3 ]5 e
}& s# T# X' v- [% J8 m
0 p! F& z6 ~- P) |& T0 |
if(result == EDMA3_DRV_SOK)
5 d1 ~" G3 |5 @' ~+ v {
; j) x, V: t) G$ s# H0 m4 M paramSet.srcBIdx = 0;
9 Y9 g1 J, h9 N" o paramSet.destBIdx = 1;3 |* |( l( T% K5 o
paramSet.srcCIdx = 0;
5 M' O& k( j6 c* K7 b1 }# l paramSet.destCIdx = 0;5 C: T% c! G1 c) p" d& F% t. B
paramSet.aCnt = PING_PONG_ACNT;* }5 X+ j, Z' E' z" i* k
paramSet.bCnt = PING_PONG_BCNT;
" K- Y- s2 }. X paramSet.cCnt = PING_PONG_CCNT;
- T- H) @3 A% N b2 `; N
, y7 X* C V8 ^4 R /* For AB-synchronized transfers, BCNTRLD is not used. */& W! | j- o% F- w! ~
paramSet.bCntReload = PING_PONG_BCNT;3 z8 H" Q' t/ h
% [3 X( ] M, n# N6 n* | /* Src in constant mode Dest in INCR modes */6 t# L$ i- B8 H. m" z/ P4 D' l
paramSet.opt &= 0xFFFFFFFDu;2 D6 L8 M: G2 X2 @; {
//paramSet.opt &= 0xFFFFFFFCu;" B& ~0 R6 X* {! T5 K+ Z0 c9 r
8 y7 P5 l+ Q* E1 l5 K
/* Program the TCC */0 v0 b6 S9 a2 t+ i* k: p$ C1 ]
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- x; I5 w }6 J- s
0 K+ q7 O+ P0 k. O7 G' J& f7 ?' M /* Enable Intermediate & Final transfer completion interrupt */
5 t/ T4 L/ n' l" E9 \ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* L% q8 Y' F2 J' y$ i& w7 ^$ L paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 B) x* S R2 b! E8 i; M$ i% {1 x" z" r& R2 W! _2 Z
/* AB Sync Transfer Mode */
& j, w$ `6 V3 j0 J paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; u5 m. y' _9 @( J( d
) E; H" S; x: u, p6 e1 K3 A X2 P /* Program the source and dest addresses for master DMA channel */
- X- _% Q u3 A% s paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);( O! ~7 Q+ |: D8 ^1 @& O% W4 C
paramSet.destAddr = (uint32_t)(ping_buffer);
) j* c* r1 c7 P5 S* Z/ ^9 e/ P
* x/ d6 |: ?3 n. j0 F" q# k% R0 J /* Write to the master DMA channel first. */0 t% z: H2 E/ l) S7 ^$ }! q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);! X& r) c p- }" X6 g
} " ]( N$ ^+ N% M2 H. m$ |, Q
6 s) v' W7 m8 ?# U/ O6 k1 I/ f- [
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);+ u/ R3 c- ^. _' O% V
" k p6 ? W5 {1 O+ A if(result == EDMA3_DRV_SOK)
' f" j ]/ {* s5 ] {
0 ]7 X! n. Y: x5 c) F+ Q print2arm("edma3 driver init success.",0);3 W( \' r) |. o4 w& G3 \3 D1 u. a- w) Z
}
; m! `/ ?% w& H1 i5 s3 k}
/ R5 e% A5 S9 s2 j4 H4 A) N8 d4 r* K2 O" a: m0 O
I7 m" }- z. q' `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 Y3 S6 k' y' p b1 b1 N
9 F9 _2 ]4 | {1 o8 X7 k' Q2 `/ E+ b
9 J3 S. o2 D7 p) t |
|