|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' N( t1 J: ]4 _1 d' W3 g) e2 _( }( Z6 R$ _% b
问题描述:) u' A) L, T+ ~6 k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下: y0 Z7 |6 q: F4 F
7 F0 l: j! P2 `* k; o' z' f1 L( b9 t( p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 |0 |5 [7 Y0 }% E4 z
. W- B7 }4 i9 V测试结果如下:
: t4 R5 S$ [! K% Z9 U138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
V6 O+ c1 {' o' L8 W
1 j% q# i: X: V5 r5 X9 `
7 L, v! B. L9 ?; ?9 {/ t9 j备注:
8 I2 P" q! p: K5 W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- ~* b0 G9 V2 F$ \& e, G4 \9 _$ \2、相关代码如下:
+ A, j0 K5 x% V. t//UPP DMA缓冲大小512字节
5 w9 X# E) D O8 c1 a#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, s/ b3 ] X" R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% I6 v8 R! j d- f: e( ^) z0 C3 ?3 ]
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 a5 t2 H& p5 a/ j
8 w0 n$ w6 V" u( ?) d9 A9 ? T3 i/ _, D
//upp接收、发送buffer
1 F4 i* H: q" T#pragma DATA_ALIGN(upp_buffer_a, 8)
u& w7 v0 Z- |5 V/ G#pragma DATA_ALIGN(upp_buffer_b, 8), D- q/ p8 ]& c% x
* M) o: D8 \! C9 \6 V5 p ^6 w5 e- d, @unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. F1 C3 F% J4 S3 I Y: X1 v. [
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, [7 o' l( U, Q7 _
. U8 x* `1 m* N3 {. s- |1 j6 p. C
9 x# ^: v5 @; i. istatic bool server_upp_data_recv(Server *server)
- Q2 G o4 n7 h4 i- k H{: w6 w' [3 u7 D1 y: T6 x8 \4 a
if(server->upp_channel_a_recv == false) {) I4 n# A! y( P, s( N0 X" }" o- ^2 o
server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ C. I) X4 V) \% P/ b
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, ?) g$ k% g6 S% s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# L" Y2 ~5 W1 i0 R4 o: J) ?6 R' S" S4 D& X: f2 ]( }
, c) |" S( F k memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* X# P: n1 V2 ^2 h- B6 _& }
p0 G! c0 m5 A' z( f! b server->upp_channel_a_recv = true;//- S) i* D t; w% M; W
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. y+ k& o7 r# T server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;/ [0 S9 Z* J/ \7 s. `9 f
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
- P) @1 R/ g; f; b! C( x- \! M server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' Y7 F; Q$ B8 B2 `3 `. d7 U4 |' `
% |5 F6 \: m/ b upp_error_count = 0;
( o- y' t; ^1 u8 x6 p3 U upp_dmai_int_cut = 0;) F% B! u# P8 _0 p* |4 ?) n
! n: @) z- `2 `( H3 T // fill in data
- s' r" {! l; ?" [/ V/ m1 j uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) ?" k! E( P" \. w$ d
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* q- f& g. I# h- |. t* F) X }
: h! B7 i7 X H4 `+ k }
% l# [& ?0 A' @ else{
, W' ^$ q% i" s: h9 p if (upp_dmai_int_cut > 0){
4 [; _8 W1 N- h DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ a% X( [. j4 ^" r; Z. F
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: S1 Z$ o+ f! \5 @7 {; Z, F" c6 {$ W& I; ^1 _( t. P
. B* r- j* l I r //copy data to upp_recv_list_busy! ~1 W0 ~2 [4 l, S' k% A& l
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 j$ Q3 }! M6 ^7 G! e5 z4 B5 q
& J' U3 B" n1 M7 L z //
6 g) D1 u% @' K; U1 C- z) ~* G ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) A) G1 b2 ?4 i F! D
/ [, {3 M7 K; L; B3 N4 [2 T
//( X$ q: v- P5 `8 M
server->upp_channel_a_recv = false;//
) }- ~# x8 X1 h* ~7 U: U2 T( H+ t4 ^$ P, {' C
server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 M7 T5 f& @5 ]) B' D. J
}6 b! V* S& e$ o0 R. m @, f
}
k' e/ Z& Q; X8 v% Z
9 ?' b! y* a* X" P
. m- Q2 |0 u$ a& s: D return true;
" I0 y2 D' |$ R' x, x} [* p& P/ J' w8 d! [7 ?
9 L; P! F# c/ ^
static bool server_upp_data_send(Server *server)
! i- o* X0 ^# F r{7 ]3 K8 q( b# ?, f. [% K" a
if(ListMP_empty(server->upp_send_list_busy) == FALSE){5 I' ?8 t! o' U" [9 F6 C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 H' q. d/ P5 O8 d5 k
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. a0 J0 B G7 [4 g9 s4 _" u2 F
char tmp[128] ={0};
! G$ k! h. O3 o1 O# r
/ v$ }+ y& h1 _% r- b& k/ S& A server_msg_send(server, APP_CMD_LOG, "upp send: start");+ w/ h. R' s' R# j& v1 l
print_log(server, data, 64);1 T1 Q o4 ~1 E: b: @! v
, E5 |, {' W, M- j5 V1 x //
' Y3 b; q& _6 r# m memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; v/ B" Q _0 E4 R8 ^( Q, Q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 |/ A( G2 g% w' e& M print_log(server, upp_buffer_b, 64);
( y: R$ D6 }- @. w/ i! D/ h8 w& v9 z, Y0 ]
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
0 W0 s* T0 B. F* v& ^; r: E server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
- B" f8 d$ K( [1 l server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;3 h! B- j7 E" v
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: O! v" g5 M7 b+ W% w
' C9 q& h5 M# _. K8 T
memset(tmp, 0, sizeof(tmp));
- H2 z4 e6 O Y sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( s+ j- }4 c: G/ n# Z# |
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ f0 ?. J$ ^ L2 L' i9 Z9 d
server_msg_send(server, APP_CMD_LOG, tmp);
R1 K% V; o* P/ X( {( P: s. z1 u# `
upp_error_count = 0;3 U8 h# [# Z, G+ _# V8 g+ T3 X
upp_dmaq_int_cut = 0;
5 Y2 R- j& I* e- n! g7 b // fill in data . X: y! U2 S& W. H! _ |: ]
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / D) O( \( C" w# g |
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");: P' i4 q4 R' N/ Y
1 m% s" x2 ~( |# R# F, T
// wait send success
7 d% b0 q, d6 c6 z- U1 X! }6 S( F3 o while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 X( M: C2 ^0 z! O; d
9 o0 |( Y" n0 |- b
// make data node in free list + t) l v4 V) C5 }" Q
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- ]( c# m' {6 W2 p6 i* y3 ? server_msg_send(server, APP_CMD_LOG, "upp send: success");( ^) T- U% Z3 R3 b- q" D: R; V" y
}
- w( ?1 Z; J# S, K+ g& y% |) J8 X return true;3 [2 H0 I( _8 v: @& o+ L* ^% J) T
}6 R+ r3 R( O O5 u
2 E% z3 W, I0 C( b! f8 L7 B) c6 b/ e" F7 m* i _: E6 s* O2 [( l
) X! ^) M. X6 K$ z' c( q
* x5 U$ a) C A- e: X5 F+ w. Y1 ~" i% o
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|