|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 S& y% e6 [+ Z2 m. i) [ E7 T: Q' l
问题描述:. a7 ^4 @0 F% x
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: h5 H" O$ K3 p" X6 l
3 G# s2 X8 d7 _- _3 u2 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 e! n# l% [ f. }# G' ^4 N$ z- ]- B. u1 D
测试结果如下:# q# q2 K: \- t
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 T& O) X% a" p1 k+ v z* n
/ K+ ^7 `/ W" S$ Y9 I+ v& G
8 U) s3 i3 M @% Y. B
备注:% M& a! _$ H. z" B, d k3 b8 ^
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ M9 t0 \) s. \; N5 Y$ x2、相关代码如下:0 e; q" t0 P z: ~" O
//UPP DMA缓冲大小512字节+ U1 E; K' o5 w7 v0 u8 x8 c8 f: B
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. {4 O( H/ K0 |' Z5 p' b3 j#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 O4 b! a9 @8 s$ H$ M+ y* D2 o#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 L4 b4 \1 g! G7 k& J6 M
# f1 W- m% {- f% V
% u% v' d$ }$ D& K; E: i" U- e
//upp接收、发送buffer
3 U1 S) \( E6 q$ H1 o( _#pragma DATA_ALIGN(upp_buffer_a, 8)0 U4 j- W( Q+ |5 t) S/ o
#pragma DATA_ALIGN(upp_buffer_b, 8)" ]& |+ W8 ^- r- [* ~ v: _. |
+ {/ ^5 U, G7 ?! B' g% y3 Z; x/ ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];: K. v+ A2 [9 F d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 v3 M1 { a$ a8 @7 f3 F
3 [- [- r2 Q) w2 Y* @. a, F7 ^2 t! M* i, j- [. N
static bool server_upp_data_recv(Server *server) 5 ~8 F; E4 c7 f1 O# q" M
{8 t: e6 k; e9 X
if(server->upp_channel_a_recv == false) {
6 ~- Y" b; {2 o server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ J/ C! W9 Y1 l( f3 Z# q
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. P& p0 K, \0 G5 ]" g. ~" U8 K. [ server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
- ^- t0 q/ |( x7 d; \
2 t) Z# S8 d3 z4 w6 H% E3 [) G) m% c5 s. X) q- Y
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ C8 E: R: _% E* G* k, \2 e6 u) y4 X
6 j6 }+ N5 P! \" Z! L3 S$ h* C
server->upp_channel_a_recv = true;//
- c+ m* Y( G9 t server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);, I6 [/ v: c3 B1 i
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;: D0 p9 E# h) H$ o
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 r; D2 m2 w, w2 Y. }6 Y7 b server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 S+ \ @+ O) H/ f r4 b
' ~4 v5 z* E6 O* J( [7 s
upp_error_count = 0;
, k' d: N9 ]& H: i upp_dmai_int_cut = 0;# f) _4 @& Y% v
1 e k: d; q) O) G6 s3 m // fill in data
& l8 \" p! S% ?9 w- g+ h uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);$ v/ y4 W T' ^7 W3 i) L
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");% ?- c* D7 n" |' s( j
}+ g0 p+ a' A8 \2 h1 S# w# [8 r2 {$ h
}
, E8 a6 J3 s: y' t% x, E else{; ~ d3 Q k$ x$ `* y
if (upp_dmai_int_cut > 0){6 _4 w; [/ b5 \7 E. Z" k" a+ u5 R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- [' y. w; Z! m* X3 h" g) O Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 Q, W% f1 D7 s7 ^* ?
2 G- I0 R7 L1 @* V5 z9 D! j& d7 U! M1 v
//copy data to upp_recv_list_busy
, k. H. v7 a0 m& _ K7 S memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 d; k; O7 F0 K- {+ z& m4 a; H' Y* e
; W9 X& v* L& C; h/ w
//
$ S* l; {' g, O" i. x8 j ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 O& ]2 g4 `$ d4 y, v
6 c9 }6 [# Z8 o; c( l, R8 R //( ?1 w7 X1 h% A, ~3 j6 m
server->upp_channel_a_recv = false;//
1 U* [& G/ E/ ?- y
$ p$ C) X% g. i1 a. z server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' x2 U9 w, c$ p l& C }% ]2 G# o! r; J2 `- |8 K
}
3 I) v! f2 }' k4 D( J. F M% z- U" h8 E* P+ M: D- U% C3 {
% I/ v, N0 o- T; G( a return true;
t$ g v" Y4 m" Q2 {0 a}6 I4 g! ?% F( s+ y6 p* |" r
( J4 d2 G; C! W1 _6 q+ }
static bool server_upp_data_send(Server *server)
, B% E' k7 P6 ^; j' ^{
) b) ^; U; k; J7 e: u$ d8 | if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 A: N9 Q% O' | DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ v, U' k" J( d0 |
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 m+ ^, C2 c# U1 `/ n' @ char tmp[128] ={0};
L/ u( D1 ]( y$ r! w7 {8 W d" v) s; ?. ~% j
server_msg_send(server, APP_CMD_LOG, "upp send: start");
# t @2 A0 w. Z8 f print_log(server, data, 64);- \8 {2 I0 c/ v8 t4 V& ]
( n) `, h9 [% O4 t
//. k1 Z7 H4 | w) G" n5 J6 y( @3 F- g
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, {0 _5 q1 n) g4 i6 h
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) O7 a( b" M$ a. |! d P0 Z print_log(server, upp_buffer_b, 64);
1 U/ l5 p) x, r6 U( P* M, F
# m& u5 M- H9 `% y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* x: W" S% {( J- G
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' z9 r$ K! Z* x5 Z$ A
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
% }0 V/ e& f" c+ b' d$ ?7 D server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
c/ u3 o( `4 C- L0 a
; F3 M( w8 z6 B" c% }- a memset(tmp, 0, sizeof(tmp));
5 l$ G S2 O+ M+ z/ C# n; B5 B sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& h- Q6 [" @; _0 j. J: W6 u sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' Z" K- m3 S1 v, n server_msg_send(server, APP_CMD_LOG, tmp);1 c( c5 w2 P6 b
0 D- G; h0 k( g$ s* H
upp_error_count = 0;
) n$ }! M: H3 q; ~ T" g4 _) | upp_dmaq_int_cut = 0;8 p4 l9 n' o2 _% q! n1 e0 r$ F
// fill in data : D4 F: n4 x9 k7 g; P# R$ A
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 C1 t: e' s5 x1 [8 I z; n0 k1 v) h server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ l% Y+ ?( L; f' p1 \, W; d, R
0 F* G# X0 r) u+ z$ f( z // wait send success
: P, w% n7 q* B5 ~ while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
7 k0 D M: T) ]( `. X" c; `4 o4 @$ q! @
// make data node in free list
: H4 `. Y5 V/ N1 J' a ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; B7 c! i0 C4 O0 z0 K' T% ^3 ~5 [2 r0 J# j
server_msg_send(server, APP_CMD_LOG, "upp send: success");% F) D% W( H* _! Y
}
5 ~9 x" _! \6 z% v4 ?# n" Q1 Q return true;4 N+ ^; A6 Z" U' H2 t5 h6 _& [3 [
}5 q" V2 M% q' {# _! I
/ t. L2 y5 z2 N7 ^" `( |0 W( w# o
" W C& w- k4 }- m
- h5 x3 _5 ^2 S! a! F% V
% w& i# x; @; v1 P9 F5 j5 ^8 G9 |4 J9 P# T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|