|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" T3 ?! ?1 R& X/ \1 s: V# @$ e" `( m
问题描述:- m% \6 y' L& b1 Y4 @, J8 w
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" `6 t7 |# }$ {; |/ I3 i
) F5 A8 ^) I; Y3 b+ s
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
, `: ~6 D0 u; E7 I" u% Q3 V/ C1 c$ i( A$ P3 D
测试结果如下:
; S1 Q; g( o+ M4 {. E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 f) _, b! I" ^# ]1 L: |
& |- }0 o, [! a: T3 e; Y. k1 f# c* q! r
备注:0 A- K; |/ h' E' `% w
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ P+ @) t& H2 Q4 Z V, Y6 E
2、相关代码如下:" V) C$ B% J( ^* U9 E$ C
//UPP DMA缓冲大小512字节' ?- B2 s l9 [. c1 P+ {8 v
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 o4 O& Y. T, v# |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; I8 k- G7 D& q) S, _4 B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ O3 m' `4 ?* G5 j$ o7 r
+ u1 d$ y) f( x5 l% h! U, J T( X4 T
//upp接收、发送buffer3 b( {( \$ Q m
#pragma DATA_ALIGN(upp_buffer_a, 8)
. }' Z4 R9 g& I8 F#pragma DATA_ALIGN(upp_buffer_b, 8)+ c8 m1 u. d; o2 g$ m
7 S: C9 m9 X* \, ^8 z. n& S/ X8 L) e
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 _7 p( o& a& A7 e2 e- z) z1 W2 x: ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ P3 |" _6 W4 O9 Z1 n" ~% n
% G* e; E1 c- k9 U: }# X6 O B1 L& Y: j4 r) }( e8 C' }
static bool server_upp_data_recv(Server *server) d1 l# O @* M" o& }# [
{
; b9 O6 ]. L. K3 g- E% O2 _ if(server->upp_channel_a_recv == false) {3 W' |0 U' Q6 f: v3 y
server_msg_send(server, APP_CMD_LOG, "upp recv: start");# [+ \; o5 O2 ?7 E: _/ {
if(ListMP_empty(server->upp_recv_list_free) == FALSE) { n: g; J" @5 r" L4 U- X2 j
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) K0 A, ], G5 X& e6 a O9 u) ?2 D3 }8 M/ }) T# p8 _8 T9 Q9 z
! U0 L& U0 @; |0 ?0 Z1 v$ R, f( M9 x
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 x# k8 G7 S6 o
; t. d. G+ W# U% q# i& t server->upp_channel_a_recv = true;//" S1 f) K6 P! @% z
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
* q3 X! b p" }8 H4 {- d8 Y server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;, ^0 D5 w3 \- K% R* K5 F- p8 U
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
" E% S. B- G2 C3 l* Z server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( l1 K* R. M+ z: D' G$ l' L
9 G: o4 j% q) R" n
upp_error_count = 0;
7 `* h# i) T8 q4 I, e% C3 w upp_dmai_int_cut = 0;
# X: N1 o. v1 Z6 ~& S, N, B( M" T- \9 s E* \
// fill in data + f, Z/ c2 o/ o7 F8 w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);7 {/ j5 @: b. J9 L. @
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# Y; P" i6 ]( q" I9 m2 k }' Z( P( u; I: ~$ v! x
}1 ^2 }+ S' I F, K# g$ r) e
else{
5 V4 ~2 \( Q" O# @/ b if (upp_dmai_int_cut > 0){7 `; J! M7 R9 u. @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' a3 D6 @3 a& M( U- u/ B' o. _
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 o( Z9 b( H& E; `" |9 x
" @7 }5 o7 K D- ?6 d
" h- Y7 {' J' W$ R" w //copy data to upp_recv_list_busy
, d, z6 l: A: s" I# U% ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* \1 Z1 A- W$ @0 V! X4 r& @% {; R$ \9 E- ]- ~ b0 R5 f
//' _: m% ^2 M! g: V# @, F
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 q) l& J6 z, U% H
5 |6 ^0 j( q5 E3 r G% ~) b, `
//, s# X: J% L' K
server->upp_channel_a_recv = false;//# F, a; _* ^2 [6 Q$ d5 ? u. }
$ r. ?: n: J+ d3 { server_msg_send(server, APP_CMD_LOG, "upp recv: success");. h( b8 _. s# m! F& b
}
' T4 P/ C, K6 y; c; _- c2 v! f }) k9 O( d9 u" R
0 P* l: K- H1 S/ R8 b- o6 `. {2 D4 F6 V$ G( W
return true;4 C' F9 q' r @; q. h' y- V% `' R |
}+ ?, c/ G, R% h4 V: r# \7 r, ?
" U+ i8 D! F, Q; u
static bool server_upp_data_send(Server *server)
$ N$ k0 R5 S& N{
( @( l( m E4 u2 c& ]5 i if(ListMP_empty(server->upp_send_list_busy) == FALSE){' L8 o q: s" C8 q7 Z6 C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 D6 R+ M7 P' E2 W unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 r: W+ h/ _; h9 A& F
char tmp[128] ={0};7 ~: a7 U& d& L4 f3 a+ ], J
, ?4 q( @: G/ `% z) J server_msg_send(server, APP_CMD_LOG, "upp send: start");8 t0 G: N! E* c" i) K4 p
print_log(server, data, 64);. |$ n% G8 u5 s- A4 a
+ ^ M% X2 ]: j( |6 j //; i0 b. w& x: ~ |' u
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 A" o" n) N/ D1 E' x/ T
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- A3 }4 J( J2 L3 E+ E$ ]/ M print_log(server, upp_buffer_b, 64);1 k) j% E& D- m
1 N2 a0 I3 ^ Y5 S: @# p& ^
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);$ c, S3 c& R% o1 w& j9 K
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ' i7 D# c: y2 P3 J7 Y
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;4 p9 Y; ?$ P5 N' d1 E
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% L5 `+ m) t T3 H; R2 S! Y$ Y* W: t u9 y# y/ @
memset(tmp, 0, sizeof(tmp));# y! E3 C& r7 b8 A4 R/ R' E
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 H# e5 B" m0 s* u1 K( b sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 O8 L" b1 Y) g& e9 |5 E! z server_msg_send(server, APP_CMD_LOG, tmp);
* Z: v" e) C+ Y9 s& z' A" @ d8 i3 I& j# | u
upp_error_count = 0;
6 d8 d% n" E& ^- x0 d; C upp_dmaq_int_cut = 0;
6 b6 X! \; B- b. e8 b* I$ H5 l5 ]8 Z // fill in data & s6 N" n8 C, q; p
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & R( Q0 R; o s
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# f e2 a5 ]+ x2 ]
' m! X0 V* b" B5 S // wait send success* s& l- f+ u5 O: w4 i+ I
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * i* T4 M1 v* ]% S
) `8 W: k& c* v0 D8 d4 v2 M% B // make data node in free list ! A) W* x3 b& M6 q9 B! ^
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# s* k$ ~1 _( Y6 \$ W% @# M server_msg_send(server, APP_CMD_LOG, "upp send: success");
) d; B& r- F/ l! E5 h! Z+ q) I }
/ Z! _: l0 m& X: z6 T return true;
2 X0 @. S0 T, T/ `3 p3 v}, z y% c' f/ B: f: y! w
6 @. |4 V2 H3 G) f c! y1 B: }: K
4 s7 _7 j- C+ p1 X& f+ {# }! p: Q' @1 x3 z
# x: ` R2 ?8 Z$ f( V9 g) |' S( e% s1 a
* C+ x; @8 T9 k1 K0 f |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|