|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' t& }5 E/ \) S
) d! l' ~, N _3 f- }% l
问题描述:7 _, n( c5 i& i- ?4 |" u
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:- R+ M& H4 ~$ W+ j+ o
% o P( A) W9 S" M- Z4 Q0 Z1 [: a5 D图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 ~' _' W& ]& k6 _
; K; ^" O7 D) L* R9 \$ G/ Z% N测试结果如下:7 K+ `) F. j$ i9 U, H+ J7 C5 e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, d0 h! C/ d& k* m
" ~) J$ n4 V2 k% `& i9 q
0 T0 }" X# L7 p3 S+ c. |, A* ^备注: s/ y- K) D" w, g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 |0 L7 ~# r# U2、相关代码如下:* V6 W) |& ]8 H' t% V# C: [
//UPP DMA缓冲大小512字节
# \1 p% R3 T6 P, X2 l#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 a# `- X: A# U1 h8 a9 `
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 n( ~# Y' c s) _#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" q7 |6 H3 B7 D0 d I! R
8 C# S3 }5 _# r `3 n* D9 r8 ?
& N. l3 k3 C3 V* q1 {. N7 M5 v//upp接收、发送buffer
. M: B3 `" o4 j) m1 r2 Q( V#pragma DATA_ALIGN(upp_buffer_a, 8), |! ^+ W/ A" v, d% f( N/ q
#pragma DATA_ALIGN(upp_buffer_b, 8)
2 B4 x6 X0 C' P/ O D
- U: U8 {% Y. v; B8 aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* v6 W- ]- q$ _( y, B9 \% j; l3 I
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* K [. D8 t- p9 ^ T. \
$ G7 F0 v/ { D5 u% g, m
8 r1 A* X7 O) p2 [static bool server_upp_data_recv(Server *server)
5 X' ~ m. _- }$ Q{9 r: E8 j7 Y4 m1 }7 Z
if(server->upp_channel_a_recv == false) {2 N+ E% ^0 O7 d2 A7 @" z8 |
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
" h) e& X& g) b0 \9 Z if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 f% C" b3 F# ]$ L server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ R2 q8 j# d, E, `& m
& z+ Y. M5 U2 V4 g7 c5 A) P9 f) g4 v$ X
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
) P8 I% q4 U% a, x& p5 H/ u7 ?' j$ O+ @3 N8 b1 Y
server->upp_channel_a_recv = true;//: I& n ^6 D: |, ^, H2 x
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
: Z' a9 f$ F; S) M: n# q/ Z! C server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 A9 W) X0 b9 O7 T
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
6 P, l& F0 Q% m server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" ?& H2 L' G- ^3 P: c2 x+ C1 p+ M( C0 p( X9 |% a+ N5 w0 T
upp_error_count = 0;8 S& J8 g# q" \( ~6 z+ o% G- A5 N$ R
upp_dmai_int_cut = 0;
6 x* U9 V6 G) A0 o2 C
$ o% K1 n! D3 S/ W4 C // fill in data $ s9 m1 H6 m; }8 }' D3 K# _/ ?
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 k7 T! O: \# `; k2 v: r" i
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 f# D6 `: [' ?' [0 a K( p6 s3 w) m% ` }* k2 H# r; [( p) o# W0 v& i
}0 Z. A9 f* P* a6 ~+ k M' E
else{1 b8 T8 u0 h! \1 X0 P" n
if (upp_dmai_int_cut > 0){& F: }4 T! g; M$ R
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 H8 F1 w2 `- K Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 _* C0 l- ?% g1 N( Y4 \+ P! n$ x+ t
$ i; y' c( O9 e3 B
//copy data to upp_recv_list_busy
4 V6 `. ]. x, a l4 [4 \ memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( R: ?1 |$ Z5 U# q
6 r0 w0 U0 X' ? //
2 h5 M( ^: |- u6 C9 C ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 R9 j. U, ?0 ~
! }; P$ s. m. D, S/ M8 ~0 U //$ s, I# U2 j: [5 Z M; s8 G* H
server->upp_channel_a_recv = false;//
' F3 W8 u- R2 q: u, U
) ?" e' J U. p+ M' E! a! S3 v server_msg_send(server, APP_CMD_LOG, "upp recv: success");; f8 q* H/ h$ n
}5 N' v! Y8 j3 x1 y9 H* W
}+ R3 o3 B/ G) w: V( {9 J1 [
9 i S6 y0 H1 R% h) d
) w1 a# A* z c6 E( u8 ? return true;6 f/ S4 g9 _( j9 A5 a
}
: C( P- R# r) K. q) z6 r f
, E3 w6 R) A# v" \ nstatic bool server_upp_data_send(Server *server)
" b) l6 |& S; g n/ A+ z+ w{: B# v, w$ I3 r
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. u" Z `0 O1 t0 J6 c0 k* C6 p. s/ v DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' e5 V$ `4 _ f" F7 q/ B( @$ N unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ {! L8 X8 W8 R; x' l char tmp[128] ={0};) a, S5 E+ @% ~
6 G% @, v: p+ w D
server_msg_send(server, APP_CMD_LOG, "upp send: start");; U, d& k# x: a0 E
print_log(server, data, 64);
6 i: Y. D2 u. A0 J+ W8 p/ g) o' N: o/ L. i& W
//
5 A0 a% m, g& i memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% B& A' ]' b( p- ]4 ?# f$ f
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 n. ?" I/ m: {4 V
print_log(server, upp_buffer_b, 64);
% i# O; o' Q1 T1 W
4 C" Y& G7 ^2 e/ O& P' b, @0 L server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);* ]# d! [# t8 n/ s- E$ s5 p
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , @: v) D8 V/ D( d. J6 C
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;. [2 B/ o" W7 k1 r3 B
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ W8 l, X% S- D# h& L2 m( H
7 `: @* N: B) Z! I% X memset(tmp, 0, sizeof(tmp));; @6 y; D H6 F7 x* s7 q. U8 Q
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; J; f8 j9 Z/ I* R3 a sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) n8 J. i# T* p" S6 G9 |; N$ o
server_msg_send(server, APP_CMD_LOG, tmp);
% R! T/ V# g- O2 o, C% U P# r! G8 b& Z! ?8 _6 U+ B O0 k
upp_error_count = 0;' T1 }9 ?4 w H# g g% x
upp_dmaq_int_cut = 0;5 P) U, {) e( o; Z
// fill in data
+ A3 L; a; l9 e7 m% D: S uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
7 r$ c5 ~& z1 u6 n0 P server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# ?9 s, m7 H0 S; A# M: X* B
2 K2 T+ ?+ J6 z# U
// wait send success
1 G) p5 I& y* l& h" F while (upp_dmaq_int_cut < 1 && upp_error_count == 0); & n0 j0 \. ^& O& ]0 i
: O( _! C0 M# k4 c6 { // make data node in free list
* g/ \8 j" u0 _% p; H5 w+ u ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' h+ b' c. l: B) r server_msg_send(server, APP_CMD_LOG, "upp send: success");
# d9 B: ^& S+ N; c }
q3 q# _. U$ j& w) ? }- E) M return true;: A) L/ M! ?* M" o8 d
}
* s! Q& I5 I. E. H
3 ]( ]4 U2 H. k" c
' ?: H, ?, v: H
4 C6 B% I8 X1 Y9 k
, F7 C6 Z0 R2 w) D! E8 e% O; y, ^' J r7 N$ f% P a" Y2 f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|