|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 Q5 H2 ]/ G$ Z2 z: j; B6 s
$ ~; n- ?' [. \
问题描述:8 o5 F1 X' {% {" s6 u2 j9 T6 D- R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 K$ ~; K3 Z1 e6 H* g$ b5 F9 F0 `1 H! \- {9 m
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 z7 k( M0 a5 \ E+ ]
; P P8 L q( s2 u测试结果如下:
, ~4 f( v) U& |' k* c# P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 h) @8 q& ~; V# p: L1 [. ~
6 p, ]. k. { ~
0 v; m9 h( E% s) Q备注:4 Y* B# K6 l: o: o3 {: r5 }
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- I# N) D; {, O" Q8 n2 P2、相关代码如下:% K( F+ [3 f1 Q1 z0 _: O2 ]
//UPP DMA缓冲大小512字节
1 O$ R% A. @1 @3 @) }#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# O& n# e6 T# q5 w, P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ X3 u2 M3 c5 f( e; D5 p0 ~$ e' s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 E/ }$ ]8 m+ e+ \/ }/ N; @( h% T* J9 Q# Q* e4 d: ~$ K
1 [4 w( q; y" Q2 _6 X! @
//upp接收、发送buffer
1 X- k: _8 `; s#pragma DATA_ALIGN(upp_buffer_a, 8)/ X4 o3 `, c, M) G! b- H! `3 m
#pragma DATA_ALIGN(upp_buffer_b, 8)
5 l( N( D! z* b
5 E# F0 B' K9 v- e8 lunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 T8 g2 X2 v2 qunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: T& g0 h2 Y' }* A7 H
# ]8 Z c+ O( Z' p7 T, U: t6 u. I& |0 V; }* _
static bool server_upp_data_recv(Server *server) + c8 q9 P5 n+ ^3 K
{
; ?1 `5 b( K0 i' ? if(server->upp_channel_a_recv == false) {
& h& f# a) J6 U$ e" x) K0 L server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 ]0 I& P3 n# a# T
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% ~6 w; O+ i8 T server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; l" T# p& c2 I
( S( \9 {; W5 i3 o( w" |) v- x+ x3 h7 e# }$ T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 c! M3 n1 A. n& o/ F! G! E
4 G% U+ C% i9 q4 c server->upp_channel_a_recv = true;//
$ O! D4 q- c+ e. l% U7 [/ N+ _ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 ]1 L3 o: L$ {4 j% o* P& _
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
* [& p# s \% K! i0 S. n, [5 X server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 y5 N# E8 z: \- D7 W$ y) o server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 U, n# {. L. B0 M
1 X1 Q/ v2 | c6 { upp_error_count = 0;
+ ~3 _6 f. r9 \& c8 n. G, E7 { upp_dmai_int_cut = 0;! W" ^7 E* h9 l" j: L( E/ [
7 M; R( j% R/ \3 q) ^; @
// fill in data $ z1 k* Y% K, P) A6 u
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" `1 I- j0 n y3 D
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 Q! t. d6 ]4 ]8 Z
}8 l$ |5 o# z3 M8 W" |# d
}
) X, w* z6 U0 D/ m else{. W7 b* K0 E4 a3 H0 |; x! A
if (upp_dmai_int_cut > 0){
: w, C, D' ?. r& O8 `! g DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 N. V& B' g& s& y) d/ F" g) D Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 ], K6 v8 I0 V) t9 d0 m9 j* U* L3 a' Q8 V. a
8 i& T' g/ J. @: u' `- r3 q //copy data to upp_recv_list_busy- Z8 l, z6 R& W4 L x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) U( |! @# T0 {" G8 k) T4 g1 Q8 U! M9 f ~
1 D6 G) o0 D. Z9 G1 r
//" E* D7 _$ W7 |$ }
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' N/ J2 M' q S! d/ t
8 ?* W" L4 l8 ~4 \ V# F //& H+ l5 P; w% i
server->upp_channel_a_recv = false;//
+ a. h. y- }2 V2 U7 a+ B+ J0 r7 U2 n- R
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 E: k$ x8 s' c0 K+ e }
5 B) f4 u- C4 ^4 ^0 H, Q- m }
$ @" i* X$ _$ y; r7 }' {
1 n" x% G+ X- | n! y1 R9 b0 f; W. L. L+ l# g! d
return true;* x! L* b6 z: k$ N
}
/ q/ x. O4 t* l6 i' x
3 I7 r. a7 t K8 N# C) gstatic bool server_upp_data_send(Server *server)
9 s m8 y. R0 }{
P" H6 [# [, ~% _( a! z* q if(ListMP_empty(server->upp_send_list_busy) == FALSE){( u8 V- K8 l6 R0 u- K& h8 ^
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# l6 N# z N' k' v+ W
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 x; o H1 a! x9 P char tmp[128] ={0};
! s2 v0 K4 c; E4 h R5 c
1 _" d, Y0 _$ d server_msg_send(server, APP_CMD_LOG, "upp send: start");- |4 V8 m+ Q. `9 W1 y
print_log(server, data, 64);- M6 @8 f7 ^7 |; ~ E3 |
" j% D* L9 n$ H) a- @
//
& M* Q- p8 G$ F$ `# i$ L0 w) d/ p3 R memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! ]9 H5 A# m! O! W5 h: t. R7 E
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);% z( i" B- \9 t% N) y+ z+ a( j
print_log(server, upp_buffer_b, 64);$ X$ C2 m/ S2 |+ L. b' o- J
, K5 w; G7 @$ S+ x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);7 `. R% h( i2 G% {" r% B) b6 Z7 n7 [
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
% U* J. S9 W: J5 L5 \7 C server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
1 ]/ }* V* ~+ d3 Q) Q server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& K7 `- g. L) t5 ^; `" n f/ y( y; }2 f' f% E5 u( v- F
memset(tmp, 0, sizeof(tmp));/ k+ m4 C0 p( F- [) D$ l& `
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 A ]/ b' P, r5 J+ b
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& t4 J& @/ |4 U2 k0 l( x* D server_msg_send(server, APP_CMD_LOG, tmp);
/ }+ V& I' B: [* W2 l! @+ p& p" z1 L* ?8 y
upp_error_count = 0;9 u8 K' y" [) v1 v/ I
upp_dmaq_int_cut = 0;
4 Q# U' b5 r" q. K9 ` // fill in data
2 K. d/ _$ @( Z5 q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * Z- W( ]0 B3 ~# s6 {
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, C" T) S5 ?9 U) d$ X5 U' j' c) w" f
// wait send success7 B) h! y! d( M
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ w2 _' q& [% c/ Q+ f' D- Y$ A! r' x4 j
// make data node in free list 4 x: z0 i% q2 n+ h# G1 v/ h' U- K
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" H* c+ y- k1 q
server_msg_send(server, APP_CMD_LOG, "upp send: success");
; y2 V9 R. [$ u2 R+ y. } }9 x& j2 }/ ?6 i0 k% F( z# |- {
return true;
( x- f" F. Q/ ^2 B4 r}
m6 o/ L3 s) D8 V% e3 o! S8 O7 _9 D0 V6 i5 V; w8 i/ z
3 D9 i6 W- M. v$ h1 X% i! t
& @# D. n5 g3 B8 R- m( @6 m. r7 y$ \) r8 e+ Z
' r" Z5 P& k7 L+ X/ P- ^
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|