|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& h: a- b4 @& q: M
) C) j8 I! e' Z$ [1 [9 k9 P问题描述:! s+ z1 R4 S6 }( }# F
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* o3 {6 i$ W7 G& u+ K/ c# T; E
, z, i$ y. B- K; H% d. @
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 O O8 Q; ]& h% r/ Z( {" h& v% R' G
% @6 k, i# x( e6 V) _- V w" u- O$ e9 O测试结果如下:
5 s& k) I/ y9 i) I) F9 i138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 S1 c7 C( ~. b4 O. b0 E. T* R0 K$ W: @. I% c
V. n% [' p$ D备注:2 O, [. x! b7 Y7 V2 d( E! u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% d1 \: g9 T; F% I C1 L! j1 i) n2 D
2、相关代码如下:: R9 j" ]* e8 K5 h
//UPP DMA缓冲大小512字节* W; r) b5 \- ]$ |( }
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ w* a; m2 C6 ]. e+ R3 M) P) d
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 m9 s$ u, n+ g# P [) g5 T' {#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! d0 `- x. P* V' W
6 t; z g( C. ~5 W8 j" i) `+ Y: I X" B# w
//upp接收、发送buffer& S3 ]* J8 B! C; ?
#pragma DATA_ALIGN(upp_buffer_a, 8); y6 k3 [5 c: Z9 a& \' p
#pragma DATA_ALIGN(upp_buffer_b, 8)
4 t% R6 {& }/ x; v* d) q6 M: m. J/ `6 [0 U/ q& `2 f7 O+ ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# p4 o* ?0 [& _7 m6 c! V( [unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];2 W# c- F8 f; T
9 n- Y. ]0 Y& X* E! Y# b
2 p* A$ H% \$ }* u8 G) K
static bool server_upp_data_recv(Server *server) 9 G$ N% z- j+ Y+ t' Q0 z
{7 g; j) }0 a% X+ h
if(server->upp_channel_a_recv == false) {- y2 k l3 j- d& [4 ]
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) H! v+ x. H9 t; F. w if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 z/ w- n) ^- j' C1 q% C3 e server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 C8 O" {2 S4 V9 j; ~" g9 [, y7 p7 T+ |0 s& K, D$ s( C8 Y& B
5 X! b0 F2 T# ^- i" Z8 f% O memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- }* s( l% f' n4 z' e
" y$ b; X+ f/ J ?+ \5 r1 H server->upp_channel_a_recv = true;//% [) M2 y( U0 c5 W3 m
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
& f9 u) }" a" s( |6 T' u$ P server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: w: ]7 w# E/ Q' E
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
2 U# F* ~2 _" Y server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: z& K3 {! t; k9 D$ y
0 m; q) H% ]6 k" q; I" R4 w upp_error_count = 0;: c. W! w( @4 Z$ U$ I
upp_dmai_int_cut = 0;) ~4 ?& W4 U D2 Z$ W5 t
$ b1 `# [* Q! W" z" G: D8 v
// fill in data / s2 C" }' `( c Q2 C1 u# w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& }+ F" L @' [: t/ n. ? server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: A: o; P" `' |; v7 y0 _6 l
}
8 W! @4 c: t3 c+ Q; R2 @ }
# `4 W+ H! A& W9 H1 y9 X' Q& f else{
( J. s2 M: |7 C8 F: v5 Q if (upp_dmai_int_cut > 0){2 s1 a1 k( N" E5 l' D2 ~
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 R" K" z1 ]; r& \8 a$ z
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ F b2 E6 ^' Z8 i( X7 k; o% w# I6 U4 E2 g7 q# Y7 j
3 _9 s! O7 v; I. B //copy data to upp_recv_list_busy+ E2 w! O( b6 T+ u% ?
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# ?; n9 {1 }1 `. }
5 V0 Y( E* S# y //
% z" ] m: g. S4 n# R' } s ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 ^3 A" }4 F+ A) E4 o$ ~* x) Y
( }* S/ ~' R5 l# u1 x8 E //
% A; t A: u. n! U2 J6 P9 r server->upp_channel_a_recv = false;//
8 B# ]" a0 x8 R0 `+ }- c/ I3 H! Y; B& b: w/ r
server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 l+ o$ |" @8 A3 @. }( `9 [
}
; [6 w& N8 ]% v: n q* o0 E5 u! T1 u }
$ c3 n9 T* V- J% k' B
* K2 p1 C c) l W3 f$ }! X
0 o' o) c6 r/ W* ]) {8 e, N return true;
8 F2 w# I% i5 \* r}2 @& n& I. ]/ t
2 h! ~- v9 f8 [2 y9 w! v5 xstatic bool server_upp_data_send(Server *server)
" i9 }8 [5 S9 @& Q' [: T: f) V{! t& L( R4 m! H6 ?* {/ t# j2 V
if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 x+ f/ @% _& i' i" I8 H5 B/ v
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% S( k4 \9 Z) y' f. E8 n
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# H* N( D: x+ t" W
char tmp[128] ={0};
2 r0 I8 P1 O. |9 m6 j N/ x' u+ p! `$ H/ u
server_msg_send(server, APP_CMD_LOG, "upp send: start");
/ _3 N! o0 k; z4 ]4 p print_log(server, data, 64);
/ ~* R- j# J3 Z/ o4 v3 l/ o+ b" A! e$ C
//- T) _2 F- W T: B3 v7 o; M
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ v& H0 G8 s$ b B' j
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 J" F g" k. u4 i
print_log(server, upp_buffer_b, 64);
0 f/ } B4 ]/ H. I/ P7 ^
5 w2 f( y+ |* I1 ~6 n server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
. x6 l% ~ u% B) U# Q7 E2 a _ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ]2 q. I3 _( e4 a% u5 z& `
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
" z. _: k! s& o1 r' c+ t' u& g5 V8 j server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
( q2 Z5 \! j" g; ~
5 _2 e m& H: S3 ?5 g' a memset(tmp, 0, sizeof(tmp));) {" V h- L( S, Z; C
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 Z& m9 M+ v( M A$ V$ F3 A
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ ~0 ]! @( y ~2 }
server_msg_send(server, APP_CMD_LOG, tmp);* I; b/ T+ e2 j& d1 G0 c$ Z
. C" L8 ]6 a; i2 a$ r A H' b upp_error_count = 0;) F0 p- t f& g' b* d9 A9 C4 V
upp_dmaq_int_cut = 0;
2 _4 h8 \ v" I& y: A8 X // fill in data 4 `) U, i- r; d Y! m
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" a! u( r9 q' {0 q1 x$ N( F. J9 Q1 I server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ N$ r' T6 s7 Q1 F. c: [" t& m L+ l
// wait send success, W9 Z) s, b% @3 U7 m3 n
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 _+ A/ f# N: u% f# |% F
4 P3 X% E5 M. Z; S, T
// make data node in free list : A& I0 }7 k C* p3 l2 g9 W5 h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);! _5 b+ Z" _! B. {" P, p2 q
server_msg_send(server, APP_CMD_LOG, "upp send: success");
' V$ z& e2 H1 X& K }
0 b' N9 y# E$ R; h7 m, ~0 ?; n6 J8 r return true;
' w7 t8 w {! c& x}
% v% O" R7 F, i2 X( m8 t9 \7 P1 d; W3 ~9 K( e0 Z) E
, ?& ^# u2 p& ? w# l2 p
8 x2 m# ]9 w6 U- }. [
( E+ `* p7 ? P& D$ Q
/ i# c- ?3 E f9 h6 [! ^1 ~2 ~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|