|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# B( A8 Y' J5 p2 A2 U* i
/ g8 f; W3 _% m f( }问题描述:. x* \. S$ P+ ?+ o& r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" D8 D' K7 w' @6 T8 u/ V e: Q3 s' Q: r% z' [
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 c" H% i3 Z$ R( K: G1 U! Y
. j: Q4 w0 a/ a
测试结果如下:
; c7 Y) l s7 L138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* O- M. S- V6 o; M- S
, {4 u: f; Y- b S! u# i d, [' S# @# ?
备注:2 u# J' W0 c+ ^$ x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ `( b5 s; B- f
2、相关代码如下:) L- o2 B$ z( j
//UPP DMA缓冲大小512字节4 i4 r0 e* ^, n& V! f0 x: F9 Q
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ }5 H& D$ S. U+ t: g. w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 {( d8 F+ G- s1 t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" M3 T0 ^3 I) ^ q+ g+ U& ]# C) l P+ O$ W- A1 }& y
4 V g u& O/ T1 ?8 C
//upp接收、发送buffer
5 a1 ?- P' V Q#pragma DATA_ALIGN(upp_buffer_a, 8)$ I8 G. H% F5 |* b
#pragma DATA_ALIGN(upp_buffer_b, 8)
1 H& W2 }9 `+ U4 }- f
/ g0 \! D/ _# @2 d( w, p y8 ~+ bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 o4 \9 t5 M0 C4 \+ o) o8 G
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) B, }% I3 x- W) A
, i0 I) v) o* L& i
" B$ L0 b. t% `& z7 g
static bool server_upp_data_recv(Server *server) 9 O3 J3 _5 @6 B$ W5 g. V
{
9 E' S/ U8 q K' g# j if(server->upp_channel_a_recv == false) {
6 j) {4 P a- L3 B! L8 D3 F4 L server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ N3 |1 o+ v* O2 C' s9 m0 ~+ y u8 X
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& x# D" T/ F3 o- R8 [7 }" ?5 {' U7 p6 x
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( O/ Y, X- N. U9 j. z
2 z2 V, G0 T2 Q( }: g! O4 |# _% N6 _ m) V5 h: @' S8 Y* e3 y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* ]# C0 p! H& E3 ?& w9 q( ?4 W, L( | ^, |4 g
server->upp_channel_a_recv = true;//
2 }" d/ M- f# U% I0 I* W c- B server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
# L3 N9 |" h! ]" ~ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;" f9 h4 F5 W' M) K. l
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
1 a+ \1 [+ R/ u t; Q7 m: H server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ F) x$ m* n Z# u: T
9 a0 {& c% \. _3 O. l. l upp_error_count = 0;: n h, K/ T7 i8 d& A
upp_dmai_int_cut = 0;" u1 }: }5 o3 f% p
4 t1 m S4 g& @7 Y- S // fill in data $ `4 R& }2 L! Y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ~' a" ] J }9 }; m7 [8 n* c server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; V Z0 V0 H# h8 F4 j }
* W7 `, S4 S5 W7 y( \, U+ C, C }% I+ u0 p% C# t5 ]
else{
( p6 m! ^# u: Q! L( p) x( i$ E! L if (upp_dmai_int_cut > 0){
4 Y4 T6 Y! l0 f9 Y DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" W2 @+ D Y* M8 Z1 p
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 Q7 N! e h8 W3 h1 \( s# ^( G
& M2 U+ O1 v8 X$ B/ B- X
3 H* ?; C; ]6 g //copy data to upp_recv_list_busy
1 U+ K9 b2 m0 X `1 |9 G# i memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 a& C# x' h! Y* H
& R3 G$ u* y2 N7 f- C [ //# x! X3 _2 c. M! ~: e" P+ v
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 V# V. v2 x2 F0 h% Z
^9 Z# s# `7 t6 A8 G //
5 A( W! i; ?& ^% l+ Z9 B: c server->upp_channel_a_recv = false;//) M: a0 w! P$ L& K+ {5 B4 a
) O0 c( Y) V$ Y9 \2 a1 O9 v, e% L
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
; s: Y& B# _) b$ i }( }0 A2 n4 w9 e; x9 c+ R
}3 n5 J" U. g) Q9 n. p% B+ Q
- g" m* M j* m; J9 _
+ E2 L% F5 ^: j return true;% a; G& @- {' k1 ] _0 `
}8 E* z- t. o5 T z) T9 r
! F c, ^3 p f0 b0 \9 r: G# Gstatic bool server_upp_data_send(Server *server)' X$ ^2 a% }7 J3 F! o* N
{( p7 { I' d( r2 A! S. `+ W/ {
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. |; K" s1 W5 S3 ?6 E! j DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 i" `! Y' ^7 U5 e5 q unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ G1 K! W, b4 \/ A: @
char tmp[128] ={0};
3 t L+ k! O9 h$ O
! O# Y& c# Z$ o! O( \ server_msg_send(server, APP_CMD_LOG, "upp send: start");
- z/ K) y+ L0 F% F9 l) D print_log(server, data, 64);
! q, A, U" X8 {. m* z" v; L; k/ Z2 [6 r6 S& \$ ?# ]
//
$ C2 E% p5 k- h: I! S J memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' y* y& p% z' j: N, E7 T memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 y+ q% h H$ c1 H print_log(server, upp_buffer_b, 64);
4 ^3 y) e$ x" r3 S$ n5 P2 n5 g; ^3 L* _' l1 R- l
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);3 E* R: e$ c7 v' ^7 P' T# Z
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# N' d* u8 X+ q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
: b( ]$ j. t% c6 W4 w server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
/ G' Y8 V2 F" y1 `- [# t1 J6 a5 @0 q7 q6 O& E8 X
memset(tmp, 0, sizeof(tmp));
7 a: Y6 X' X' u+ w- ?" w+ t- ] sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ R" h+ K7 ]* H sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' y% d3 o8 w4 C, T8 v& T
server_msg_send(server, APP_CMD_LOG, tmp);) [' n7 L) g' e. P4 U6 y; z! n8 S
0 ?+ `& t6 I' F6 h upp_error_count = 0;1 A" G3 C$ b/ M7 U: j
upp_dmaq_int_cut = 0;
% U) H$ |9 } |5 q8 `( S2 ~ // fill in data : {3 c0 |( C; }% k# ^! X
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 @- ~3 @+ `$ [9 |8 K$ N- }0 Y% I+ g6 k server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq"); k4 f8 T6 ~$ H
8 w' G/ w3 N2 T
// wait send success
6 k6 Y) x, D& u" ~) F9 }$ W% N while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # _; |/ E' a j' E9 h
+ K4 a; }3 d. q; h // make data node in free list
% C6 }4 ]4 d1 L1 i) B. ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) t. D. x0 U& U* g) ^0 _3 |
server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ Q! n$ F% B3 C5 J" @" G }5 D& I0 K) r1 O) l! J: F* @7 b
return true;
, d; P q/ Y) a+ @% q, F}+ q- R6 F0 y! }# v7 Z
* ], c) h$ Z1 Y- e4 D2 X, o
- j- q H* X6 W* [, T3 m; l% u' }; w3 R
+ B1 | G, v) ~! s; F$ i9 i
1 a/ ~+ W- t, W' \/ | t. W* p
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|