|
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! y' `1 v7 C+ m' j7 b
#define PING_PONG_ACNT 1
, E1 G1 d" u, `% \#define PING_PONG_BCNT 8*32*40
7 K/ P, q) k. q//#define PING_PONG_BCNT 1
% A% D- u& q0 @+ [0 \ X/ Y& S#define PING_PONG_CCNT 1# V4 V% p! N3 z
#define MCASP_BASEADDR 0x01D00000# j$ E1 t7 \6 M7 }3 p* u
#define Mcasp_RXEVENTQUE (0u)0 M2 W' M% w3 X- E" E
/ Z2 b6 c) [0 j5 `1 W/* OPT Field specific defines */
* S# ~" B) B# d' G2 y) f. d#define OPT_SYNCDIM_SHIFT (0x00000002u)
. a& [; W. n* i7 `4 Z#define OPT_TCC_MASK (0x0003F000u)
$ ~. |! k" k7 g2 j5 y#define OPT_TCC_SHIFT (0x0000000Cu)
6 Z$ q, i+ c1 M#define OPT_ITCINTEN_SHIFT (0x00000015u)
# Y& s) Q5 m0 b2 l* M% Y#define OPT_TCINTEN_SHIFT (0x00000014u)
' \" F9 J" r* p. A* x1 J1 _* t; L5 P( C( f* r* a
char ping_buffer[PING_PONG_BCNT];
, V3 \2 ?8 t: X1 f- Mchar pong_buffer[PING_PONG_BCNT];$ z) [6 p1 w8 a
% N3 K% |: M+ \: O0 p K' F$ t: m& z6 m/ V( n, y
2 ?$ u1 B; c6 x2 c2 N% z# O6 z
$ Z8 K. f9 _! R6 a. nstatic void ys_edma3_init()! ^" q2 L! V. T: w; X' m" q
{& @9 v# @$ Y. e, v
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 o( Z4 y! I1 V5 ` EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ P( ?% K ~3 Q3 s; P
EDMA3_DRV_Handle hEdma;
% `. L3 @ |% D' @/ { uint32_t chId = 0;
' X; `$ Q( `1 T. Q3 n5 Q uint32_t tcc = 0;
3 `, Y7 k: V5 V( u# `5 [) }8 y/ U, V7 X$ S# i
print2arm("edma3 driver init...",0);' c6 N1 z& L( X( o; d
/ |/ M- o7 y! D3 j+ _6 `
hEdma = edma3init(0,&result);+ F9 z) i5 @& E* o! }
if(hEdma)9 F; h: E* {, W5 `- z5 r
{
( \9 o! V5 q( ]! V+ m print2arm("edma3init() Passed.",0);
( Z E% A, E2 m- ]: n0 K }
) {. V: J) G4 X% y# h6 t: k& O* L; A else$ M2 j. `) I: Y7 B) g1 I% C( E
{8 p8 S) _2 ~9 o
print2arm("edma3init() Failed.",0);
4 x0 G4 u( s2 @8 } }1 ~# a1 p0 y1 ~, T3 k
. ~3 _) q% s6 u6 B& g if (result == EDMA3_DRV_SOK)
3 s0 G) Q; v$ d {' o% I) f2 [4 z" D% ]2 G
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' Q0 y$ ]7 E6 {/ e( G8 w (EDMA3_RM_EventQueue)0,; q5 F& F, T1 o7 v3 ~, f
&edma3_isr, NULL);
. L: G- C# V$ o }
# E: H' q$ C2 Z1 b8 _
# B3 k3 M% M( B( j if(result == EDMA3_DRV_SOK)
& c. Z7 A1 S. [" M* K$ @5 n5 \ {, E7 z# z2 m3 F) h6 s% s L
paramSet.srcBIdx = 0;
, J1 m, c5 z8 T7 A1 r paramSet.destBIdx = 1;
! y1 i$ t. g' f' e* N/ X paramSet.srcCIdx = 0;7 H0 v7 X0 E/ H; J# D8 @4 F" z
paramSet.destCIdx = 0;/ n) @9 T( C" n/ m
paramSet.aCnt = PING_PONG_ACNT;
( N+ g9 N3 F* ? paramSet.bCnt = PING_PONG_BCNT;
' l# l, D. I' z# q* W paramSet.cCnt = PING_PONG_CCNT;
/ e" M) U, R( Q( I % _/ P( C8 N: Q3 m' ^- ^4 _0 w3 r
/* For AB-synchronized transfers, BCNTRLD is not used. */4 P% ]0 K/ y4 Z. `( ~
paramSet.bCntReload = PING_PONG_BCNT;
6 | | s4 ?4 W! d/ Q; S. X; S) s4 ~/ P0 B+ h9 {& s
/* Src in constant mode Dest in INCR modes */! E. q5 h+ C' r+ m6 e! s% f
paramSet.opt &= 0xFFFFFFFDu;
% e/ l% K) A4 h" Q/ D //paramSet.opt &= 0xFFFFFFFCu;( Y+ a* O% ^/ y, e* D
8 M i5 g* Z; J, `. T
/* Program the TCC */+ n. o8 a7 x- ]$ r1 F4 Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" D5 _! J5 g6 I- C- [; G
1 A. B7 N! i1 B& T /* Enable Intermediate & Final transfer completion interrupt */
# H+ T- b% X, Y! I, @: q( g, ? paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% Q3 C0 o5 C1 i2 p paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* A. l* t# e/ {
( U, M/ ^% W0 F" o; ]) O /* AB Sync Transfer Mode */
+ |" ~' W+ F, z0 n8 y) _) E paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);- T3 q% t, V0 I7 x8 o: ?7 b
% w2 U4 U" [) ~6 _2 d
/* Program the source and dest addresses for master DMA channel */
( X& ~$ u% Q9 B$ q) \8 z8 C paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);! B( V4 C! g1 S/ v* R2 D# U. \3 V
paramSet.destAddr = (uint32_t)(ping_buffer);
3 Q. J2 } H" X4 ~+ k" m/ J( W3 H5 Y1 A$ {- j g
/* Write to the master DMA channel first. */
- i% L$ ^& }" d! k, _6 X result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);. k! D' L3 g# z
} % l/ [' q6 I% z' C; u; p. e( i8 S
5 [3 t5 N; c- e( d2 l; O* P
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* A: B$ B% G& \5 F# W$ [ n1 B 5 V4 }, u9 J) a% Z0 V( o: @
if(result == EDMA3_DRV_SOK) 6 q4 ~5 W% s- R4 [+ I1 E
{( h1 `; T- f) s, Z f" B# q
print2arm("edma3 driver init success.",0);( o0 ~: f$ H2 F, j9 n
}
9 `9 B: ]; J" v8 e( l}
6 ?! W- j! ?3 ~' d
/ ~$ W- T; J9 `& u, G
3 C5 M( n: R5 i& rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 E/ ~ P+ [6 p9 w
% H1 r0 F- \" O% S5 m9 e) ` k
|
|