|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ D, ~1 b1 u, N) W8 V h7 b" D6 \4 `8 K$ M6 y2 N' o
问题描述:
; r, R, [8 d* j) J0 H9 O: `$ U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* _& Q# d+ C# {4 P: d. b4 I% `, {8 a5 R; h7 H4 r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: I9 d2 ]" ]! D/ ~
u2 c, |7 U$ H/ V0 k
测试结果如下:4 o- d* D; {. `0 v& r9 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 n# x9 l( c, I0 k: i
! \5 _8 v5 {: a4 w- ~6 P* p
* q# S6 C0 R6 T; E8 R; _. X# V1 p
备注:
& Y: m) L- z) y- X8 o Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 L, D) p1 P6 w) W! P# o6 a8 Y
2、相关代码如下:9 e2 I; f$ n) o u: Y( d" l
//UPP DMA缓冲大小512字节! q3 ^% B. ?( [+ C0 X
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 ?; [2 A, j w7 V2 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) Z) B k! U9 X8 H
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ T& g) @! o8 p! X2 M
# N/ b+ v6 y2 o4 n% R
; C! [ \' h$ f, N6 P" D0 f. e" ~
//upp接收、发送buffer* _( c( B$ R7 C* Q
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 S# g+ @* _6 k1 ?7 Z#pragma DATA_ALIGN(upp_buffer_b, 8)9 b8 E6 x/ P6 E. R8 Z3 A9 F
; e$ M: Z9 F# ]unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' W3 s( V' a5 ^7 y0 g. c+ ?9 C1 T
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];2 d' q5 U; t) Z$ e* a) ~! ]# e
1 r) I- Y5 K2 i) v( ]
% j2 ?9 l' W5 Q! g1 i( L$ W# Xstatic bool server_upp_data_recv(Server *server)
9 [" m; q; y: W8 b{; I/ J. y; ] C7 r0 j: f
if(server->upp_channel_a_recv == false) {7 F8 h S, J+ s9 A
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: m; W* M- n/ C if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" p U4 F' h3 m$ {6 ~8 G5 O& ]
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 z, c+ T6 f" W% C
( r( P1 ?; x: ~5 Y2 h% {3 D
, E3 F7 N7 i8 v9 K0 Z3 t memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 A+ w: n' F4 { d
" U/ Q! o3 t: f# J0 j: j server->upp_channel_a_recv = true;//4 l/ u& R1 [4 C) U( n5 D
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);$ T- Z8 a& H6 F5 O: a. W) Z, R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
/ z5 f) e/ ?& _. J X! a3 q, q- y server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! p- r% M0 |. T" Z: m! j6 ? server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) n% }% \4 S) w
" o( A: J$ P8 ?
upp_error_count = 0;
( q; q9 Z3 `6 _+ H L; M# \ upp_dmai_int_cut = 0;
2 ~$ W0 g p$ M; Y3 O) v {: {0 y2 X; b/ `: o4 q/ w- S/ a: y* q( ]
// fill in data . y. f4 ]' R; ?8 P
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA); i4 ^( s' l' s4 e: M0 T
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, y- Z& u* D6 H! _
}
& z* l0 {4 x$ h; B% q }
+ N; `3 `( i7 Q. }+ Q, d else{( T" w/ @; q! w. l! ]0 A+ J) K/ X% u
if (upp_dmai_int_cut > 0){
( b& C$ G) b# s6 [% b DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% B% R' Y, n- ?$ S. E# I! D
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& ~ h5 u' `. X2 T; j4 O
2 E$ I# z+ Q# F& R' j! ~" u& _8 u9 }4 E, j4 T. z( O: a5 L
//copy data to upp_recv_list_busy* T# t1 [" M# D# M: f
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. p7 j- b) o) j0 g
( s; ]: J1 J$ F( W! k8 R% U //
% X G: _0 I5 b) j$ T ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& F9 L. f6 |, E# |2 e. B) }: ^9 Y, r+ v o
//. U2 {0 }7 T) B0 L, m
server->upp_channel_a_recv = false;//
$ w9 f# Y& J: |% }2 z( L. [2 D U8 T/ M' w
server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 ]/ i: P8 ?5 N1 S) R9 ?% M
}3 j' N# g8 U$ d4 L& F
}2 L1 @4 l6 d6 O9 x9 }% Y# o
! m! H0 b( o$ ^9 W
" K8 ?$ [. C+ ~7 V: Y) }4 ` return true;
/ {9 a; x- a( l) E}7 O k. ^; t* x$ r7 ~; I
$ I _0 q$ n5 K2 ?3 q+ J
static bool server_upp_data_send(Server *server)
( D* e9 h2 J$ |$ ]{
. y' F) X0 A, w2 c7 R/ A2 |3 M3 V if(ListMP_empty(server->upp_send_list_busy) == FALSE){& j% u' e% J3 m* O/ {. }
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
+ ?/ `6 E! t; e9 G p* D: S unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 v+ ]* }2 d$ E' `7 f char tmp[128] ={0};
; F1 e( ^, @% ]3 b3 ?% ?3 L. v% Z1 ~( w4 h1 @' _, ?, F1 L
server_msg_send(server, APP_CMD_LOG, "upp send: start");
* ^6 j' g4 r' v% e, T. j. p ` print_log(server, data, 64);
$ t8 \9 L* U% {: V! O- [8 M! N: b( E* N, q+ d5 G$ [: x# y" T
//
) b$ e4 d2 ]8 e+ D0 m) u9 N$ x memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; B/ g( F& E. C* z# k9 j memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: m6 q M2 w0 ]# E( \9 V print_log(server, upp_buffer_b, 64);3 r9 h3 U' Q% x4 {6 _' n
* _% ], l2 O- D, e8 f' n) W
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* B$ k6 I4 @' ]0 z server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( c+ e: N1 [' ]& J; q server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
7 Q0 E% }. J! X, j6 v' I server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 D% x0 o9 Y* x7 r) ?, F/ f% v
" l, }' `7 ]- \3 a7 V7 _5 C% l+ o
memset(tmp, 0, sizeof(tmp));
" I* [9 ]0 r8 g' M sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- y8 ~# H# U* o2 S8 O% V sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ d4 Q) ^/ n, ~
server_msg_send(server, APP_CMD_LOG, tmp);
3 J4 N; x6 o- p' w2 |+ D) x
7 F! K4 K6 b2 |6 ]2 ? upp_error_count = 0;
$ E5 T4 }8 t% d l! A upp_dmaq_int_cut = 0;
: }9 N2 q( F$ O8 k- J // fill in data
0 A4 d5 k4 q' ?& l uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 e" T* F- W! G/ B" ?: } server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) V4 a/ I* O' \4 u* ?; T. b" M' R8 ?1 F Z
// wait send success M/ K2 r$ i% p. ~0 H& O% `
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 Z) q4 p9 Y O7 s
9 c/ p% e- `8 {, ^# ]3 N$ ~
// make data node in free list 7 q0 X' h- m V: u1 W; V6 V# z
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 V& }; J, n; w% B$ u server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ h# X! C$ ~, E. t }6 O3 z) q' V& @* c
return true;3 `; o3 S% a% x) c* j; g( Q
}
+ H% p- H: h2 _8 N
: B/ D0 A( [- n r: i! J) K) N$ o3 d' a1 P3 q( {1 V
; v0 o. x* h/ C$ e# z) Z* r' T3 b! A! W6 ?" b3 m8 \, T
5 ~) d* D# O" n, {; ^, m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|