|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
; i6 ]. _' o P4 k& I+ G! ~: M4 `$ U: [+ w! y+ ]- T( V6 }
问题描述:( ~, J) y9 q: \% ~: e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' k, {' N+ b }; k" t7 Z/ Z3 |5 q8 W8 o4 @/ b' O
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: X& f! }# o" `, }8 l3 h% Z( X6 p
测试结果如下:# P. j$ ?* u" ?
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. `; u, J2 w m/ ^( Z& H, c7 N6 ^8 W, t
' t, L, I0 x3 b0 O$ ~2 I
备注:2 I% {2 y w( P" [! @0 Z4 b: E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% q$ P& u7 b( ]7 _( g: s) T2、相关代码如下:$ C# P+ t& \1 m4 C* E, v
//UPP DMA缓冲大小512字节, F- e) D0 Z }9 ]/ p8 ~3 [' J; i
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
0 z+ x5 X( X1 Q! ]; Y/ p/ X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( Z+ K/ h6 j1 L) y1 X$ k6 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 I- {+ J8 p3 I# w6 M% Z# ]
6 o4 n' @/ E/ v% }* G/ o$ Q& p$ c7 D. M' L8 X
//upp接收、发送buffer
' D( j3 \" y) c#pragma DATA_ALIGN(upp_buffer_a, 8)
7 B9 g! k$ V: s. X; S' m! e#pragma DATA_ALIGN(upp_buffer_b, 8)4 @0 U) N' I, b$ A
3 T+ E2 \1 z& V/ ~- s) B, Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% H3 D: \) ]7 P; k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 d# ?. @6 F. G6 f
1 F @' [% m1 { p: r" d
" m8 A5 s! }5 z2 x: Wstatic bool server_upp_data_recv(Server *server) - d2 G1 z/ ^ o% {$ y6 i
{
5 N$ |" g6 R- a1 ? if(server->upp_channel_a_recv == false) {
' ^* ^. x2 j# n7 ^0 _: O server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 u) b% P3 H0 r* n; p+ l# E9 N: Y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. v6 \1 O9 V5 J
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. v! E7 }' r3 w) C3 {
6 \, ^2 G: m* ]. m: p9 m S7 N: X- @1 u, i3 _. @" N: R
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 Q2 W9 v4 P% k+ P. m7 C
" G7 h2 _2 N& _: w' y8 y$ @ server->upp_channel_a_recv = true;//
& M& K8 M) a- }6 d server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);' L$ r. ~/ j. E# f3 R, ~# t! E$ o
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
# c. z3 I# I8 l9 N server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
$ I |. V8 @2 d5 J, U server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* }/ s6 T% z" ~6 g/ d3 J
/ a/ j" p5 P3 D4 h; h( e* m
upp_error_count = 0;
- T- H9 M+ c. l4 ]) k, d+ j+ R* Y upp_dmai_int_cut = 0;: v+ S4 X1 s! m! |; n$ |
4 M2 [+ o. H3 H/ k8 C: v
// fill in data $ N' _9 V O5 z4 `9 D+ q2 t( i
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% q* `. u8 p. i server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* T4 L2 s- c/ S1 h
}
/ n, {* Q4 I2 c' j( v! g+ h }7 o7 Y) [7 C- q% T
else{( s+ u" ~- o$ H( _& L7 x/ h3 G
if (upp_dmai_int_cut > 0){& C8 q; g7 ~" ^4 K3 [6 Q
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ W" X0 L0 t# F7 a Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! E f4 ]- f1 \$ L1 k9 `2 L5 j
3 R3 D) X8 G' t0 m% f
* f/ d+ U4 K7 }! D8 y
//copy data to upp_recv_list_busy, [$ B8 Y# p3 X' X; a& k" Y0 u! \/ J
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);5 T5 Y$ F+ b* B) t, E& b5 R9 o
1 R- y9 k" O: N* R2 e //0 D5 ?+ J/ v- g/ X2 X
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ j; Q1 j0 x) h4 T, c! H! r2 b" e% d" j! z. s, E# b# [
//
, e6 _+ @+ d3 R* u r# U) ` server->upp_channel_a_recv = false;//
0 J5 {& t" B" ^! U3 k6 y2 _+ {4 r0 B" Q" l
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 P: U1 ?* b$ z. B4 K0 y% D! q }, F5 W7 M$ h) }9 s J4 e
}
4 Y; B* U1 t. m% D- D5 c
! @& ^% S% ]( i
2 @+ B! o! L* \3 T- A' a5 k return true;. t! Z, j2 j( z( G7 i
}7 k, K$ K+ T- K& P' m
$ ?0 ^+ k8 g' K, r7 H! W% Z4 \
static bool server_upp_data_send(Server *server)& E, ], C+ V) E/ _) j' t t& J
{
% t) Z& Q0 R1 h( Q4 S8 N4 b. b& f if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 c, w, F5 u9 g7 _3 G! L# P' x! `5 V8 ^( h
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( L1 W, u8 T- \2 t. o' S
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* f) F% X! n/ [8 W
char tmp[128] ={0};( X1 x; Q9 j6 S; M9 D y; M* Y
, ~' D3 o: p. w# U/ g/ P, A* Z
server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ ?; H3 K7 B9 ? print_log(server, data, 64);: o* W7 h3 A: W- ^ C
- ?- Y g) q! x$ g, c5 e g; g g
//0 m- y3 V, g$ n) t) p/ ^0 c
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 b% y; d9 c/ I" v5 m
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: F( @- v# V" P" v$ \& }: k5 D, i- l5 G print_log(server, upp_buffer_b, 64);+ u6 e5 O2 N5 p
: @( I5 v- E) {- Y t server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
# E, V; t7 L8 b5 I: v server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
0 q% }& X0 [2 q% W# R- W! s! a server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. s* V) ~& F4 [/ B/ w server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, ]* t- h. k1 V0 v& U
- e& T; Z/ `3 C4 n' K: W memset(tmp, 0, sizeof(tmp));
) |8 O9 L9 E: k4 i( V! E sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) I; ?; } p& C
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! y- U9 C# {" R2 e3 Q6 T
server_msg_send(server, APP_CMD_LOG, tmp);$ Q- }0 {$ a9 U$ T r$ h
; C2 @7 D' L' k" L upp_error_count = 0;7 A: \5 S: t P( _' l8 \; u N4 L1 v
upp_dmaq_int_cut = 0;, [; b& g( d- C, F) U
// fill in data
% d; o- ?- \) e; R1 M' `7 N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' R9 c: V% D( K% R( m2 o3 } server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# c7 S6 v0 a1 i N4 R
% l; m5 Z, T: j) ^+ d // wait send success3 o1 P& R2 y' o/ c) b! H% K
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " W1 i& j( F+ K7 k2 j
3 I: N5 O) x' {' L0 L- }8 m! Q // make data node in free list
9 C! e9 Q. P+ m% F ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ \6 W7 { n* Z+ _1 Z$ J
server_msg_send(server, APP_CMD_LOG, "upp send: success");5 v, m1 q0 [3 ~, f+ q- M/ V
}
/ q+ A* i* S9 P3 m' _ return true;" _( \1 a5 E$ u, J
}) e& Y- Y7 D V$ Y, j. f, @
7 j8 R# ~- f+ }# |! M
5 |! H! _' n+ r; [$ u- Y0 f8 J
* b2 p+ h; l+ C( D3 ~, o( |2 R, y; ]) w5 T- q. J
! w8 E, ?% @8 v& i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|