|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 _+ y, E) R9 F- O0 j
2 `! I6 ?; V% u: D+ t* }
问题描述:
% M8 T; [( g: u在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 v% Z; u# X8 e
1 u2 R1 U& i- u0 m2 E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* y1 u; @, }/ h, F ^) X% I4 e( E* d- |. T! @- K2 [* d# e' E
测试结果如下:
5 F$ T5 z/ j% w4 I138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* T" K* R5 g* v: \7 ~$ o- b: m% r9 W1 z
8 M6 l' d9 n$ N1 M
备注:4 j' E; x3 ?0 P+ [; X' N. L- w H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- h7 A8 K ^* @2、相关代码如下:
$ d1 ]. e, B8 Q, h- [+ ~" M//UPP DMA缓冲大小512字节
$ f/ j( ]- z7 Z#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: d4 k# i( W5 L2 @# e% w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 e& E* I3 F8 h, X, Z$ K4 X- Y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, l' t+ |# a4 x* e' s8 z. J4 X
! t- B6 \0 `" v& T" I9 Q2 @7 ^( ~. k, ^: O A4 B) M
//upp接收、发送buffer
4 g9 S2 `6 G4 K$ w) L#pragma DATA_ALIGN(upp_buffer_a, 8)/ Y& R, ^# f+ |
#pragma DATA_ALIGN(upp_buffer_b, 8)/ c$ ]3 F, @: p! P
* e& x+ ]* D2 I4 H4 lunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 b2 n* ]! c' r: m+ U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( a/ Y- ^' M' |% j. D
5 Q9 @) D. H# W' Q1 [) X& t3 S+ f& F x7 L/ ]) r
static bool server_upp_data_recv(Server *server) + o }5 z& L Y: _9 c% Y3 g3 }" P( z
{; G5 ^, o) A# l) U9 r7 j
if(server->upp_channel_a_recv == false) {
- `5 p" b4 V: f3 p server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 A. [+ ?5 o) T' j if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 ?1 _( p: u V; c: K" Q. h
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' s. ^6 N2 e; e* @% S M2 S2 X, p
9 O" Y$ N3 X9 |; i) k# q) s8 s7 Z0 O5 O6 N5 u. U Q i9 T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 w* J9 |& V! i0 d+ M
: e; s w$ i9 O, E' d. P
server->upp_channel_a_recv = true;//" E. `% L; o1 _
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);) Q) w0 w1 ~) {* ]; a4 |
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
. P1 g8 C% K' C( e& s server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
0 d, V: K. J( Q: B( n0 T server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! N( |, }. m$ Y, T
( b, ~( ^, ?0 ?5 Y! P" c7 o
upp_error_count = 0;
, [& c$ w: M) t8 U D upp_dmai_int_cut = 0;: } U5 n' f: H( F( e/ s
2 t/ d! P0 \+ d: R# |- ]7 b2 {
// fill in data
) G9 w" q n+ g, b4 N, J: }: s uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
) w8 R0 q% V6 |, i server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 \0 o# S- O8 q4 ` }
( @' T; }& |3 ^! B }
. ]6 `! l* i- A/ d& N7 a8 f else{
9 ~+ n9 Z# D6 S$ ?0 Q if (upp_dmai_int_cut > 0){
4 u4 r6 ~8 V, \1 Q. J DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! F+ s6 g5 J/ I& q
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; w4 y: \4 ?! m$ N: @( v, {% O* G0 Q" n+ d
1 @. O, B1 f- P* M- O' t) m //copy data to upp_recv_list_busy# V9 `& |0 Q) J: [# _) ]
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 |. F: G, ` d& G* I4 L% g/ ]
9 f3 i# x) X, W: r' Z" W //
$ Z! p2 k. Q. E8 t ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ {( k' n* L9 y; y1 ^
7 r* `) f! G( s# B9 G //
; S; g' Q7 w( |: [. Y6 |% H. g" I3 c5 K0 v server->upp_channel_a_recv = false;//
- a8 _5 ?# F; K6 I* Z$ l& E$ ~1 `1 ?
server_msg_send(server, APP_CMD_LOG, "upp recv: success");) c( |% U+ d0 Z
}
- D$ T, g8 A+ L$ H% W I }+ w& L. ?$ m4 @3 t
1 X7 j' k4 [+ N$ t' P. w& F" t5 l6 A7 X3 r$ `
return true;
, a. t9 q ~* w. s}# O! k6 a" O/ J* B
: K7 H! w0 l* L' [/ a3 bstatic bool server_upp_data_send(Server *server)
5 ?+ J! N# o+ _9 y E{" v1 l& e) Y5 E* C. x8 A6 P" w! z
if(ListMP_empty(server->upp_send_list_busy) == FALSE){! ^$ F- w% N1 X% k7 @
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 X- a. o+ O1 } unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! L/ C' M- Q* E, E char tmp[128] ={0};
% u L4 Y0 I$ `& l' P& e
( X6 |( E) B1 n7 t server_msg_send(server, APP_CMD_LOG, "upp send: start");+ A: v3 O6 N" D/ A8 {) ~! t5 W
print_log(server, data, 64);
' v* A3 C! v, o% I% k5 k1 X' N
$ |( C" h: T' I# q7 \0 t6 [, S //
/ u5 A* ?, p; a8 ` memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 X1 Z3 f5 M/ u. C4 L- x+ q memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; Q5 ~" k, A' Z1 {; z
print_log(server, upp_buffer_b, 64);
; W/ h/ L, @% _8 g0 ~
% r& i, ?/ V7 H8 Q server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
$ X4 u: [6 n" @! q server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
! e ?: c1 S } server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
3 z* T) g) v1 U T server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 a6 F4 L- E6 k9 H, a) A; l" M! h
memset(tmp, 0, sizeof(tmp));
8 y) {6 m; l- B x( u sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! B# u. Q ~+ j S8 }2 @ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ H; z: g2 M* \4 R server_msg_send(server, APP_CMD_LOG, tmp);
) I, s! B: p1 |& T) r8 x% d% _, S" \+ ~6 A: J
upp_error_count = 0;& z d2 N: X; Y- Z% k
upp_dmaq_int_cut = 0;
0 M8 o+ l5 [' g0 o- ]3 j9 S; V // fill in data 4 v) L3 ]& A& L2 o" v; S1 w
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); t& |+ x0 Z* \* n# d3 g
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% ^' V$ G9 B8 d2 q6 x
) P0 a4 r5 c+ n // wait send success% m, J& w$ |! M& g8 l8 W! @" f
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
" V7 x5 h& p" v
' t9 z# b$ u# s6 H4 P4 c // make data node in free list % K% \2 x2 y$ x# n- h; R6 u% I
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 U+ O& a* q2 i server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 Y# Y. M: {1 A6 O! u1 Z- \8 R }1 i/ l8 \+ e2 R/ U* ?% {3 x% b
return true;
! K- w/ {8 z. v) s* I! I}
2 r" D `3 a; ^" W" L, u5 n4 ^: E& C9 ^: H1 ^ e
8 w, w7 O4 ^3 i$ [8 h- {0 A# P1 y( {; C& s
; I- j0 G9 b- w+ Y
9 S, Q% L, A. z6 L |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|