|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 V6 [8 O2 i6 Z* P* D: }9 r; Q
4 S+ ~( v% F4 O& o问题描述:
8 V! P- W; ?0 {# i/ N; b6 g4 d2 p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" s4 \2 Y% D' `/ ]+ ~! s9 a/ u" U7 \( o5 Q) k6 F9 C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& |2 s! i& S# l% U% ]1 A
* Q6 V# ~/ w/ \" e: j5 u测试结果如下:
. z+ z+ F, `. L9 K k9 |& C138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 o* A- {0 Y9 k/ l$ h
5 r7 g" l. G+ X4 \1 w9 l) k
5 h. L }$ g' Y3 H* }6 A& s
备注:
: h' J! d8 l. u( u% l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?/ Y* {7 m! z# ]6 i& r
2、相关代码如下:
+ S4 J3 k0 z0 Z# Z+ _# l//UPP DMA缓冲大小512字节
% `+ Q/ k( L a& v9 F#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 `* C' S0 m' w& b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT g( x# ~2 _& p: d7 K, z
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% k/ M l( Z0 F, X; b
' {6 K( w7 a/ t3 R+ t2 D! A$ W( Q: W8 i) E4 Y$ M% h
//upp接收、发送buffer
( L3 `5 v1 h" _/ Q5 B5 b2 }0 q#pragma DATA_ALIGN(upp_buffer_a, 8)5 H; W) ?; ?, O
#pragma DATA_ALIGN(upp_buffer_b, 8)0 F9 ?: F% d* q: {8 Q" ]% o
1 }: h0 r( P3 `" G. n' B
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ h7 w q* l! E) J) g `- Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 g( D& O+ y5 v- p7 `2 N& x
. R$ }+ l& f8 Z! Q
* q" ?. { D: I& ^' u& estatic bool server_upp_data_recv(Server *server) ( }! @4 X1 h: n" ~1 i O
{
9 ]$ J: Q: r2 [# K if(server->upp_channel_a_recv == false) {
1 Q* d# A# c2 y) Y4 m0 O5 r2 W2 F, z server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 O3 G0 u( d( e2 m1 \4 Y+ T; ^) [
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 C8 m2 X! X" ^; c8 ~) B; V0 ]+ q
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ E6 v# E. C. Q; X5 J
: y( @, Z4 s) g' m* i9 l# R! n+ \) U; j/ q% |2 g
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 s+ T6 L0 |" C5 `, H3 a C
/ P3 I x" Q, C$ [: u( @ server->upp_channel_a_recv = true;//! i; h1 n- `: L
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
' [ C% X6 i. V& ]5 E server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 A1 v: T0 u; I n4 |6 o
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
8 t% D; A# o, a) P' | server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 x5 |$ g8 D$ |
. l8 D* _8 f; ? upp_error_count = 0;
1 ?4 w9 {% u" ~ upp_dmai_int_cut = 0;
5 n! u" I2 g% W: f/ Z8 @3 R5 f
$ _- o' ^# s& b8 o // fill in data
- l9 \- H4 D# N- [ uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% E( ?/ y9 ]2 Z' j5 E& T$ Y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 t: t6 q- ^0 [! P/ J+ Z
}' L6 \, R' H- X1 c2 |' B
}
6 l( ^8 `6 [' h+ ?4 `+ o else{
7 v% ], w# ~+ r/ B& _$ L, V$ d if (upp_dmai_int_cut > 0){
, G$ {! E& r4 | DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' S& D. U7 T: C: M7 r- O9 v
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
2 s' E9 N' i, K+ k, A. ^
# D' H2 F) t& n, |4 z, b2 w& J8 h
" z e) w1 _" M0 s9 ^% E; p //copy data to upp_recv_list_busy
+ }6 L6 L2 }- G# J3 q8 r3 w memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);% c% @$ S7 ?1 s8 q4 l0 N
# W5 j' Z* s: ]) O/ M% h //5 O( I: W+ I% [3 X
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 {( n" H: T- a$ Q+ D2 Y
; C1 s. h) N7 C* j2 Z* o
//; N$ J+ I' @) G
server->upp_channel_a_recv = false;//8 Z3 W5 r; X0 H7 V* e) w7 ~
# v) `9 O3 `/ C: H1 H* g# F' z server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 _1 Y$ ~$ a. m
}; {& l7 Q1 U# W/ M5 U
}
5 A! a; B. w/ Q. F2 ?7 N" R2 A4 \* R
3 U( G% |0 W6 L
return true;
5 c7 o9 h7 d9 \1 W6 s; ~( J, k}
; U. L. U9 j5 l, N+ P0 Y9 s
& v% d2 h5 x9 w: {" M5 K; Kstatic bool server_upp_data_send(Server *server)
* [' r9 ]8 t, E1 S9 C5 I{! }9 ~; T- v" k4 J) E: C: \+ {' v, q
if(ListMP_empty(server->upp_send_list_busy) == FALSE){# v8 O. _( j H' M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 G4 f e* V+ L3 q1 Z
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
& W9 O% y: N3 V char tmp[128] ={0}; j4 j: ?* K0 g U
8 i5 ~. `( ^) i. v# s3 {- N
server_msg_send(server, APP_CMD_LOG, "upp send: start");: _3 b, a# T2 @& {2 O/ e/ S2 ?
print_log(server, data, 64);. z: e" I9 w2 |9 a5 s ]
9 X' {/ n& E; q# K* Y. ]) ?0 j
//
! t- q P( |! J& c# j memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; y3 N X3 _& M4 m9 i7 w; s
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 u. s6 A, [- n$ T. M print_log(server, upp_buffer_b, 64);
3 B$ }, r3 Y+ T- m
0 E; m2 V" `9 H+ A2 U7 h% P server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);; D0 t* T+ G9 P6 G. C
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
1 y* c% R: I: N' f2 i3 N# Q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
7 Q# c5 r+ z! l$ F server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, _; l6 }% F0 {8 k0 k' U9 x0 G8 Z+ g; n
memset(tmp, 0, sizeof(tmp));
# d8 Q( [5 J7 ?6 c% F0 w" c sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: [/ s0 M7 k. A. Z sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& F2 Y1 a- E9 K+ a# ?3 S7 F server_msg_send(server, APP_CMD_LOG, tmp);
9 M4 ^6 O& K- G+ o7 g, G1 C& \6 w. `' N
9 l$ v% [4 o* Y' K+ l- P( ^0 e upp_error_count = 0;
/ Q6 Y. N. `" R: ?9 x% ?& R upp_dmaq_int_cut = 0;
0 h( V: {0 B- x- n- o, Z // fill in data 3 k7 i, b3 @- p
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
( h! a& {2 w' n* m" T! k server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" M2 f9 a; o2 H9 n
! n A0 |* z( [" f/ d! m- D8 W
// wait send success; q2 Z: t, ~; T7 `
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); c/ t* X; [+ A
: G9 b8 q% L: v4 g/ ]( S // make data node in free list 1 {, _1 }( b2 E2 W7 t" x6 c6 n
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- p% F1 E, [5 b# W server_msg_send(server, APP_CMD_LOG, "upp send: success");$ _, F6 y8 Q; U, N9 n6 n
}8 L, O5 P8 @- q8 x, K" a6 q5 W
return true;
3 A B0 w4 M6 k}% }7 N' ?0 W5 n9 P# o% _8 ^
( _/ s5 j4 W4 ~3 u$ ^4 X
# x- L1 T; x) y6 p$ L; j/ S
0 i$ d, ~: G8 F% m2 Q
4 z" f) u7 T2 N3 B7 {. H* y% S% L* u) }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|