|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) v$ ?5 n: L" t) z9 ~
6 W3 i; d8 d3 F7 f n
问题描述:
! m5 c# l) _1 U7 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* `, U9 D5 O, ^: Y' c
0 D, `! z: P% l" F6 D6 [7 A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 x, R( Y6 v' d
: v) _8 D- ?( O7 F0 I测试结果如下:# D# u7 h+ M' a4 f: v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 z0 j' U6 _$ l; K! y2 w6 g k9 X O: `' [% v, h
% O( C0 N' _1 p, l: t. I- Q7 f" B
备注:7 o1 M# n+ |, p8 t3 D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 Q; r2 M8 D, m' v. ]
2、相关代码如下:" P4 q. a% Y' \
//UPP DMA缓冲大小512字节
s" n! l' k1 @/ r6 K#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 S4 k! j# H6 c C& Q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! g6 L, p& H2 H1 h6 M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 z, d7 j: A- A, J) D+ W( k1 O" U$ c. e: s
- f/ V, d K' ~+ J
//upp接收、发送buffer
- ?8 `! ?8 l7 L. {" e#pragma DATA_ALIGN(upp_buffer_a, 8)
5 j5 j N) ]; ]; S+ s5 T#pragma DATA_ALIGN(upp_buffer_b, 8)" K- G) `9 K: h1 I
3 |% x( c, r4 g4 \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 R$ P5 X1 d$ `* x( C4 Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 t; ^2 z* L3 d/ `! N
+ a- u1 S0 Q/ }! g* ~: W) i3 D. a" u. r8 ]
static bool server_upp_data_recv(Server *server)
6 H' a- B+ ?; {3 S! z% F{
* K7 X8 Z. x: n# g if(server->upp_channel_a_recv == false) {) c% V9 W% o ~( h9 R) G ?
server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 b0 W7 G, J' q$ p5 F% Y7 V- u
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( U5 t/ @7 W% Z; v% s
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. N0 s5 }) q! B7 i+ [3 T( L) s) X) z
9 O+ R' N/ D% A" _3 ?0 p+ }% B+ a# I1 y T$ S% m5 g
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);+ L+ B$ Y, W0 B
, Z6 X! X$ P0 w server->upp_channel_a_recv = true;//% Y: ~' g5 l; R3 Q, w5 y* d3 h
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
$ _% k G$ [+ R+ [ server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
s2 v8 g* Z% Z server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; b$ n4 ^% t% f& I( r
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ x& ?: B/ O" _' M* V/ ^0 i5 S% a/ U" u( ]# A
upp_error_count = 0;
5 _$ t( h) u n# H3 r& [- [ upp_dmai_int_cut = 0;
$ \" m S9 n4 ?6 f7 Y. D/ d; d7 d9 R( t
// fill in data
+ ?' h# L7 V/ n( Q uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; C. H& f% k/ ]7 a% X server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- o; Q0 M7 h9 L4 M0 K* S7 |2 b. R }
( _: a( A$ p7 x- f }. R: r! F2 \9 I' l6 a
else{
) |% ^' c4 f/ w; ` if (upp_dmai_int_cut > 0){
3 A& B _) r" d% q# V( v DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" w3 f) o' C5 \ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& H6 K7 X7 U) {& x3 K
3 f K( I, a9 E, @. o- [
5 N% H8 k5 Z6 b9 |8 X4 M- E //copy data to upp_recv_list_busy
% O' c7 F2 o0 b$ a memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 J9 ]: I" S3 @) R$ h: _
- s. `3 w! c' X2 Z; g* v2 R$ S. T
//' C' h L) i$ c/ A& |/ V+ ~& o
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) P( {9 l8 R, u/ x1 n0 ~3 N3 ]) I6 M. X& L5 F8 `
//
7 T3 C* Q3 z/ z" h+ h server->upp_channel_a_recv = false;//
2 x) ]% M" _& x8 F. g3 K
, U$ {2 G8 S. M- T- o( i2 a' r server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ M0 l0 D# E4 h
}
) c0 d* _1 R% |0 I- F/ \ }8 X# E# l# C. n8 \! p( L
0 M4 F0 y3 p% h' r4 p
8 w8 G4 K, ~; h0 f3 ]% P return true;; w% g: s% O3 M6 J1 T5 i8 q
}- S) h- K6 u/ h5 t5 \
/ L' ], y: N4 }1 e% zstatic bool server_upp_data_send(Server *server)
# d5 q# K6 |6 J7 O; H$ C% H3 a{' D3 R, [) }$ Y6 P) _. m9 s
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 D( a! [. N. c& r) S% w DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# q. j1 A/ T+ p# n- ]
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 W( M8 v" E r
char tmp[128] ={0};
$ V# v( ~) v! _7 N4 r
* a6 E& e( A7 S( ]0 `3 l% e server_msg_send(server, APP_CMD_LOG, "upp send: start");% V% r; L' v4 ]0 |" d5 H
print_log(server, data, 64);$ o7 ]" |. {$ f: o/ R
" k" @- X. q; Q //
$ r) w5 o/ f( r memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* I# f+ ?2 c+ ?- _& q8 `- ] memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ R+ y6 e2 v, ` print_log(server, upp_buffer_b, 64); @' O* S5 _ d7 R! l
* }% Z# w9 f/ t" G/ [ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 a# @$ a' `$ ?( g \1 Q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
3 A$ y# G. F9 @, b; @ K7 y server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;! T+ g( ~/ N: x; ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 W% Z, l1 D+ c- ^3 {% u! L+ f6 C2 j0 Q
memset(tmp, 0, sizeof(tmp));) G# b# a8 `6 f' y
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " ?+ H4 a5 _ {, {
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' [1 j* ]! \4 j" j
server_msg_send(server, APP_CMD_LOG, tmp);9 y0 F+ l j0 ]* w6 K9 ]
4 t z) K, R" L
upp_error_count = 0;
5 ]- x5 N. e2 H% t6 A upp_dmaq_int_cut = 0;
: u$ e: V* G# Z1 g3 q // fill in data % P% E' _8 W3 h
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ' z" U9 r, D3 J/ l" u
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 K6 t! U- H- ~1 o& h9 u1 i; H- x) H) V
// wait send success! K" t* {. o& l
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( v j3 `- t, \* w" ]8 o* T6 L6 d' ^" _8 L+ B4 r
// make data node in free list ! a- l% v& W! K+ h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 u0 x/ s# ~5 G) _+ s0 u( e server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 ~5 s5 ?, h, N0 K }
& P; f. ~0 ?( e return true;; L2 d2 M. ^$ }! k: v) M
}- O: \; u3 o, P7 x! H1 p
; A) Q5 i6 A. v, V5 m* x/ M2 M, t, k
h# w: J e/ {: E8 T1 v4 ` ^5 |
& _* u; t& {) H/ o0 o& a1 b
6 {; A9 x7 p: O" w
9 j7 Z) r7 a+ t R0 a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|