|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 m8 G% v% x' v6 ?/ u! |6 v- n( A, d& i
问题描述:# T: t; Z% y' w1 I; s( F; {
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, J8 D K5 \/ K/ k7 G" I, d I. o: T
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- }' I7 Q" v8 y1 g3 Z; g& c' N. A/ ]
0 J1 D0 B, `$ _; ^) h7 D测试结果如下:4 A! g/ h$ w4 B* \2 z* [8 c
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. ], l- z2 X \( I4 A1 f2 _* k" U
- O) J/ T: V: h" n
) S# z, L6 g" t备注:
" {" ^4 f" C+ b1 z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
3 }9 S& z( s+ D) R5 j- @2、相关代码如下:4 G3 z( Y; Z' ?. f
//UPP DMA缓冲大小512字节/ A/ S4 [- C# Q% F6 I
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍 M$ ]! `9 h) ~7 j/ z: r$ l/ H
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 w% b/ S' s0 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( v" R4 {" \7 K# d2 H
& W! O& Y! m! Q. \
4 u0 \0 `% J S
//upp接收、发送buffer6 b: {# e% G8 y/ C* o3 i
#pragma DATA_ALIGN(upp_buffer_a, 8)
/ q( P) i1 ]) E& h#pragma DATA_ALIGN(upp_buffer_b, 8)$ d* Q2 f5 x: Z/ g# d
' x- y6 f! d+ ^, u$ k' i' Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
( L2 G5 l9 g [& Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ W8 R8 P9 @' H! | Z( U' F4 ^$ d, h% h
7 _* O) k. d: b* @static bool server_upp_data_recv(Server *server) & e7 c' M7 Z$ c; a( C! r8 u; l
{ W( S- U$ B: W$ q
if(server->upp_channel_a_recv == false) {$ a1 y; @' M P; E
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& r! g0 y' A& A8 S( f/ R4 ]2 { K if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 r0 t7 j. u+ _* e8 b7 y' _5 G server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 {9 l; C" U! b1 g7 h
3 q) q9 a" L: ?$ Q. y4 l
: k$ ^* C. n" l memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: H# q; ~' @" v" B+ ]/ o; \, r E/ L5 J) l# q- |
server->upp_channel_a_recv = true;//
8 N$ A) G0 v0 `- Y$ P% O$ a" H server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 g( y5 ]* V2 E. T/ }( r6 _
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
! k# T2 I3 o" } P8 s: I server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;3 k8 H/ v. R( P
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ v/ X+ d$ p: P3 u1 x4 _- Q5 F2 e b8 t. L2 H( D4 |0 n
upp_error_count = 0;+ W' u4 n0 w6 t3 e. Y- k
upp_dmai_int_cut = 0;
& }) j& \! Y% w7 A0 I7 N
3 q& ?$ i% [+ X9 h7 y // fill in data
! V! [2 k5 N( m$ S+ P- Y- c; L uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 D/ } q' T9 Z3 T0 r8 M
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ `* \- ?( h8 z7 G4 B4 Y3 A
}4 y0 d/ _! a; ?" v' P: u* |' u6 b
}
+ ?2 Y4 W0 j! `4 L1 b k0 k else{2 i8 H2 @3 ]1 E" S2 A
if (upp_dmai_int_cut > 0){: K2 R. a5 t+ f+ `; Z
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ i# G; e+ m$ G4 z Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, u8 q, E$ t4 R# b$ Y/ h0 H# u
, ~# ]1 q+ M2 V% u2 z$ {, r
8 y8 }/ q }/ a W: S //copy data to upp_recv_list_busy) s9 \' f; Z7 _) s9 a. c
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) N. F" U7 i8 s/ V
. k; I1 n. M: ^' B" n8 U
//6 Y6 H+ l5 V$ e* |4 v
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 N0 p6 [ k* K8 i7 R+ D% L5 K) X" ~. z! Z& a
//
5 \* z5 l& e, d; H4 P$ _0 O server->upp_channel_a_recv = false;/// B* d- N' o7 n2 D6 M) N
/ m9 p: Y- {" y6 K) P* ]3 t! J! p& r
server_msg_send(server, APP_CMD_LOG, "upp recv: success");- x+ `+ G! ?, L9 Q
}3 C, W& C# A2 K
}
% l! F) G9 q% \8 q6 ~) m* h$ J/ w" R: u9 @) J! t
+ l7 V/ I! Z% _8 C' E9 \' G
return true;
* e" m. L3 D' T}
/ p( C) B/ [8 f% F1 i/ m9 F$ V8 s( m; W' q. g4 p* d- M
static bool server_upp_data_send(Server *server)1 _6 ^' d# E3 }& m
{
$ m; T8 o" J) d B6 E( t if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 T* { w* ^+ k
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
. O3 o3 o( t$ f p unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);8 w% n- G7 \9 \( v3 D# L
char tmp[128] ={0};
! N; V& s1 z `2 O* u; ^* U4 N& {/ b+ u. O/ V
server_msg_send(server, APP_CMD_LOG, "upp send: start");; {* E8 i% ^3 j
print_log(server, data, 64);6 j1 Z6 O- e% R
5 Y) v9 }; K+ `+ f7 t' ^5 T/ v% h7 l
//
2 U+ ~0 U$ B* `$ \% W memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 M+ ~9 o! u5 ?, R V* \+ g8 U5 F; ~ memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 i/ A* Y; S' U( Z9 C. M" M4 f! j
print_log(server, upp_buffer_b, 64);3 i& l! n* e& n$ n
* S, d9 j7 w' b2 y1 o2 e9 [ J
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ X% i: N; D6 E( |/ n* g) b server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
' @! g: Q I) I! M1 R- O server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;7 W) g& g O, i, ~
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 m- _- a! o6 r {/ t6 Q, H
8 Q2 h O* u! J+ ?, ~0 Y U memset(tmp, 0, sizeof(tmp));
/ ^) o/ P/ X3 Q2 t9 X sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
* X0 |. Y: f; \) \! A sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
s% X% h- P5 q; q' @ server_msg_send(server, APP_CMD_LOG, tmp);" J- E) S; ]8 O6 u' g) K l! r2 [: w
4 {/ L9 Y2 a& V6 G% P" t9 } upp_error_count = 0;
7 H. J; Z, o! }; w5 J upp_dmaq_int_cut = 0;
* x& X L' x8 p F3 C // fill in data - @3 t/ X) i1 E r" O4 A8 Q
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 D: s; M/ f# e5 w- G+ t+ j* a server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
4 V- E8 E8 a9 P! G9 `% S: C8 J+ Q2 ~* r) Z( f- i; X$ Z
// wait send success( U U; }7 j& P- f+ ^4 K
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, `+ D5 ?6 F) @: F0 R& }. Z# d( ~1 N9 n0 r2 u4 T5 l4 K: M# `- r. @
// make data node in free list
+ ], ~5 N9 A t. Q. c6 X8 ? ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- X5 g: ~* W7 D7 @# e4 e server_msg_send(server, APP_CMD_LOG, "upp send: success");
?: q6 ~* o% b. o0 c }
0 ?. w f; U6 \" V/ |' Q6 O/ o" A* Q return true;) ?1 C- [0 @; ~
}/ d0 D3 x. r s6 M0 O
, Z: Y) L9 {( Q& c1 R; L4 ]/ h0 _( l' Y( T9 e- x
: t0 [$ |& ?% b; g) f- q
9 m9 ~1 J* e3 u$ P; D+ I0 B
( D$ C- ^4 C! N, h$ a3 r- o |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|