|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
: U( G+ _3 v* f8 y9 i$ @/ c& b- ?$ D
3 S! k |, d6 }* G问题描述:
) Y. G2 i `: a n: e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ E! U4 f# z& T0 B: v/ S; v9 u4 i$ k9 I6 p0 m5 o% L9 J) \
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 y: h1 D2 l' V% @
* ^) X# K; V' {! w/ ?测试结果如下: B7 A/ x3 e. c$ |* a5 u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
' Q- m5 R ?& J; L7 t/ s; C) E, U' ~- g; ~
& s% T6 `* f5 M9 z0 W1 x+ ^
备注:
, G; l' s6 U5 E0 @% _' U1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) S/ n( a2 y. n7 O& @ T' F
2、相关代码如下:* W, L8 L. \; }& z% \
//UPP DMA缓冲大小512字节8 V3 W% z7 p# l7 {1 ?$ X
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ W0 T# i; D8 U- m% x8 p9 {6 S#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 Z. @5 m$ X1 _/ w; ?, F0 W1 J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( b7 v. \0 b9 {1 t/ m: b
1 \7 S* ?2 v" E) P6 `3 X; D" E! D) \' u% L0 F
//upp接收、发送buffer0 }' G$ l& G4 W. J( k+ b5 ]! Q4 o
#pragma DATA_ALIGN(upp_buffer_a, 8)
6 ^0 K- B# q# I6 e. C#pragma DATA_ALIGN(upp_buffer_b, 8)* V# a, U. S, \* T
4 q# ^5 j( W( a4 Y! Punsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ |/ @2 c0 b, ^5 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ X1 w- I" Y q+ D9 j% o: [. e. O) f
0 k! ~* G: d/ M' k& {
# G0 U5 [* d& e" F. @- B! Gstatic bool server_upp_data_recv(Server *server) ! |1 W. B+ j: n, [1 n
{" L( x: {+ y7 [2 K+ n
if(server->upp_channel_a_recv == false) {/ f4 X8 e2 j# i |
server_msg_send(server, APP_CMD_LOG, "upp recv: start");* F8 u& |- `- _+ S I. i+ F4 Q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
u. @1 R# f! d$ B server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 \4 m5 u8 f }
) I2 @; o; e5 N
2 x/ ]& ^% a: L; A! Z8 G9 Y memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% h, X4 r8 b; g3 z* q6 @- s+ \) E5 D
. a1 |: { C, [
server->upp_channel_a_recv = true;//
+ d! e) T! j+ N! u3 G server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);6 U$ T5 E% l l( e$ p
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
& p9 o {3 g7 T0 z9 U) O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
, O/ @" D9 ^0 q3 U2 r1 b server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 Y4 j: v) S9 X* l2 a8 S! O7 w6 M' t* q
upp_error_count = 0;
% \ Q D: c" X V9 x1 z! }8 A upp_dmai_int_cut = 0;# i: i# e& ~+ y c% ?* A" t
r0 I& n. V* n; g+ p7 e& V4 d // fill in data * n- t' b3 F$ Y% C
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 \( o1 J0 m0 m( P
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ q0 o% M8 U; M; q. v3 t* Q' j% ~) f
}" }. Z/ Q- p" U2 m8 |
}
4 _/ W; R( k# Z( b# P- p% o- _ \ else{7 Q, [# W% c$ |4 o! W9 h! W
if (upp_dmai_int_cut > 0){
6 _) [* k0 z) e( @* F) V9 Z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 j* T. L; q+ c- g
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 s# W. F* e) q; ` L# v
C) @% I, B: }8 c2 n+ X/ k& ~: z
//copy data to upp_recv_list_busy, G0 C! f% N! d8 K v1 Y
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ k! ^) E% K5 w6 I. B
7 B% U |# Y+ W8 R. r" a //* R; A3 K0 R c! e- W- G0 y
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- ?4 z, V8 T j8 M
) {( d4 v6 `' y1 w+ H //
9 s+ A$ q. j$ a3 ~! P server->upp_channel_a_recv = false;//3 {& j" O8 ~. B1 i
8 P0 ]0 d7 {. l. {7 C
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# J) H2 _" e5 c5 w) J }
3 T9 J7 _4 ~$ l+ @ }% k4 y& Q7 d K1 l
: u% w0 }3 `) H" X/ B6 R5 r% i
. U9 N5 o8 j' P% v- } return true;& |5 I6 i1 |' |$ ~
}
) t& V7 G# P- e9 n, T$ Y8 C4 U; H6 w2 @3 O: D7 L2 ]2 W }
static bool server_upp_data_send(Server *server)
- h8 y8 T5 w/ F{0 u l; i* u Y7 _, u4 l
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% D/ n8 y" h7 B* A# X2 P/ _ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! j- G0 A4 h. \7 z! M
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; }6 N- ^4 U- Q! ?0 s char tmp[128] ={0};. {' f5 P6 Q# T/ L- K! ]+ e* C3 ?
* B3 B$ @) M- z+ b( g& `8 h
server_msg_send(server, APP_CMD_LOG, "upp send: start");
6 n0 A% `3 R' h print_log(server, data, 64);) l# p% g/ p6 S3 b
' I4 X" i2 e5 V" ^+ E( O+ i
//" o' l3 o/ Q; Z: ^/ x
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" [; U' \* }3 k! Z9 i
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' U9 b! [3 Z- x6 h X* M6 C6 _1 H print_log(server, upp_buffer_b, 64);
, s3 d9 |9 M) |4 a- O
( V! u; k. c+ n! N6 Y) ` server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);# k, {' N# n3 C2 G9 }' z" e
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; * ~7 X. |* M! }6 q+ N2 f+ q& x; b) }
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
9 K, F; h7 a2 f0 v7 j$ J server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# D% Q+ P. \4 U3 i; p
6 I1 `) ?* L% C- g" w
memset(tmp, 0, sizeof(tmp));! f2 v( [4 e% R
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 f9 W0 W0 f! x4 ^; G$ j9 { sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 h1 ?7 z. ]7 u) z8 A server_msg_send(server, APP_CMD_LOG, tmp);1 m% ]( ]1 q3 i8 _/ F& i
2 m% A3 M0 `0 M' i* p. K( c" z; M: D/ S upp_error_count = 0;5 t% }% }4 P7 D( u
upp_dmaq_int_cut = 0;- n' h. Y% X8 f9 h' X# o& T/ V X
// fill in data
. u$ a9 ]8 [( F uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 v' T3 s6 p& |2 S
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& o$ a C7 C9 _
' [$ K) H4 i. q. ~) D! S( t1 x
// wait send success
/ c& `4 _: y4 a! c while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* H# m. u3 ]7 c. t) I! q
' z) l9 J) n6 M8 i, ] // make data node in free list . a9 b. U. l9 \5 n0 b" T7 l
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( d& ^/ ?& x$ ]9 R% `; L
server_msg_send(server, APP_CMD_LOG, "upp send: success");; X% n9 `! \% Y6 P6 Z
}& `& U" I- z8 _* t2 }/ O) x
return true;
7 C6 r' k5 }$ k y; V4 s9 o}1 Z* a4 C" X7 K3 ^1 H5 s# I
$ f% T# k, v. s2 b$ ^2 h% C
6 ]( m1 E0 H; D* g" [' M- O
( E- N$ U0 h9 _2 e+ x" A9 u; j
: s/ V. W8 K( w5 P
( o5 a& E! J0 }6 v7 y4 X% C8 v |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|