|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 x8 b) ^+ y' K7 ]# C
7 _& R$ I4 [" T2 a问题描述:
% h, A: d' L! {6 Y% \, S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. }) R: J2 E: d2 ]. T/ m
/ s- u, C: N8 h+ h: X# C3 c2 I
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 \4 f; I; E$ Q4 {( C; Z
6 a* X9 Z/ l4 N0 t6 r测试结果如下:
; b- I% q9 }. B0 Y C138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ O6 P4 b- O9 |0 B$ }! Z! B( x7 J7 }% r/ j# o7 }* H% `, ~
% B" q) I/ g9 V6 _
备注:! p4 U/ \" {" p5 n$ o8 E4 l
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 Z* W* q' [- R R- r; h, K
2、相关代码如下: O( ~; u/ y* _! z
//UPP DMA缓冲大小512字节
& h9 d# l& ^$ a7 e0 R' ^/ x#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 P8 P5 _1 C( w5 @+ C' E3 E
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ F0 b, P k/ u2 |' Q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& s, D# V5 I Q! s
R& E- p1 M. G, r% S8 |3 m0 d9 ]( x8 \6 i2 C( s
//upp接收、发送buffer
$ d2 X- W5 j$ N! e1 }#pragma DATA_ALIGN(upp_buffer_a, 8)
2 P; k1 o4 G& Y7 X9 v7 ~#pragma DATA_ALIGN(upp_buffer_b, 8)
* _: K7 [' c' M) @ G, U7 |' V9 A3 a' a$ u: ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! T, w6 [! ?- ^& R% [3 ?3 Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 A6 ^$ R) S, f% o) w" a' i* |- T: Y. m1 `- A
/ s7 @+ f9 d$ N8 H- \; l5 Y
static bool server_upp_data_recv(Server *server) 8 N3 a1 @/ X" p
{
' X3 E, ^; r9 }# D- M1 j if(server->upp_channel_a_recv == false) {
[) J. ]6 O' [1 u server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% B; i$ a8 w0 m8 C* b* D" f/ r if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 ^$ w5 w3 v' M; j W( N3 `
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 X# Q M( e) z/ l2 @% }) N2 _, I" z- e
( y, g: w5 Q+ Z
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 P8 E9 v" B0 D2 e) y
0 |( D( ?* @( W& j$ m& \; C server->upp_channel_a_recv = true;//
2 p, y0 W7 X! a1 ]% @ server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);7 S: D1 i( [8 n0 z' r9 R
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;* L0 [: Z0 E, x8 d
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;, k# d3 @, j8 D9 k7 R0 S. N
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 a( M f/ Z3 |3 n1 a% n% H
) E. _- L- K: ~) a
upp_error_count = 0;
" p) D; W% {9 j c c! L upp_dmai_int_cut = 0;# Y \9 b% S7 Y/ c+ P4 n: O0 v
8 b/ j. \# v* e$ T9 ~, |& X, U // fill in data
( B! f" {( U0 q7 U- R- i' v- \# {* c uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. Q% ?4 L( N3 D: Z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 v9 N; L& j! N. x }* u* H" A6 M8 W9 j5 B% H+ V
}& L, X8 g o5 M6 }7 X
else{
Q5 ^/ g+ G# } if (upp_dmai_int_cut > 0){5 w) `4 B" J* k( W: A, i# ~
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 I8 q% Z1 ?$ G/ w, X' {: F/ i1 z
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
@4 p/ G2 Z Q: u7 M
6 O3 A8 z% x/ |4 o( u J" c: |& @: V" q1 h( r K, x9 k
//copy data to upp_recv_list_busy
0 x1 M) |* Y0 O: R3 l memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' }: w m1 Q; ~
) B' Z; A( ]( g- a
//
1 }5 F8 M6 u* p ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ u$ g1 p2 C' F, O+ c
" f0 L3 F! W) N. S
//3 [! G( Z1 t$ d2 c" k0 M
server->upp_channel_a_recv = false;//& O( z$ C/ R3 v. y/ h! W) ]/ k: \
8 j1 g' j8 P3 Q h( ?$ n! ^( z0 I
server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 z' M4 r: b+ e% \- O
}8 Q- [1 u7 q' B6 o5 `, X, a
}
( p1 s# _5 I6 d% q Y' B7 y0 {- H: ~4 @! g: O0 q+ n. x
9 i& M: E* U* m4 a return true;" O& `6 ?9 Z9 Y. X. y
}
8 L8 A1 f* `$ q$ o
1 ?: n* \8 f# b* X( n; F+ nstatic bool server_upp_data_send(Server *server)
. a4 B3 d) X) P. b( S9 w8 s{
9 W$ Q* F: A L- Q" v" _% F, l if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 x- C# s- H( V' y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# Y* w1 W( v4 D/ A. Q: [) n
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 V: U& v, I7 l5 c
char tmp[128] ={0};
+ d" n' O$ S1 ?& _; K1 p" A& P$ \& p' }) z' F3 ~, W! p' x
server_msg_send(server, APP_CMD_LOG, "upp send: start");
# v, R' S/ T( |& |& @! C) f print_log(server, data, 64);' f) Y# U! d! J* p5 D
5 i% s( t& e1 k; E5 }
//
9 H; z; f1 K8 u7 H9 c5 T, p% s memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' z% ?1 ` C3 S: l9 g
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! U8 t; g. |, c! g print_log(server, upp_buffer_b, 64);
5 @. ~! P4 ^5 d( t: B
0 q$ x/ o# m1 B; k* _5 @) c7 v server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
( M1 R8 I" b' | a! d. o server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; ; p e; Z- V a9 M6 E
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
7 k! | Q1 z* U5 m4 y: { server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 ?5 J. ? F# b- F0 }! [
6 W0 _. i( v; \2 L+ h# H3 q S
memset(tmp, 0, sizeof(tmp));# I9 Y8 G9 I- C& Z2 w4 l1 y
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F/ ]+ X+ v6 A4 J6 o5 s sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: w( T4 x, f% m& B6 n) i
server_msg_send(server, APP_CMD_LOG, tmp);
) R) _0 A9 w' G M# |: D; {6 ?0 C6 H+ H# c- G4 I( M, n7 d
upp_error_count = 0;- X k$ j) u8 d; r' S( Q+ Q
upp_dmaq_int_cut = 0;
# Y" x% G" F# C, ~7 { // fill in data
$ ~) P0 H( c1 k; w: B) u/ w( T uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % C4 |3 C4 }' r& j/ a8 `1 l
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ Q7 n8 \5 U8 k7 g M8 I$ d
- h: _, _" L: }5 S' f
// wait send success. L# \8 e; [1 D9 S
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : S; \5 ^# c7 Y4 j! }6 F5 ~3 c& P
" G# X3 b% S2 \9 d* `0 b# B. o
// make data node in free list 1 m! \% W% `6 w: J5 \3 ~& g) W
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 U/ \# t0 k% h. a9 z! T2 O server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 g# }! i8 I" e- n9 O3 W( o L }
; @6 H$ q9 e+ c- N0 z return true;
2 i* @4 B1 ~ n) a* u}
8 O8 z; z# R! {4 t
( ~$ Q' V+ [& U' _) Q8 g7 Q
& J, c8 t. X% e/ E) K4 j' V! o( ^) e
* Y6 v. o8 h! t( i3 E7 M
! z/ i4 M+ Z) v5 G) ^
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|