|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" z$ _" I7 ^7 S9 o4 d
8 ^/ ? a1 ]: b问题描述:
: z; k/ n: A) @/ D5 h! D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 b* G# c% K4 n
" @' F# c5 `" O0 I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 O; r, Z* {; o6 J* k% ~, ~
$ p$ x1 G% h5 @! `- H测试结果如下:% U$ Y1 z! B; z, y- k) n, Y( N$ S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* x6 y- P9 I% J! ]8 A( u9 k
& e( X0 q/ `8 w) k1 l
. o+ N$ z! ^3 W8 \! t+ z备注:# d, f3 @" ~7 q3 K* ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' T( X- ?1 L- P- F+ ^8 |2、相关代码如下:. f q' n7 W: T/ i/ |
//UPP DMA缓冲大小512字节4 O8 Q+ a7 ]4 m/ d
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 C) ?( E# J' L! v1 X* {
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* H1 X8 W2 V, [5 \# n3 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ E/ t2 j. @+ U
! f- \; Q1 s% |
0 p! X4 Z ^+ C0 r' {' A//upp接收、发送buffer# n) \( ~6 Y2 M1 k5 @% E: t
#pragma DATA_ALIGN(upp_buffer_a, 8)
+ ~6 }/ I/ B& w9 f9 w. W+ r#pragma DATA_ALIGN(upp_buffer_b, 8)
# S8 g9 b, N. ]' H, V
7 ~" P, o6 n+ B# B- Z3 g) E+ p1 ^, runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 ]' p' g& S. @5 G; P+ Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 X( }* Q1 F6 {* Y2 o- {& O6 H0 e3 ^" y+ |9 j8 C2 S
5 B$ @1 v% O4 A
static bool server_upp_data_recv(Server *server) " B" D% v. O! @9 o% r, W+ \
{+ K. E( y% X2 C
if(server->upp_channel_a_recv == false) {
/ x5 ]" Y3 N' D server_msg_send(server, APP_CMD_LOG, "upp recv: start");' Y. t" t- n. l
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 V: Z0 u" K1 \+ s! v X
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. T# {: y! X$ Y! Z; Q$ G2 q! U
: \/ u2 G" k" v2 x- Y+ t- g+ p* [
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 | ?+ C" J! n, D2 K7 n
- I# K1 _: r2 L; I- b4 A server->upp_channel_a_recv = true;//% H' }) k1 g Q, Y3 O, r
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 K$ P1 q) M* d$ e) t% |2 ]7 Z- [, \ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
: b) Z. V/ }8 O; j7 R" N# h: s* P server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
0 w, b j2 E+ y( J+ |7 @ t$ ~, H server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 q; t& |( h# y. E) f! `
- {) F& s& d% o4 S9 h upp_error_count = 0;* Q, `9 m9 o6 p$ h: _ P7 Y) J6 c
upp_dmai_int_cut = 0;
. O; @6 r8 W! C/ p% H8 Y
/ S; J. q, e% W: y // fill in data 7 e( w4 R7 ^2 P) Z, v7 Q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. C0 f A6 s+ @) E2 U4 }0 ^3 s server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! V5 B* h5 J1 G; S! p" x }( B4 }6 Z" Z8 Q) H; W* [- Y
}
( o8 D( q" K2 d4 y" N else{8 x+ ?" |4 P* d0 r5 n
if (upp_dmai_int_cut > 0){
, \7 f9 Z Y% H2 ?/ p DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ m, c0 J$ _ F0 i! c* X" t x: P
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 ]' c# @5 i9 G/ s d+ O; Q$ j5 A* p! b/ B3 h7 l, l l! Q
( T$ A$ C: Q9 R
//copy data to upp_recv_list_busy
2 D8 K7 ]7 L/ d# E* h3 A; }- h* h memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 n a& K% S# O+ A4 U; w
* U. C( `' |! k7 {- _8 l; U
//& i. m5 g4 Z1 _/ ^2 g' w) H7 V
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 U H: y+ L$ k' k1 A" {5 R5 s
0 K. {$ H" H: l4 ] //
1 X+ F( U- F! j; `- l3 Z server->upp_channel_a_recv = false;//% I8 |- H) V( h) q
* g; H9 z5 K+ z server_msg_send(server, APP_CMD_LOG, "upp recv: success");# r( o. p2 J! u& m+ t
}
& O; c N' `* O U! m$ T }
/ l; }( q% a& i5 d+ B
2 `; w! x) p1 Q( f5 V' ^$ X8 ^' L1 q' ^, U2 @9 p
return true;# J0 Y- l9 C& ^7 S R7 w! ]+ n. P
}
* Z& z% w. y+ K; Z1 X; J, }& A( _5 C# Q* K; Q* g
static bool server_upp_data_send(Server *server)% C# I; P" X8 ^/ Z
{" U" o) ?+ g( L1 {) J3 X
if(ListMP_empty(server->upp_send_list_busy) == FALSE){) q9 G& t: G$ f3 O9 |0 a& E* D
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" J+ |; @; p2 O0 ] unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: w5 t: u; }/ O char tmp[128] ={0};9 {# n3 B1 f6 ?: e k& z3 Y) E( ^/ ^
$ @5 | P: L& u( D7 m* ]" \
server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 W! e1 G8 K. M! Y* m: I print_log(server, data, 64);3 v; p! ^+ x, W1 U0 Z4 n1 m
0 Q9 w0 {* E) D; l* S$ W) E
//
, l0 \; D7 [) C memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, {7 K* y) p/ Q4 E4 J6 R
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; ?+ W/ a) [1 d
print_log(server, upp_buffer_b, 64);4 O8 l6 g! P$ N. ?( Q( m% ^
( v$ z3 r. T, K! m; g' r$ j
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);) O% b3 k1 B2 T2 A: ^; G
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
" J) a! H/ I! R9 v* p; p server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 n7 o) A. }- G* r
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: ?2 \/ m6 q4 D V
% k N6 W# N1 E- H2 M memset(tmp, 0, sizeof(tmp));
2 J) c! X1 P: ]( C. R% d sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) `. M7 n: i1 n$ Q. u. ^* [, }, E
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 v) y' E* Y* i. z+ X server_msg_send(server, APP_CMD_LOG, tmp);
: i2 L6 _" ?; u W$ O y# x# L! }, ^/ P- s+ q
upp_error_count = 0;
; r* C8 l2 X1 R, o4 u H upp_dmaq_int_cut = 0;, L, I% z& _4 V2 T7 a1 C! E- o
// fill in data
2 i3 L9 I* W" b uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% A- Q1 Z5 a: Y$ L- p5 } server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& t7 C, y$ P0 z8 o
+ E6 J7 m. w# R' V( V) [; P F // wait send success
; Z$ V/ |' }! L( p) g) t* x0 g while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : I! H0 R2 R' u* w. @* K+ v
( Q( M; e5 S& T4 m // make data node in free list
. W7 Q% F9 g, h ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- i2 u1 J& I6 j' N8 y8 B R# w! Z" U/ c3 I server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 \# C+ w+ e/ D3 P2 x6 m }; K1 \ y; Z6 A# h0 V4 z& o
return true;4 h- H; c' u! J- g
}
7 h: _4 o7 |9 J" Q* W: p" L8 j
. C- g4 B' A+ ^
1 E) |$ l9 \8 g4 ^! K+ }4 T$ K
/ q' U' E" F# R: `: }
9 {; D, `0 {4 e+ n/ g2 y o
3 S" A" U1 L0 u# l" y6 F; u |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|