|
|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 u5 D; ~& s* h" {- _4 i- |
#define PING_PONG_ACNT 1% i# {! T/ y" [, V n, z
#define PING_PONG_BCNT 8*32*40
5 D5 c( c* J+ ^2 d//#define PING_PONG_BCNT 1 5 [4 ^) M { e1 Y) x: |
#define PING_PONG_CCNT 1# I, n; x5 L7 c1 ?8 x: N) w
#define MCASP_BASEADDR 0x01D00000
' o6 E& G* L2 e1 J" s+ h8 _, Z#define Mcasp_RXEVENTQUE (0u)8 R. H8 w: c+ n/ k! h& b$ F; M
9 P+ U3 N0 `* ]/* OPT Field specific defines */4 C0 v7 u( D# f2 R
#define OPT_SYNCDIM_SHIFT (0x00000002u)- y3 y8 L, f& x0 B2 ?, P
#define OPT_TCC_MASK (0x0003F000u)
2 H- q0 `! z3 I#define OPT_TCC_SHIFT (0x0000000Cu)
n8 l* `4 N( y- n+ S5 P#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 A8 |8 c% ?8 h#define OPT_TCINTEN_SHIFT (0x00000014u)+ X* g( U4 m6 F$ O) u2 t' s, M" j
- j; X$ U2 O6 r$ C
char ping_buffer[PING_PONG_BCNT];
9 {/ l. @0 A; i wchar pong_buffer[PING_PONG_BCNT];
$ `8 X! t- e- E9 o5 l3 L3 O } m5 C( K/ k8 z, G0 o; I9 U
* g3 X- B: s8 J
8 m) O3 B1 B! Q( U3 T
; ~& K' g, U! h; V& K: j1 p
static void ys_edma3_init()
/ ]$ x' o& P& w' w7 ?! r: x% W{- O) r* e/ h7 d. H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ W2 P6 ^* j# j6 T( E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ o* F" o, ?/ G( H) F Q EDMA3_DRV_Handle hEdma;" a- a" F& j e
uint32_t chId = 0;
6 S8 Z: p( ~' Y uint32_t tcc = 0; x. N3 p! U6 C( b. I. ]
9 t9 L" k% H/ l print2arm("edma3 driver init...",0);2 j$ _; ^" S) g8 w; R+ G- k
2 a+ x, h% Y; O3 f7 D& h
hEdma = edma3init(0,&result);, b1 i% v3 F. W) b _
if(hEdma)4 L- Z- y8 c7 M; Z4 W
{( [6 S. a/ T& W2 ^; u$ F1 N
print2arm("edma3init() Passed.",0);: A3 y$ ?" C- [; @* [$ z
}4 w0 i& t! P; I' M3 I
else3 t7 \! J+ k7 v; N& t. B# Q M: e% k+ s
{2 |) B: E, ~: U+ \' x6 W! [; E' y
print2arm("edma3init() Failed.",0);
' d8 L, P$ I" W% Z m! L$ g2 J }. k; V: P- g- I2 r, o
) ^2 G8 p" j' n# T8 ~ if (result == EDMA3_DRV_SOK)4 N2 M9 r3 w" _9 s
{( j6 e& f! e7 N% J$ |! J' ?# `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# M7 H/ ?! }5 h) N6 C0 T2 H
(EDMA3_RM_EventQueue)0,; b4 M5 x" S3 Q' v
&edma3_isr, NULL);
6 ]2 z( n2 P k7 t. B0 \ }
~/ _- q$ e# Q6 D$ s
7 Z& e% j8 J/ t$ B7 ]$ H if(result == EDMA3_DRV_SOK)
- N k7 P/ ^- d& [; w9 }/ G, [ {+ R: w G, C! j) p1 r0 [6 b& v
paramSet.srcBIdx = 0; c- T# u4 B6 @5 ~% N/ w5 ^- t
paramSet.destBIdx = 1;9 B" i1 n$ \9 W; O, h( h- m4 m9 I
paramSet.srcCIdx = 0;2 m, K% O; M0 C* z. o
paramSet.destCIdx = 0;6 V' @3 `6 k8 ^5 X4 |/ H, I
paramSet.aCnt = PING_PONG_ACNT;
7 x: N* c( a9 ^( z0 Q paramSet.bCnt = PING_PONG_BCNT; P8 @" S g6 r6 o% A# { x3 I
paramSet.cCnt = PING_PONG_CCNT;+ ^$ D6 }1 ]; v7 W S
# T+ `; h2 m& j: j4 p* V /* For AB-synchronized transfers, BCNTRLD is not used. */
. ~' p; S+ p' r5 v paramSet.bCntReload = PING_PONG_BCNT;' w, ?' f- d% X) z$ Y
2 }, [# [. a+ X8 i3 }& [9 Y /* Src in constant mode Dest in INCR modes */$ G# l- ^8 B8 |, ~
paramSet.opt &= 0xFFFFFFFDu;
' t2 v# K: i4 k- m& d1 \ //paramSet.opt &= 0xFFFFFFFCu;
6 F6 g7 G; n9 Z m) { * y( b* c) L- P( T/ v6 ~3 u X
/* Program the TCC */
, C* {3 ^% G6 N9 e9 ~7 q% { paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);9 i/ T4 p- k1 N& W) g7 B
, h9 X0 ]" r/ C7 z, x( V" {& l /* Enable Intermediate & Final transfer completion interrupt */
0 @- |, b) l" Q) C, J+ B# i7 a paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' e- s* o: [2 A# Z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 |7 R+ J: W5 L: z! O, e& @6 {
3 P' V# Y3 g7 A* @7 G4 u /* AB Sync Transfer Mode */
Q2 ~3 C3 `# I! G paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 n2 F: U$ x5 A3 X* h0 d
+ X6 }( ]; G9 l7 O
/* Program the source and dest addresses for master DMA channel */
; d6 y( M0 U8 _& J paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 r% K. E9 N4 f' r, p paramSet.destAddr = (uint32_t)(ping_buffer);
) M W e% I* e$ q: ~6 A& T2 i0 X1 k' T
/* Write to the master DMA channel first. */
8 `9 P6 f; b6 L* _6 o4 C. f result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- D: w' b' u) ^5 j6 Y
} ; l" S/ n5 ^7 @, z( c
! }/ O' {- v/ v7 H) H& c result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: D/ a. n, x( _+ y9 D! d
" k9 _# }0 @) r. r( I4 V0 ^3 z. @ if(result == EDMA3_DRV_SOK)
! E1 {( g3 a6 E" W2 t {
8 J3 ^/ n ?# ^ print2arm("edma3 driver init success.",0);, e t: T- r1 B& a: @8 @
}
I" h s3 N2 l% K, ~}0 A9 I3 d4 d! t# v7 k
. }# K) D }" B' l
: K1 y- ^& p) r/ U+ h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 A% L) c+ H) K2 m2 Z; _
* `: T6 N c3 G: M9 I3 M* |" q
6 ~( @; ]# x: ~/ S' T: w |
|