|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / n+ Q: C1 ^, i7 _4 O% V* a
8 m" |$ @% E6 z* d
问题描述:
* C: ?7 a. C+ _! o! p* |% D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: R( ^7 f0 @# ?( j; D* T3 k
% H+ @ i. @" F; n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 y0 x6 _+ `* j$ \4 B( g0 m" b, _7 l* p' L
测试结果如下:
9 q/ M d; \8 [3 T6 L4 A" T `138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& G8 q, T' u+ R: m
* Q2 |& ]" U- s
. v* M$ g# k1 o/ {6 D" }备注:" e( x+ o) j3 g; m' L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: s: v( |# e" v6 s2、相关代码如下:: u% } U" u4 J! o6 w5 w% @1 {! U
//UPP DMA缓冲大小512字节
8 y6 C, A- {+ h! E1 ]7 S#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. i/ Y5 [% K: }$ Z( G% h! ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) A# F' r# r+ ~/ k3 u- d
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
; N3 B; S+ F6 R6 W" x/ I3 C& x7 d. ?5 x/ {& d
9 E0 b0 X( G' \
//upp接收、发送buffer. Z2 H7 C S- ]' i+ t+ O6 L, ^
#pragma DATA_ALIGN(upp_buffer_a, 8); T( ^# b; N) m7 R+ | \) G
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 u; P0 H& h9 h" H: a1 U& e- }( I7 `6 v3 P! Z! o0 ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 d A" Y4 o7 t: b5 U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 F( \( P+ {9 S6 I4 O7 P2 D1 k/ n) b% m, D* o
3 P. v5 x. l+ K9 Sstatic bool server_upp_data_recv(Server *server) 2 b% P C. u: T7 i) N' g) f s1 b
{
% A) y- x: A9 Q O4 W+ M+ x2 r9 u if(server->upp_channel_a_recv == false) {
! o5 ?2 `2 p! i server_msg_send(server, APP_CMD_LOG, "upp recv: start");; R- X1 b( w% [/ q- D
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' G& e' \$ | K8 ` U
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 U. s9 w% o" n
1 a( O+ r+ v) G1 S- A d: k5 Z4 s( P
6 Q7 h, I0 v, d memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 E3 O/ L* r' F& }( Y; ~; T
+ A0 p$ P# E! k
server->upp_channel_a_recv = true;//- R% l- ], C# X
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);! ^" y5 V, o8 C
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;4 Q* c/ L0 d0 m: F
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;/ Y' o* Z, D1 U2 [
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 w; Z; x0 ?: @' N% _& H
- E R" H7 X5 d/ [ upp_error_count = 0;& v" f5 m+ Q; }( P" h
upp_dmai_int_cut = 0;
6 p8 g0 b, ]8 ^0 C1 k1 N# j2 w, r+ m' s6 P8 N" U. Z
// fill in data ; V) Z4 t( U# Y; X; k) ~) P; n
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 |& F: K; G& M5 T. G5 A( E. {5 r% U
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* q. j+ X6 Y2 a4 I }
T- p4 K; L1 N }/ p+ ~5 D( i( G6 T' |/ _9 A
else{' n1 E+ [ g0 p% s8 g/ h
if (upp_dmai_int_cut > 0){
% P( ]' g2 T0 d' Q+ W6 N W v DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 o& H% G% `7 {! R Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ m- w) Q% D. O8 U* g3 e
6 B" g8 Y8 i0 N3 u
+ ~/ c9 p1 Z$ q9 ?* f; ^5 j //copy data to upp_recv_list_busy
2 O4 z0 z9 [9 o memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 Z4 f# F' m5 d: {3 }* o* k. ]8 E
I, e. L. D2 v" ^: Z
//! s1 F( W8 [7 E0 \' R
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! D$ q& j6 D6 x, @, q I- o( i9 V" h
//" h( E0 ~' _3 G" g7 F
server->upp_channel_a_recv = false;//* r( [2 R: s* h1 r. [
# n W4 h5 t% y% R: Q6 n, e server_msg_send(server, APP_CMD_LOG, "upp recv: success");
( e3 o: \& c, Z }+ ~6 D7 c! W0 [! @- z' Q- }/ G
}- @ C! O4 ~) A" o" x( L9 Y
3 w$ i5 t) B6 e5 ]5 E7 z% b
$ ]3 l( g! R5 k6 a# _( }7 o+ r ? return true;
6 |% j. E1 N, M9 c( a& B}7 W" N2 b) b( O$ [
& q5 h7 x4 B* E v0 d9 [
static bool server_upp_data_send(Server *server)2 G' y3 O! Q6 z/ e2 X
{' I* V ?3 V) {) l
if(ListMP_empty(server->upp_send_list_busy) == FALSE){: G! q) ]- X( ~; D# }# v
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& d3 j9 X5 n/ C8 ], P unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 U, {2 U3 r1 g3 B char tmp[128] ={0};5 c& i" \' c0 V2 c
& [, t9 B) m) @
server_msg_send(server, APP_CMD_LOG, "upp send: start");
' |, p0 H2 v& h$ H0 }9 w print_log(server, data, 64);
0 ?6 a) T( J$ D Q6 d# X! f4 J: e O# I: o, l9 y% @ A
//+ J# K- \6 l: h% F- M
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 j: \4 R& L, X* X$ p' `+ ]* l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ O n& `: ?0 e. L print_log(server, upp_buffer_b, 64);
; n% K9 U, m8 t6 i- a) k" s" W. v$ B) m! C) @, w8 U' K
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
+ ]# ]' t# a0 L0 K; r* ^ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ! H7 B* `+ z: H& F4 e2 A
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ c! k1 y: Z \9 W server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) \9 h. M K9 V/ i$ I% Z& |8 |7 a0 P& n) j
memset(tmp, 0, sizeof(tmp));
3 n4 G# \4 N0 ~* Q" h# R2 m: \ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, W( I3 z+ | e5 S sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( v8 ~: A' D( R% g) J
server_msg_send(server, APP_CMD_LOG, tmp);- I1 N4 g$ q, G9 Z6 A: |
9 @" j/ r3 l9 b8 Z2 P2 z, p
upp_error_count = 0;9 S5 ^9 a n. M4 r( \2 }0 R' A, q2 L
upp_dmaq_int_cut = 0;( g9 h# _9 K' i, v8 l
// fill in data % O7 e$ X7 g. ?- _
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * v( C8 E2 o; K
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 ]/ H0 D3 I8 l6 d
7 W( q6 V0 {! }+ d+ F8 B
// wait send success6 y& ]+ i) U" @! ]0 l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); t" u" x# Q' a& m) H+ r* I
0 ]; m4 b+ ^, h7 |$ ?9 ]5 Y // make data node in free list 4 q' [+ Q& o9 I1 ?0 a" f& U' _3 z
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ y6 ~# j0 t; l server_msg_send(server, APP_CMD_LOG, "upp send: success");% w* b& V& ^# x3 G N5 X) o) ^
}
3 J$ \0 l3 l: R" W return true;' |+ \2 p$ y0 _1 ?1 |
}% ^. h' A" o. v6 P3 d" T
" Y0 q" F- w% T4 o# H
3 H0 b/ L0 O( }
4 Q) `# v! M3 t. p, R0 c" G% M( m/ i$ B
& z2 W: W+ L1 i2 _3 H! ` u |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|