|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* G7 m+ s7 t1 W% v3 c, s#define PING_PONG_ACNT 18 [# h9 ]* ] F) o! w
#define PING_PONG_BCNT 8*32*40 & Y H2 {* L" u3 ], E: A
//#define PING_PONG_BCNT 1 : _1 t8 n& Z3 q1 s% i
#define PING_PONG_CCNT 1, n" E! N8 o9 w; n. `9 V
#define MCASP_BASEADDR 0x01D00000. s7 { D: Y. o: s
#define Mcasp_RXEVENTQUE (0u)' a) q; D, i- p; \3 h
" w! m+ ?7 \0 x# M$ F5 T' y/* OPT Field specific defines */
. [( T8 F' c' C#define OPT_SYNCDIM_SHIFT (0x00000002u)" P3 M8 m6 [- j+ f
#define OPT_TCC_MASK (0x0003F000u)! o1 Y9 v2 v0 ]- o. I- W8 ~* u/ B
#define OPT_TCC_SHIFT (0x0000000Cu)- F. ]) W. ?7 A% I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. a9 g4 o/ H1 M6 q) j+ S, N( d#define OPT_TCINTEN_SHIFT (0x00000014u)
/ O% m" t% c( T
1 \. ?4 L) v1 L2 gchar ping_buffer[PING_PONG_BCNT];9 M7 m s: ~3 W- B$ k. L' u1 v* r$ n1 h
char pong_buffer[PING_PONG_BCNT];
9 n6 p+ y, @" u
|5 H1 J$ {& W0 q: U8 u& ~: L9 d' S1 ^) B5 v
: @0 f8 Q$ D( f6 Z# j
$ b0 J/ [8 H7 F4 U$ N/ x6 w! x% \% M
static void ys_edma3_init()9 j7 r' j4 E) `1 ^5 p
{2 {/ O! t3 ~# D4 v) b: H4 w, A0 F) G4 m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ ^1 R, p- ` K3 O5 u8 ^ EDMA3_DRV_Result result = EDMA3_DRV_SOK;% C) f% a! ]% t4 G" t D/ r
EDMA3_DRV_Handle hEdma;# e. Y U4 f% x0 A9 U) [
uint32_t chId = 0;
. Z4 v2 W2 M0 P. s# H0 P: K8 C3 V uint32_t tcc = 0;, m2 c5 K. s1 a) g
) {; }1 y ]9 G ^! z# E3 ^
print2arm("edma3 driver init...",0);
5 m" g8 q/ v7 A) Q7 J
, z( X" @4 c& M$ t9 J! ?$ a hEdma = edma3init(0,&result);
9 j, I3 t1 g$ n( |, Y/ C5 L if(hEdma)7 F8 F; b/ Y$ q4 t2 b
{
6 t) D: V1 `) |" O+ r# f9 G: @+ P print2arm("edma3init() Passed.",0);6 J1 a1 y: y: a3 Z& h# h# _1 g' ]
}9 u' P2 f: A; O& I9 B( J
else
: M' g- ?. }( ], H I U# O {
# d! W3 ]' S! F' ]$ M7 q& c9 B9 a: V print2arm("edma3init() Failed.",0);) x; o/ s) [ i9 l. M# |6 N
}
5 ^% P+ j, R6 I8 o 0 t6 H; Y& k6 w* _
if (result == EDMA3_DRV_SOK)
+ L: v% m- N, \1 ~# o3 k5 { {
- z. \- Y; I- v0 u7 C- X result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- D* [( e. ?! l7 g( m& ^2 M; g7 D (EDMA3_RM_EventQueue)0,
* n s! \7 |5 `/ J &edma3_isr, NULL);. M. s) \6 S4 N+ }4 G
}
F0 \. v) t5 b. o4 k7 I
/ L3 l l" n$ r2 @ if(result == EDMA3_DRV_SOK)
$ ^! O1 |, j& J9 p; H9 Q {
1 f- U7 E* X4 ]8 @3 E) g) V paramSet.srcBIdx = 0;
2 ^9 h# |3 m' |+ W4 q0 ~ paramSet.destBIdx = 1;) ?# D8 ?5 ]( i/ G" C" O* t" `
paramSet.srcCIdx = 0;
) M3 W* { I2 F# _6 A/ F paramSet.destCIdx = 0;
8 `% f( N. I$ z1 m! J paramSet.aCnt = PING_PONG_ACNT;
5 n p! r! n: i9 T) e paramSet.bCnt = PING_PONG_BCNT;
, z+ V' l4 ]2 _ paramSet.cCnt = PING_PONG_CCNT;
9 J2 T+ x+ R0 H
/ y& ]) {0 b7 j" J9 I2 X# Z7 V /* For AB-synchronized transfers, BCNTRLD is not used. */
! a" X6 y2 H% [( U' Z- h n paramSet.bCntReload = PING_PONG_BCNT;" p D" B; ]# _- E) a9 ]
& u" ?7 V; S9 N9 T9 o2 T /* Src in constant mode Dest in INCR modes */
4 [* u" h6 h3 V* A/ F paramSet.opt &= 0xFFFFFFFDu;
) q5 L1 p0 H6 m i( {6 w6 M //paramSet.opt &= 0xFFFFFFFCu;
3 f& S2 J' {' H
$ C% A& V5 s1 Z( m /* Program the TCC */0 P9 ]" _; G% \) V `% i+ ? {
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! W! Z' ]" m+ C5 f/ _; D8 y. v
: ]' |$ Z+ M) l3 C /* Enable Intermediate & Final transfer completion interrupt */% ?- H$ B& z# ]4 R+ G( H, B! G
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; X1 t. e/ _& t! @
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, K! H) i! ]6 r1 H
- A) k6 _- v |- P$ ] /* AB Sync Transfer Mode */
: S/ Q6 P! X, E1 ]+ z paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( v* p$ S/ `3 n( N* j
6 E8 G; o6 i; r! G9 E. V /* Program the source and dest addresses for master DMA channel */$ @+ x( u. U4 X9 R/ r5 k
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);# P. I! U8 \* l# D
paramSet.destAddr = (uint32_t)(ping_buffer);
8 [* c; f+ i. o7 C% h G: y" [- o+ g2 \4 Y W8 E- w) u
/* Write to the master DMA channel first. */
/ ^. C a4 ]( {$ e8 d: A7 I: e result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 Z8 H+ o( Q! C2 D( G7 O. Z }
6 U! r9 d, L( o1 w+ A- j0 f5 m
3 t: ?9 t+ i7 M- p1 u. v0 o result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: ?1 t$ P P+ W( v: ~+ |
, ?# F |. U/ H. h- ^, k4 a( r
if(result == EDMA3_DRV_SOK) ; Z( x6 y! D/ b6 V6 D
{
% f3 j$ h! T9 y7 ^( X print2arm("edma3 driver init success.",0);* }9 S# N# D* @( @; ~: j
}
' R* x0 l5 r K, i}
% s% O9 ^) a* ?7 [' _; f! p& f e# Y g! `3 e4 ]1 Y& _
+ }+ h/ O& |/ R, YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ R" D4 A1 ^& n# x r
5 C% _: G$ f( o* g& }2 I- ^6 T- O$ k' O# d" E' B
|
|