|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
& Z% i7 E6 V* D& o! U
- V8 l# Q+ z% w" o问题描述:
- N4 ]7 q. |' w$ [* Z( R在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' }. _% ^' ?1 ~! S: v/ L
4 n6 q5 p; |( P
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 r5 ~' ?8 K ?1 M0 ^% N( Z" A& l
6 c' h! z! G' g/ A' ~测试结果如下:
# l0 x# T- o9 b# D+ v- s138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. r8 l5 {4 Z; r
4 A* R4 p6 X0 \8 [7 d9 H! G6 n
2 x2 t( } e! e9 B! t
备注:- E" K8 _: c* U( z, G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% h. Z/ ~& h0 x8 Z4 _3 ^7 K- h2、相关代码如下:
( ?! e) t) k1 @# D8 B//UPP DMA缓冲大小512字节) N9 L# C# `# E9 c! t. V
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: [1 N& V5 P& t; y" U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 H4 m" i2 R8 e* `4 {0 w& P. D
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ u( Q* A+ ^" y m& y
& G) `1 {3 @: i" }4 C) T4 d8 b n$ j
//upp接收、发送buffer: K8 i$ C3 w" Y" S4 s, U8 }
#pragma DATA_ALIGN(upp_buffer_a, 8)3 K$ i9 i5 K% H
#pragma DATA_ALIGN(upp_buffer_b, 8)0 e- N8 G* A+ p: K
' q. D- u& V% @7 _; B* b4 dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 g" [& ~( Y0 ?8 ?/ x& punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ Y+ t: @' E( V
1 Q! w# ^$ c) c. y, u8 W( C& G- h, C) j
static bool server_upp_data_recv(Server *server) : V2 T( d; L8 i$ F& L1 @0 ^
{ Q0 _1 q6 v. \' r2 Z' H: |3 D
if(server->upp_channel_a_recv == false) {
+ c2 f1 U5 _; H: W A server_msg_send(server, APP_CMD_LOG, "upp recv: start");' X8 B; v. I8 r Z6 j% I
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' R8 B" u7 q& V" @9 x' [3 O
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' Q7 Y* x# G8 [6 H0 @& f# g ?, N6 [6 O* j t% X# a( b k$ f2 v
7 m: N/ A* h' d4 u
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- ^7 g* b; j. z% p* S- N7 l6 ^7 |: C
/ S& V4 f& }7 C% T o server->upp_channel_a_recv = true;//
6 h7 y% _* V2 |' u, Z8 X4 l# n9 N. c server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' ^7 f }% Q8 h: Y% y9 ` server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
) j' t) w T% q }/ x% S& { server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;* R6 m( r7 P- z% v/ [
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 @! ] B* q" F3 B, \
* q$ j% e( G7 T0 Q' t
upp_error_count = 0;
% S9 n3 K, n2 `3 N# e upp_dmai_int_cut = 0;' ?# w" U8 m9 R/ ~( r$ C3 E
' |4 o* n! I# q0 _' s // fill in data
$ ~3 V! X/ R9 V0 g2 N uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 `; p$ @. v6 C/ f3 r server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ m. J; ~$ @3 a& g0 @
}
# ?% d- _' i2 U! ]% N }
% R; [2 k9 T" m; E! `' @& G$ s; L% | else{- U e5 p* a& R; ~
if (upp_dmai_int_cut > 0){
2 P; ~$ I9 h7 a, |1 D+ R- H DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' c' b7 v4 c3 [/ u Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 y1 j) M& b2 T0 {4 g
/ G- Z8 v9 w; F- z2 M4 l9 Z7 z) \7 X& s, G8 v' C' z
//copy data to upp_recv_list_busy5 B7 q* [/ E; _: C' X
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ K' p/ a7 n8 g) p
0 P/ a8 Q& d, r9 k //: x1 _8 S: y% m/ ?* v: r
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% s+ T* a/ V1 e5 B, t" y
- ^; \7 ~4 G# x9 k _ //
, \2 |! W5 P! u- H server->upp_channel_a_recv = false;//+ ?0 T4 {, b9 r/ S! y, K; j
0 s. [- ` F1 O C$ g
server_msg_send(server, APP_CMD_LOG, "upp recv: success");! ^4 t" a# j/ U2 M
}# W. H2 h9 ?3 m( _( n" ~
}
7 ~1 S0 C' W+ \* t! @6 n ~+ l! V) z8 M0 l$ k- F6 V% b/ Z
. b1 r& [" r7 T7 u. S
return true;
5 f; i l, F7 J+ o, ~! `* |}8 _+ F6 E. b, I3 w& J* U- z$ k
# r# h0 z M9 j' r7 ~( D. X; Hstatic bool server_upp_data_send(Server *server)
6 b* `1 E, O6 E' ~1 d, I{# l) Q- y1 e+ h9 ~+ t
if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 U% e6 C' x. S
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 F8 F; I# z% U: @, G: g" _' b unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* B% D6 f# K# p
char tmp[128] ={0};8 S; x% X* u9 n2 b' f9 h2 o& F0 n
% M. x- p& M6 Z& H7 [
server_msg_send(server, APP_CMD_LOG, "upp send: start");0 N- \3 V8 Z" ]4 u
print_log(server, data, 64);
6 S" c0 C* j: z- c+ l4 p
' A0 t* j6 n! V: }4 S) g8 ~ //- Y+ j2 |/ y- L8 c$ O
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* i4 R- P$ |% r5 u! l0 a
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE); E* q0 \5 J" \/ ^" A* @
print_log(server, upp_buffer_b, 64);, ]3 Y( N3 c6 W% I2 o, O, j3 F9 n
W; z( {7 C% c1 o; F o server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
: G7 }3 M7 o2 z" }3 s& b* C6 F server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ Z; ~0 j2 Z6 Q2 @9 ^! q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
4 k: c& g) G1 _8 D0 ]( N2 B server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' r, u6 f) J: K' X9 ^
& m9 ]7 Q# f! J- z, f# M
memset(tmp, 0, sizeof(tmp));
$ l7 u1 \, A" i" Y+ z# j$ T; R) ^ sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 x( h9 s" L) b sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; A0 S$ Y) H! z+ V+ n: v& R; r- Z
server_msg_send(server, APP_CMD_LOG, tmp);
3 R1 y+ f& r" A7 N9 C8 a, i$ J
9 `- m! X/ _ J S# N9 l6 J, e: F6 c; Y upp_error_count = 0;. K ~' k9 D, ?! i
upp_dmaq_int_cut = 0;" r+ i. V( }' x8 ^( [" V! G. b3 r
// fill in data , R' M( a. Y" {' z$ t
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 }* Q, e2 C; |7 B5 E2 [
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- l9 V6 S6 l5 l8 x0 d
2 L1 m7 B5 o8 C
// wait send success
2 a5 s S% L, j* P7 l while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ K8 f/ d i% C/ Q5 X, q4 W+ m4 K( T% L( ^$ G- m
// make data node in free list
, X# z& `& m; R2 C, y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
: J' J0 j' R8 w" u server_msg_send(server, APP_CMD_LOG, "upp send: success"); X' Z' }* ^1 b' w. S5 O# n
}# d. H5 T2 b: p8 d8 j
return true;1 ?8 y x# x) c5 c
}# |; J& q7 y. l8 H U- B4 w
. l, H1 J M g- {5 c" q
+ W6 \) n4 Q: C* Y
& G/ Z4 V. J' s9 V/ S9 d J
) n7 B( P+ D/ I0 F) R; x, Y* z. H! m q( \
" t$ U4 N* D+ E4 v' I1 e: ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|