|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 {1 _- l# m$ H: c$ U- |) J
' u0 J( C3 G$ x# v+ S2 T
问题描述:
8 K2 U" G. M" D: g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
; E. {; ~, P: N6 N3 ?( ~9 `. b8 v. P# T$ |
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 m' u K4 F- `# a2 X0 D5 X0 i. z0 n+ Y3 c
测试结果如下:) J( d7 O3 `0 ^9 r( @5 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 ] c2 e( I7 L. Q$ ?5 ~
, t D6 A. }* n* z
* _4 d: B7 y' E, w备注:! Y6 D8 y( a$ Z! ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& t: y; f# X% F5 }0 u8 u7 K2、相关代码如下:
8 N+ j7 Q x1 v1 O4 u$ Y9 x//UPP DMA缓冲大小512字节& j& r2 n: V2 H! b9 K# G) M/ U
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ Z8 n$ B4 I. z: j* ^; g" I; W- s- h#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 o' \' P6 g. R$ E& r+ V$ X: ^8 U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 j! q5 C- y8 c O" f+ G o7 r' ]: U2 J' l& F
3 Y4 J4 D# D8 ]
//upp接收、发送buffer
& J4 [: d& g' a/ l2 D#pragma DATA_ALIGN(upp_buffer_a, 8)
6 h3 y. C( K/ W7 u+ t, F7 ]1 x#pragma DATA_ALIGN(upp_buffer_b, 8)
3 {" c) D( }( L9 u/ a( A- w1 A8 n& V
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% k' J, a3 E+ E5 c* p0 [8 }: bunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, K( `; H9 Z6 C# _8 ` O0 q2 E( Y/ e6 M7 h* y/ d2 Z) n
( B% v* [3 I+ [+ @8 N0 b6 L) s) o
static bool server_upp_data_recv(Server *server) / H# [1 \3 \3 P }$ i
{6 D& ~/ h/ d8 o+ W- n
if(server->upp_channel_a_recv == false) {
+ d5 }2 i2 V q( } J server_msg_send(server, APP_CMD_LOG, "upp recv: start");) {) Z" n5 U- W5 [
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
& L: u0 ?) e3 H" x) Y" j server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 {, \" u5 @; A$ G3 Z
S' f) v A# m- N0 ^, w. t( [$ O
6 L5 c4 V5 \0 J- p1 x memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% p9 g7 o7 z: U5 {, O, Z) C8 i$ S# [0 `: y& a4 @
server->upp_channel_a_recv = true;//3 B* J: S# a: D( M# }( Q* a- g
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);' w, v9 B- l6 g& T) ]
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;) U& `- D, o( b
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;1 G( e, I9 z! s
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 Q4 \7 f. y# C2 s; v
* r7 l6 w$ x4 M* {) y5 _, S, g
upp_error_count = 0;, p& u/ S+ k$ K% a) d8 W2 J
upp_dmai_int_cut = 0;- I/ x8 B5 W- p1 l2 g$ C& q
8 |9 p! R( Y4 y' O1 Q3 f
// fill in data - I. w8 ?, _, z u, R- S# I
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- v: S& p) i8 Y( U3 G server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# u+ A+ u$ b7 `! y9 i }2 t5 x/ ?" c: X8 }% E5 {0 N
}
8 e9 v8 K8 B( V else{# n. F1 c* M2 e5 v
if (upp_dmai_int_cut > 0){, P) U* v7 x% o9 p" n/ ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ |0 _+ J" z1 _6 s9 E- l
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ t. z0 b6 Z8 C
; f" W1 `) B! K/ o& }
; [# m. Q" w8 y }) U; w //copy data to upp_recv_list_busy
9 m6 q$ e* V1 _/ ?& Q7 t memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 H( m W3 I- ~7 j+ Z* ]
$ [, b. p9 D) r5 F, ~ //7 u3 y+ U5 L8 f5 h& K
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ I; D% p& ~9 c- y3 }5 g; S( M/ E% H' v! o3 ^& b4 R
//7 \/ Y" z% s5 s! o, ~1 h3 f" E
server->upp_channel_a_recv = false;//
1 y+ F; C) b$ W* o/ c# O' |, Z, a0 m+ Z1 B- z
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! }0 ~2 U' k! w: h& f+ _ }4 t) T; {. k5 `3 s" o& |8 ^
}
3 z$ M8 k+ Y; ]# j+ f0 {' y' D% P* C: a: v- t% J
Z3 y3 t. L/ Z* T4 E0 t return true;
# [# ~) B$ U* y! e}
" ?2 l. @ h5 h) o! e6 H. u
( w* t" ~4 c3 z4 i6 M0 bstatic bool server_upp_data_send(Server *server)
' E9 Y6 K+ A" d' _+ Y5 d. X1 x{9 H* y. v* X) R" B& I: P: x
if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 l' S9 Z0 w6 L- \
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' v1 g% \' U# Z. B$ a3 } unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ i' z n! Q$ g& o- Z
char tmp[128] ={0};
- F6 \0 \) e0 x8 U9 I0 l/ p& E5 x2 \" h8 n6 q' Z. j7 H
server_msg_send(server, APP_CMD_LOG, "upp send: start");1 ]' ~! s; T! J f# j& U: s
print_log(server, data, 64);
: X! z$ H. K1 y+ B# m5 H, ^+ _ j+ ~/ F! ?9 s) |0 w2 N5 D6 K: ?" _
//3 b" M2 S, D$ W/ w9 ?/ f# |4 b5 F
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 r# k" n7 P2 J& y0 p
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 e; S7 p# E) {: S print_log(server, upp_buffer_b, 64);
\, b, N, r' N5 B B; E
. w' a% v& |, j server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
! H4 x2 w; C; | server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; + g1 @) Q0 q1 o8 o& F, O
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- Y/ E7 W$ s: ^
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- O7 [$ n% f( O2 E
% H' n6 t; Z8 b memset(tmp, 0, sizeof(tmp));
7 I7 @" J! _; W* ~0 Q( B sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" e2 s% S; ]; }0 P4 O' C4 x sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; ]* B# \# M2 N3 U
server_msg_send(server, APP_CMD_LOG, tmp);9 ?, d0 R& l( ^6 P7 W
# l6 G M0 J% X2 D0 Z: X upp_error_count = 0; s: D g4 H& Y' i: T4 t
upp_dmaq_int_cut = 0;
% v3 z/ Q. k2 m# y" b // fill in data
: A. ^3 A4 }7 F, m+ V4 U uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ d8 y3 \$ I$ ?. v* W% W
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' f4 [& k r O! x' g
" x- Q8 y* w# r$ n( a- M h( G* y // wait send success0 M( |7 F3 G# B" J+ U0 w
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 _' L- m; G$ C9 z
# b/ w1 k9 x" z. _
// make data node in free list
0 T% W- i2 b, o ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 v- B; R5 y3 ?3 E5 ^
server_msg_send(server, APP_CMD_LOG, "upp send: success");$ X- L7 r- M$ L+ b& R7 M z! z
}
" F4 ^7 L T- v! N% v n. H6 L return true;
; ?0 O( _; b/ i, d( \; F}3 a3 a2 Z2 M, o: B- M
% `% }: I r* o/ o
4 M% N6 D9 W2 Q+ n1 {: L6 C
1 l( G& `9 r5 X* P
8 G [7 ], `6 `$ B2 T, a2 V
) K* q! M* V5 w% E7 Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|