|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 d2 `1 H% \* f0 G' A8 ~/ Y8 L
& r. g1 y5 }, J% p) O7 ?% i问题描述:
' J7 ^$ u4 v- z) ]在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- k# E. \! f6 N. V# R, ~9 @
) Q+ F# @) Y) N* x: P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 R% Z F+ Q" P4 t! {) m7 O0 z/ q# b
测试结果如下:( V6 h6 r0 f# Q8 w+ A# ~. ?/ s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( P/ [; c8 {( C/ F& x |0 `
! f% g$ v$ ]& I1 v h
& Y6 ~2 n* c! M备注:
9 h+ A0 X* O+ B# M! L# \' D1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) ?- J3 I% E0 h2、相关代码如下:! x8 y7 O4 N" s* J2 o8 A8 G
//UPP DMA缓冲大小512字节
2 ?' Z6 U6 B+ Y* J#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
& c' s0 K5 b" \, U#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT d" ]# w$ }2 g! S5 z$ Z: ~: Y4 w
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! e, d8 q' n& H+ Y0 J1 C
1 g# C1 T/ C8 U/ P$ y& X7 _- [6 j: t9 }% z1 t- h; } H2 E
//upp接收、发送buffer
& P! x, V: q" }2 k#pragma DATA_ALIGN(upp_buffer_a, 8)
+ [: }; P! e* a- j+ L9 z#pragma DATA_ALIGN(upp_buffer_b, 8)
% r2 V' ]7 K5 c8 D+ A3 f2 ~, u- k6 r; f9 H3 p" k4 J D3 Z- U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
1 N, j. C1 A4 g, A: v2 W. I( L6 Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% u# D$ V: t) @8 J( z
9 k7 a4 O! F% w8 M* ~& @# v# J" H0 B
static bool server_upp_data_recv(Server *server)
/ Z" Y6 N( @: K4 a0 W{% L# w. A% S# w
if(server->upp_channel_a_recv == false) {
# K! n' h; M# Y! O server_msg_send(server, APP_CMD_LOG, "upp recv: start");: L, {7 r+ K) t4 m! R7 S3 X
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ U' V- r2 d0 d" P1 C/ s
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- d0 [9 T" ` c
$ b) _$ ]1 O7 A' J5 @* q6 i5 N/ T' Q& r a n g
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: S/ c2 w: B& c G7 [; H4 D
/ d7 Y- B0 R7 {2 @( p server->upp_channel_a_recv = true;//1 r- W4 C! y( [
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
, o. c, Q2 @& [* L2 f6 O& k$ G, p! D server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
7 k* A. G& l5 G) e5 }, |) ?5 I4 O server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 Q, n# V. F s3 T: b J/ A
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) b2 e- l4 C- W' s! s- o
) J. t0 \+ M! y* D2 { upp_error_count = 0;' \6 [6 Z4 {( e+ D/ h& H
upp_dmai_int_cut = 0;
: Y/ Q) e% E* q; ]) {! x, U+ @# M. y
// fill in data
O3 k; W. w: p4 g# s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 Z+ H6 [; }: w server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 k2 c7 h, }5 K/ r
}
% B; E5 }% o& i; B }" |: p8 x- {( J) d
else{
' V) q; Q8 [: L! q6 q# [& ~5 j if (upp_dmai_int_cut > 0){
0 y6 u; P. x7 y5 ]6 t# L: b DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' c. w) g( E2 ^, u7 r' f" m, s0 G
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
g6 I9 H, f; Y' p/ {' G6 `
! q# u; m7 \; |9 ^9 i* u
1 G2 ]9 {- T( Y W9 G) y //copy data to upp_recv_list_busy
. L' e( ^/ M8 u; g, l2 W& Z/ R/ W memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& i) M( l0 K5 o1 V
9 M3 f0 R2 N6 b //5 {7 l; W: j% R& r, G0 S. k
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% o6 w! ^: N; W
0 z4 Q1 T4 N/ w# c! J' V //
! B8 R) h- R7 g3 P$ J* J# O server->upp_channel_a_recv = false;/// A6 X. |* J, k! P
8 | ` z- t5 h( {, d
server_msg_send(server, APP_CMD_LOG, "upp recv: success");, m' e# ^3 V# q$ f9 C# \. w" v3 b
}
2 R& O" Q+ R! b& } }! k9 }' O9 o0 m
) I6 e+ e3 N3 \- U2 G- k" ~- s& O! O
6 V. y- x7 Z9 A5 p" E
return true;& j1 }. m, Q3 a. G2 b g# x- m
}: |. \ V, ~; w; X' V' O4 s
( o/ e6 w# t/ @4 tstatic bool server_upp_data_send(Server *server)7 g4 c* Q2 x& V% E$ I
{. C z E3 O5 a9 b$ \) P
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
& [0 i$ r- S% b: _. z DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 u% R9 d! I0 [0 S) H unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% v7 n' u# z8 w char tmp[128] ={0};# E0 t. | e2 g5 |# }% o' v0 o" z
1 P. Y0 k% b! j# I" e
server_msg_send(server, APP_CMD_LOG, "upp send: start");1 V O7 T0 ^5 t
print_log(server, data, 64);& R# R9 L' q/ ^5 ]# V
; X5 k9 N0 t+ J
//
" O4 N. j# P3 o6 n R memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 s! V5 Z" t" J; v5 W' J9 P. n3 E memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); @: m0 h. o/ z ^
print_log(server, upp_buffer_b, 64);
8 |& l) ?8 ]& W6 k0 O" X# v0 V$ {' q3 j
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
5 n% ~& _2 F4 ] q5 I8 T server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
$ z+ y% |# F: \5 B server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;- ]* C3 z8 V1 s% H0 y+ @
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ k! `) `3 N9 W0 R# o4 v0 r
2 k+ M% K. y7 I3 i$ C memset(tmp, 0, sizeof(tmp));' m9 H ^, V& G, ?5 w$ v. v* V
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, h6 Z9 z( u# _& @ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 L( F% }) |3 w2 y
server_msg_send(server, APP_CMD_LOG, tmp);; @+ R1 H$ i1 }1 Q3 L7 a
9 B$ [' x- J5 R$ y9 V% o& G
upp_error_count = 0;5 s( ~9 c; V6 l: @
upp_dmaq_int_cut = 0;+ s; m: L+ r4 v* M
// fill in data ' }" g! \: Q$ u2 P6 {- ]3 D/ a
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & { w' D$ g% i* Z& P* }
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( ^8 S0 h+ A- x2 h8 u- G- `: Q/ f+ e2 c4 Q* Y1 x
// wait send success/ |( m" D5 f8 G+ N& X0 z
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + a8 }$ g I: i6 o G7 x
0 I0 ^$ H& I: [/ |- e. c. W- g // make data node in free list 7 o& i! q* d" g# A9 Z) g
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* m2 r' d2 r" h* V) B
server_msg_send(server, APP_CMD_LOG, "upp send: success");
* J' }& g( O: H2 x8 O. H" F9 a9 E }" G# y1 W7 G3 N2 t5 Y, z4 D
return true;
; I3 ^/ @) w, y}
. B9 j1 l; G( @' `. L, v# M+ T0 o; T1 K8 d: X7 ^
9 [. H4 G, P1 X; k$ a! e
) Z7 M3 m' f5 e. A3 u
/ N$ O+ I, ^ C+ @4 R" w5 V/ j$ l! a' o% X
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|