|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 i1 ?( P5 b6 @/ {( A# Q g- ^2 G8 T% O8 T: G: T2 R
问题描述:
+ {7 q, g' r. n6 I) p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: L+ k( J% J/ T' h( z
; I! @+ u/ f: H! a' [: g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 ] F2 d& I& ~
6 Y5 Y' J' B. f( I) q测试结果如下:
7 t3 E2 \/ O3 @% W2 f- h2 L138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. j- q/ g6 y* N0 h5 G
4 `% ?6 H$ @, v' q A; r, j/ _8 d
3 ^. p3 H+ `& x. A备注:7 f) h# P0 Z& s; s# h; o8 p5 [7 ]
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" h' X S, j4 d1 ~/ I2、相关代码如下:- j, i; \# t7 K/ G: n
//UPP DMA缓冲大小512字节
( \: E9 h' n0 X7 ~6 o8 G P2 a3 G4 ?#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" L5 j% G- Y* B/ [8 M6 {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, [ i4 E2 w% N#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 R2 c% r& }& W; J5 m' W3 y6 V0 L
( t7 X4 R4 y9 Q( C% L# X
9 k6 X' G; F" F8 T/ H//upp接收、发送buffer! _* J% i8 V4 k0 q! l% s$ `2 B
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 r8 {' U% o" A, R; w2 R' n( k. a#pragma DATA_ALIGN(upp_buffer_b, 8)7 Z) R! M" T& ?
. M- V3 j% ?/ ]) h5 Y) ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% W- v3 \* V5 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 a% x) C8 }0 A1 \, I
: H# c) i* h5 v4 S7 j2 r8 c% Y# k% R7 Y3 o3 @6 F
static bool server_upp_data_recv(Server *server)
& x: t, q1 {7 L$ F7 \3 W{
* c e; P' M7 ~2 R' q( F( y d if(server->upp_channel_a_recv == false) {
& Z( i$ I6 h) N server_msg_send(server, APP_CMD_LOG, "upp recv: start");! z- m7 M6 b, F4 y) h
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
; P8 `2 m" G; n0 f server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( a, S% A# Q! d4 b/ z7 U
& h) X* o7 f& Z4 e8 s9 w2 `4 P4 q) Z+ v- `5 R3 w6 I( p
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 t# s- F8 i, w/ N/ S7 s5 x+ ]
" x- g1 X5 b+ H5 q& L- v- `1 g server->upp_channel_a_recv = true;//. Q$ b" M* w0 h8 f- n: X
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
; n: U! Q# K. ~8 E0 u server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* k8 |! P" V. [6 I
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
0 r$ I% l/ V# o. Y0 C0 c3 F" l server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; I& H9 }. ]& ~2 @0 m$ n! z3 a
6 `: ?0 S( A1 p0 p9 j% M& j upp_error_count = 0;4 W! S1 U- I$ W2 z
upp_dmai_int_cut = 0;
) S- C# E5 n* H9 q/ O0 Z& \2 V9 c$ E" o5 w- {
// fill in data + X% `- ^% y3 Z$ ]$ q% q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);% M) {% N; k& x s. T$ C+ M
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 H0 T/ \: Y- l, w2 a& ^& {8 { }, N7 A6 _" [; }' s4 I3 w% I! {
}
& `+ e* r+ L {8 j1 H) q% E else{
% O& L# @/ H, R1 Z$ F if (upp_dmai_int_cut > 0){' j, }6 @: u! t) l9 j. q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 e0 a+ E, P% z i3 y4 M7 i Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 p! ^# b) h7 F7 v, a7 q# Z' u
. L# H1 Y# {3 k a3 p0 h
4 B: w$ Y& \ m5 \' }- e/ E# q //copy data to upp_recv_list_busy* @- d( a' {" ^3 j
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 u3 ^ I! K6 {/ e/ |/ q" W& ] M8 D
: D; K+ }$ s+ y //# m N7 S7 a: y& Q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node); u5 S0 O0 t1 n
5 E7 Q8 n- O7 p! y //
( n/ w0 v: T' `/ a+ w; Q server->upp_channel_a_recv = false;//* b! j1 H5 `( D e, a8 z
* ]! P( s6 F0 X) } T; a
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 ]1 O* v q4 ^# ?7 O }
* _3 x. c9 i+ c l7 E+ E. ^2 g3 F }' ?: l; i$ d$ R. H7 D
T2 y9 W# h; Y3 P. r
4 y8 u' ^) |2 p7 n1 E) ~% O1 @ return true;
5 g- d8 X' {3 f; Y2 a" L" }}0 P) i) |" a$ o
: ]8 {$ B: R4 d7 n+ V. I! E9 Rstatic bool server_upp_data_send(Server *server)
/ m8 a! M+ M; H" K0 p* Z! z6 d{( {2 w5 w9 P/ P# X2 K. c1 C P* |
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ I( ]* Z& j) V# Y0 u) J$ Y, v+ a DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% E+ J7 c* f9 { unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ `0 L# R. d6 K1 a char tmp[128] ={0};
6 j: @- b8 g# K; {9 l2 D( L, w: d) W# |: D8 Y8 n
server_msg_send(server, APP_CMD_LOG, "upp send: start");0 n' A0 C% u8 `3 ~" Z
print_log(server, data, 64); E \6 b0 d, v" T, R; O7 w% `
% R7 g" O0 b( |
//
7 b8 _& j9 z0 e) j4 l. q memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; G8 m7 p: i8 H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% B% o' K% G4 K- b6 J print_log(server, upp_buffer_b, 64);" W; L& }# @* y$ ]' B8 ~& Q
# j) f* G5 p- E
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b); J- w$ V0 {& p9 w( g
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& O! J/ U y# E5 p server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 Z2 E0 f0 u, e8 V0 M5 z6 @ server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* `' H( b/ x8 g b
0 l6 Z* I& W: W) v/ w, \4 s% N memset(tmp, 0, sizeof(tmp));/ M% L+ V5 r. R2 L) e8 H+ a
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 n2 |8 P, t- V( T0 h5 V) l! m) W K8 M
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% S, y) p, @; W: C3 T
server_msg_send(server, APP_CMD_LOG, tmp);
( v4 B7 f M% j3 u8 j, K2 _5 [8 e3 T0 }# E. S' }
upp_error_count = 0;
. J. b# z' @& I( | |( ~- U' _ upp_dmaq_int_cut = 0;
0 k7 c/ K+ Z$ f/ b // fill in data
6 ?7 H9 ]' V4 ~0 S* Z uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! H3 V% E: p( L* ^4 D+ V5 ?! z
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# g$ ?4 n5 F' c2 Z; j, K2 c% m" y6 c! u% V5 S" h8 ]7 r/ Z/ [/ S
// wait send success5 i1 X5 L$ W( R% w+ o) x0 s# h" y
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* P5 E% X! F* s' j- o- x6 |& h9 t: ]6 _) d9 k
// make data node in free list - F( l7 o* F' ]: b$ U: l
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 _. ~! l0 S8 I1 F8 S6 i( b' U, t
server_msg_send(server, APP_CMD_LOG, "upp send: success");
, t: T2 J* W( q2 q4 W }
6 O* P8 N+ ^6 n return true;2 x, y- r: M- `% R* t ?! G5 f
}
9 R* K r% Q" o7 e" c8 b4 r) V4 V; Q1 {
! |3 U% t0 r4 L) \8 B8 e+ B' A
5 W7 N; q$ [' D6 U+ z- V9 X& G. K7 u6 S; \" g
; B/ a$ J& D7 d S1 W" G6 K |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|