|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
. ^" @* x* l% H7 `; C' M' O6 i, }! v) _: P
问题描述:
- ~" T2 r( i$ W7 f在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% |( A W8 Q) W; C3 _4 Q3 M6 \, G: r0 d# x
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" e0 `: v [ {2 I+ B
9 B6 q7 r& K3 x7 W测试结果如下:* L+ s( Q# [- ]/ e7 D
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# @7 O- C+ y9 X( g7 y
9 h# v; H D$ C) _7 ]0 ]' w: y/ N1 n m$ ~7 D/ I: k. M: R' b1 `! p
备注:
4 C9 h% l$ Q9 w& h$ X J" ?* v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 D, A3 L1 k' [9 q, K6 z2、相关代码如下:
, {1 r9 N% ]3 V$ D9 r2 V. I//UPP DMA缓冲大小512字节
0 M+ p6 B, [3 j" Z#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ I: ~% u! U% T( D4 o6 b! |5 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 R: [( f2 Y7 S: U* m, Z9 z. ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' b9 d3 H- H7 @
\- v _5 d" j
, B6 M9 A' [2 n4 b//upp接收、发送buffer7 B: L% }; O0 A$ w3 C& b
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 }4 u5 r% H; n) c& M0 M8 o#pragma DATA_ALIGN(upp_buffer_b, 8)' q9 ~- O1 _: r8 J5 _
- c: j& c0 X( ~1 l0 F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ k5 j5 ~ o, N: P3 I2 N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- f& [+ e1 P$ B% h) g d8 E
! E# \- P* L' c9 W/ Z9 b& q0 e
1 E& p4 K# E2 s# C @static bool server_upp_data_recv(Server *server) 7 T0 v" p( X% B7 R& v2 g; h
{* h& |* c: Z" S, k$ S% ]
if(server->upp_channel_a_recv == false) {
' x8 A7 u" Z' q6 q4 f server_msg_send(server, APP_CMD_LOG, "upp recv: start");
! z" O+ ]" K* g8 e/ ?9 ` if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ d& A3 A3 ]% E, J( ^# r$ ^- z
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, M! \: E* F/ ]+ I+ ~" c0 i
& {: |& G8 B G1 Q+ M# [
' o- r5 q& n* x) G- f$ W. \8 ? memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);& a9 A3 o. h' o; z2 _
; o4 u/ `6 I2 t/ L+ s7 \1 k
server->upp_channel_a_recv = true;//6 ]* l3 H$ ]0 Z0 i
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);9 p. a ]2 C- [+ W" @
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" ^7 `" N$ ^" K0 P server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ Y' U3 U9 v C: e. X5 E0 H server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: @' V6 e% x: W4 \0 p0 Z4 {
7 Q( N# H; x# [ X% W; A upp_error_count = 0;
. g# g1 y/ \0 B ?; v upp_dmai_int_cut = 0;* m3 n0 A q$ s4 i0 B$ q7 C* t. K
) O) N: C* r1 i2 B8 Q$ w+ ?
// fill in data * ?: _/ f# C' [1 k
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 `3 e% x0 X- f/ s server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 k' O. P# S7 I. g( o# K( f }* Z1 w7 ]5 s. O: t9 A6 u* Z9 S* z
}
9 n3 b" c5 c/ c3 ?) f% T2 s6 O else{8 H7 Z. L+ z; g E9 L
if (upp_dmai_int_cut > 0){
9 z' Q8 @# X- |2 m7 w, j2 D DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
7 k/ m8 `$ D" R. A1 L( L k: t3 ` Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" m+ H, s3 W" \
" R6 I* [1 G9 O$ h) q; P
# I4 ^- R( d5 [- G0 D* Y, E4 C //copy data to upp_recv_list_busy; R/ S9 T/ x; j4 I+ G+ J
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 L, g% F" T+ ^, I4 Q! Y9 F
5 T6 u5 n( z6 A2 w4 O5 b; j //
" k, k ?5 x% c& I0 _0 ] ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; O# h" l( O5 v9 J0 A# s- Y+ Y, D+ U$ J
//
. R, W8 @. n7 N9 E8 W5 B server->upp_channel_a_recv = false;//! D1 [, o' V* x. p% i `
$ X: m+ J: F0 A
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, S! ]7 o* P) ^- z* M4 z' S }- p2 H% x g( ^' k
}
* H5 \% J8 d- B# a- c; \/ M2 R1 a
* h8 T. P2 {" |" q6 {: P
2 j4 T$ `7 n2 W4 e8 u return true;& }( C5 \& l! [# G: o. b' b' K
}
3 i& r) U; l2 ]! W' y9 k0 F; J
static bool server_upp_data_send(Server *server)
1 p1 \- u- d, l4 _{
1 F* W0 L1 H6 u8 i2 S9 s M1 e% W, G if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; u0 `8 _1 q( Z2 d$ Y" c DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, P; j- o9 w6 X: d1 b# _: p* }
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 ]/ b. P+ T1 Z( f( H5 r
char tmp[128] ={0};& G. D& h9 c) e
) y4 s- W* ]9 p/ _& O server_msg_send(server, APP_CMD_LOG, "upp send: start");) Q: W* c2 O! m. q' n; T
print_log(server, data, 64);
3 D3 T: n" l: j8 E! ^3 y9 X c. ^7 G# i* W
//
9 {. K3 e# U: n$ X% g# G memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% M; ~" L. @' p! F+ H memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, m8 t' V7 b9 [" N$ r' Y
print_log(server, upp_buffer_b, 64);9 ^6 {1 ^4 u" l6 K2 E2 ~
: Q H6 A% k6 x+ _, u/ F( z6 V server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);5 B5 [! F. @$ P8 ?. ?* Q4 K
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 a, B2 ^( K0 M/ n' U& ?7 J server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, I2 S# k8 |" z& J$ f) g" w m4 A
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, _# {* E: ^: l$ U6 @* H$ R1 k
* U" `, r0 @9 N; a) M. y
memset(tmp, 0, sizeof(tmp));
# F- U: f$ o5 Z2 S sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 _$ u, r& s7 a6 Y c# r
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; J; a4 q% K$ v: D5 c9 h server_msg_send(server, APP_CMD_LOG, tmp);
T/ Z( [5 h5 d, m
8 V) {* J3 h) T upp_error_count = 0;
" f& t8 o6 O6 q$ T9 B/ u upp_dmaq_int_cut = 0;# D9 ]% {. u# j# o# K1 X4 y* Q" ~
// fill in data 9 _$ I# S. c4 e! a7 ~5 ?2 D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 f5 K& e+ ?1 S) |, Q' ?
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 Q! Z, D* l5 {( h7 H( z& R O* n
' K o: h$ k8 w. |9 S- N/ ` // wait send success
, v2 \; t3 S; d while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 [3 ^1 D0 l9 {! m
5 G* c$ e0 b/ t6 a/ O
// make data node in free list
# G p; e; Q; } @" E ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 r# p& D1 L: L6 O
server_msg_send(server, APP_CMD_LOG, "upp send: success");& W$ {9 F- n6 H( R
}
6 @, p) S; P3 q% }9 Q0 X2 t return true;4 F5 j+ |# d+ z' K4 p9 }1 T
}
! {5 u' G% W8 ? F
* K. P( j# {2 B# G( k {3 [; A7 w6 I4 `* v) k
5 i) Y0 Y! H' Y9 V( P
% a; t! Z8 d* Y- s( y1 W
, ^6 {1 r* g, n/ B' k: T; ], i |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|