|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 y5 g$ l4 T/ M' b/ u
; I: c `( [% k5 w1 p# D0 a" i
问题描述:' B$ \5 v' A) m, j) o7 s! J
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' h/ L+ V; _$ Y9 c4 v O
P+ q' W% K! [
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% ^) z% W* d: m( l3 t" i W5 c% D% {: L3 v* `; x: f
测试结果如下:9 ~- o+ t# U" n R9 I! w2 q5 ]( R
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 t" X) T) X3 f, v# T" m
6 F8 Q1 o7 ~/ X
- J4 @. E4 K! K( ^' `备注:
& ? i6 r8 B! h* W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. ^, A' G" x- p2 O8 c! Y" P
2、相关代码如下:
y$ F/ }# L5 L' }//UPP DMA缓冲大小512字节
6 {: D# V) ~2 Q6 v- {#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 z+ y: _- C5 X! N
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- |0 c/ Y# ?+ z$ e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; y* p9 [+ Z$ [1 H: y+ E; i4 V% X, R3 p
2 ^5 O& _3 @5 G: C f' [
//upp接收、发送buffer
% S. e2 X" m% P' {: c#pragma DATA_ALIGN(upp_buffer_a, 8)
/ f+ J6 _5 j! F9 K, Z8 e: @#pragma DATA_ALIGN(upp_buffer_b, 8); m2 H& m! W' b9 E
; P7 x3 L8 M; l2 ?, L
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! m* |' u1 L/ v/ U# `, j
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 M* L% ?! ^+ v n
1 e* j M, F! r2 x# M" u6 v$ i- ]) R4 Z
static bool server_upp_data_recv(Server *server)
7 x- Q2 V$ k9 D4 J{
+ u- r/ \5 y. }' M9 p+ c if(server->upp_channel_a_recv == false) {$ z. h7 u9 N! L p
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% b M6 Q5 X( h% t/ H% U0 X7 N* u if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% a2 o7 h- D0 {* `! c# j" r server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. H8 ?. n: F+ w$ p# B2 D$ r) A
0 T2 ?8 c) T( l: ]/ O
: G' v0 Q5 m+ V& m memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% n' u8 K& y% R6 z, x; H" d
2 J$ b0 B2 ^8 H3 L! e, y, M server->upp_channel_a_recv = true;//
# v$ {3 p1 ~; ]- d) c6 T& F server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 R0 E3 \. r4 C! s% ~/ p
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 v u. |4 Y0 i+ O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
3 ^, r* ^6 ^) l/ Y$ {2 j* v server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: ~1 G/ L% c' K7 p
9 L, H* ~) O; \+ f; A r upp_error_count = 0;4 @8 O+ k" M- _, p
upp_dmai_int_cut = 0;
2 c j7 z9 n5 o3 _. R0 w
! I/ }7 X, g, K9 |. l; X // fill in data
+ I3 Y [( A, W" V* t, B6 F uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- `' {: L. h# ]; ^. c# _; q server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! x9 [5 ?& G; F. a# ? c- @
}' S7 P- T+ j8 H( c* G% a
}* H7 I( g' E/ k+ n# T: S d
else{
4 v& U) G% {0 _7 O if (upp_dmai_int_cut > 0){
3 K# D& C5 l& { DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. U# t6 {6 n% [! ^6 U+ ?7 v1 N
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 i; L8 `) R+ x- ]: O' j- ?7 K0 m% x4 o
$ @: i) W9 S# X7 B' t" k
//copy data to upp_recv_list_busy
& V# R* { w# a memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 f6 g# w$ y3 B7 r+ C1 P
) |0 u& ~0 C: q' h$ i7 |9 Q //
7 _/ w0 K* }' s4 F ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 t* l+ ~5 f: {1 ~( R$ Z9 m& }! i) D
9 g% \. d8 G2 e
//
1 e- s7 b6 ]4 I5 ^% r q server->upp_channel_a_recv = false;//
( o6 \. g2 Q/ H* m) z, h$ E" b8 M( U/ g8 q0 ^* ]* d
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 y) c7 P% Q7 f) ^. J- i6 ~% v }
$ }/ x5 G2 J I1 R4 C }, u/ T. ]/ X& m# b5 q
) x; O" b7 b! G a% L/ K" W- y0 S2 I* o
return true;: i8 W; ~+ V, U! M2 s
}# R3 [# F/ `3 E% |7 j' o
* Y: c: P5 u6 B- V9 {" e* Lstatic bool server_upp_data_send(Server *server)
4 V9 u! H2 ^: w5 R* o: X{# e Z" M' R; n' \2 h& s% Y
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ n" t7 `' S& V" m" L- s! P. x6 b DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);* z! Z" m( Q7 d; y0 i
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) w9 o# r+ Y; d M5 _8 O# A/ `9 O" K
char tmp[128] ={0};( \" h" t6 K! N7 x% z! p; N% y, }
! w- }! f/ p' O) M( M
server_msg_send(server, APP_CMD_LOG, "upp send: start");/ V7 {8 u' r9 l$ [ h5 m! D/ \
print_log(server, data, 64);
6 U# C1 c, J: V, B! r! g" Z$ ^4 w) H& r- ]8 M5 h: n
//& a9 @9 @ ^2 C" d- L3 O6 x
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, c7 `! o& Q# S2 |( n* j2 ^ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 E0 [) h: l- ?- |/ P4 W5 {$ k print_log(server, upp_buffer_b, 64);) K! E2 x- Y) `; N
. O8 A l" H" R
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ O( @' S! q' J: _) K! g0 N$ m4 y
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; * a! t; j/ h& W+ m$ K
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
0 J' N6 i. B' i6 K5 R0 y) S* K server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) h N m7 l# c% Q: \
) V4 L7 i' V2 j2 j4 b6 U7 R memset(tmp, 0, sizeof(tmp));! |" d! W# I' t
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % S% c* V- P7 q. x' ~
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 I( c. w4 I% M" F. K
server_msg_send(server, APP_CMD_LOG, tmp);! w: a; x5 G# U% r( X4 V
1 f, a; X! h" a- I% ^; k4 }
upp_error_count = 0;
# C8 \" o( l& e upp_dmaq_int_cut = 0;3 S8 g. E: {: r8 p' m% C! B
// fill in data
$ A; u5 r% z! b3 P$ \7 V uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 V. f' B% U8 G: u: Q server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% k/ ?: D: l2 M) o
0 W1 J3 Q+ R5 t( ~$ |# I" c$ k // wait send success
# w% A# {, m; J while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ i/ W0 V( E& p3 o I
1 n5 d5 j" P9 c% L3 C% E // make data node in free list 7 _' L0 O8 E$ V# f: X" L3 v8 Y
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" v! m. [0 \) m* C0 \$ ~ H
server_msg_send(server, APP_CMD_LOG, "upp send: success");
+ V; t' N( |! |& Y1 j: y } p5 O- e" B: W0 T9 w6 t' I# n7 U& B
return true;
9 T, V- R3 h1 D, a. z* {) {}
( [- Y/ q3 ^2 e$ B2 G, W
5 X+ J5 X5 \# M* G( B1 `. z4 i$ j! @
; d8 f' X( d. J8 g# @. r+ r# n& j% k" {
1 I4 H7 r f) u: [( X6 d3 `; {% E |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|