|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; j0 s' I8 p0 B
#define PING_PONG_ACNT 1
' \9 `' d7 i: t* ? q+ Z#define PING_PONG_BCNT 8*32*40
" {( J& E3 \5 y; \/ Q& }8 O- G//#define PING_PONG_BCNT 1
8 G' |. ?/ E6 B, ~3 p2 s* V7 J#define PING_PONG_CCNT 1
+ G; K/ ^1 G- U! Y. C; I- t0 m# B- R7 |#define MCASP_BASEADDR 0x01D00000; w B8 Y" ]0 d. ] \
#define Mcasp_RXEVENTQUE (0u)
: X1 ]0 T; F7 o% E8 T
; M5 ^& N" x% {( R4 d/* OPT Field specific defines */" X7 w8 A5 C& J9 ?1 {" P
#define OPT_SYNCDIM_SHIFT (0x00000002u)( _+ M5 N& Y+ B* a) Z, N- x% k3 }
#define OPT_TCC_MASK (0x0003F000u)0 c4 [& H; Y {+ Q
#define OPT_TCC_SHIFT (0x0000000Cu)
2 X: k+ M9 G& ?/ `5 [0 ]; G#define OPT_ITCINTEN_SHIFT (0x00000015u)
! u/ j% o. _: T7 z% U5 x( n#define OPT_TCINTEN_SHIFT (0x00000014u)5 k9 Q! T: s3 X Y% C& w O) o B2 R
, `% ]4 D) |# X! F L, X. ~# W
char ping_buffer[PING_PONG_BCNT];
9 Z9 c; e: P( S# E8 M6 S5 Ochar pong_buffer[PING_PONG_BCNT];
/ F$ @6 U/ M; ]; W: u/ l1 R6 ~. L5 |
, v P2 Z& a1 g: }
. V& t$ w" A# I A6 M, g) P/ |0 M
/ B3 o/ U" m: F) P: p% g: Qstatic void ys_edma3_init()
7 O9 ?9 |( }, H( r, N; V. L& _{# Y2 `% c& `4 z& n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 ], G6 Q( X! V, Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;( B' K" }. {3 m& W4 x4 [* }
EDMA3_DRV_Handle hEdma;! W' b; V$ \/ g. T
uint32_t chId = 0;* }# c4 o* z: f* O1 \- N
uint32_t tcc = 0;. K2 Q/ K: D; T/ x
( G* a# g* o5 m print2arm("edma3 driver init...",0);
5 a8 ]; R' W( W3 j8 A: j- X# J( b* o3 i- R3 O) l4 U" s5 N/ y$ ?+ P
hEdma = edma3init(0,&result);
9 V z9 p+ f/ m% j6 _, D if(hEdma)
) K' @1 V% D, S& i3 o5 a5 P {
4 A- Z- A! F$ C8 L; } print2arm("edma3init() Passed.",0);
! D1 i% @* L$ n, _/ H }. {- U9 @3 U, g. h
else# w' b5 ~4 G) R- P ]% J8 S
{# n, }/ x4 g: r
print2arm("edma3init() Failed.",0);
2 @8 t) a# E; P% ]$ M }
$ {, w1 h3 R& g' M 9 X- h" N( A9 N% d' ]. l9 Z/ q# v
if (result == EDMA3_DRV_SOK)) r# W4 e2 ~- ~
{
8 q9 P6 a7 t& M0 o" [, I result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 H0 N7 z4 L1 V1 m (EDMA3_RM_EventQueue)0,
% Z9 p2 I" y C4 j8 F5 \/ p &edma3_isr, NULL);# O' P! r+ D! m6 e1 V5 U r
}- b( ]- v( n) O% K3 h) @
! q3 o# T# ^5 _4 {% ?$ P
if(result == EDMA3_DRV_SOK)
7 I/ a8 m2 L0 f6 Z+ C2 B% j) ?5 m {, l6 F' n( H) k M8 l1 H
paramSet.srcBIdx = 0;+ @ r5 r2 @: \& c' O5 V; _+ N) i
paramSet.destBIdx = 1;
t5 j R4 G+ i9 _2 j1 l% I; Z paramSet.srcCIdx = 0;
1 H+ M3 o3 S" M1 [7 } paramSet.destCIdx = 0;
5 P) E+ b- Q5 P. G paramSet.aCnt = PING_PONG_ACNT;
1 v) M) B% I i5 X! v7 A y paramSet.bCnt = PING_PONG_BCNT;! ?8 w8 r) d A. {% w
paramSet.cCnt = PING_PONG_CCNT;
% \% v5 \" u# r + O5 a' T8 e4 j- m u2 i
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ L/ G7 p! x. d7 z* f, k5 `' L paramSet.bCntReload = PING_PONG_BCNT;1 @: d7 ]6 h" Y9 v3 o
/ _) w; c* Y4 n- g
/* Src in constant mode Dest in INCR modes */) N7 N( i% _& V$ ?6 a) y y; ~
paramSet.opt &= 0xFFFFFFFDu;
2 @( n) b7 V$ K9 b, Y //paramSet.opt &= 0xFFFFFFFCu;8 E/ H' H- Q7 j$ `; ~* S4 C6 N6 j
4 B% Q) \% y+ D, h* w4 ^( r /* Program the TCC */
5 s K; ^$ q9 G8 S: y$ R" \. [ paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; K9 V2 Z! X7 J3 r7 n- C) P3 q
, W4 L' k- X# y5 _+ U: M9 ] /* Enable Intermediate & Final transfer completion interrupt */$ w* [1 i0 g* R- B6 q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; G, }1 n7 k8 D" e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ y! q& n9 W: k/ b1 ?) T! A+ T6 O
9 `4 z. E7 y) Y; S' ? /* AB Sync Transfer Mode */
8 ?# [- D: N9 X# u5 B( L paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ O8 U: N/ G( l0 n/ ?- h ; K( _& S% g! @
/* Program the source and dest addresses for master DMA channel */
) P ]: i9 e6 H9 {+ H" W paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);7 w& D4 F2 a4 E- @7 Q( \, M
paramSet.destAddr = (uint32_t)(ping_buffer);
+ ?5 e6 b2 _/ }. d3 ~
9 `6 _0 l/ I7 z: n /* Write to the master DMA channel first. */+ Y' ?/ [! I0 ?+ A
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. b& |8 x7 |2 R } 1 Q/ R! M* ~! c0 i" D
0 {# r& @3 Y* v( L d0 v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);" @2 M5 {7 u8 G) j0 B1 ^
# Q/ ~4 F' x, S* `1 z if(result == EDMA3_DRV_SOK)
$ ?2 [# ~# v& `# A {
7 O6 I3 w6 E+ R' q8 {3 J! g* l; T print2arm("edma3 driver init success.",0);
+ F( M5 }( w& \' v }
{6 ]- x1 s# u0 K& e9 W}
" ?" H7 ]2 {* z9 T& f4 F ~" D. ~. [4 N9 l' T5 E1 ~
6 `0 p! y2 T' f5 X5 s( Y/ qEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, v( M* J# X1 E0 a
* S. O. I) @0 I: d& x
( x; p' S3 J7 F* h1 q4 }% }$ r |
|