|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 j- ]# X T4 ~- F6 B
1 f, p5 g! ^# v% A" F
问题描述:% ]( v6 c7 r) J5 h" B- G8 Q0 _* @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 }$ y6 e# G6 A1 A3 C7 F* u$ \
3 T/ q y0 ~: Y- q2 O2 L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 u+ _: E6 \* ^9 ]8 a
8 l7 j& q3 z0 u2 E; ]测试结果如下:
! i: E+ `# `8 t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& q* \/ o7 Q" p# i+ H o$ T2 f5 t
6 C/ \4 G6 D! I- B
" H5 P; r# k5 Q0 ~, W/ D备注:
; p8 b! u" j9 ?) \8 }2 S' N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- w! d! i: j8 E6 G9 U8 x5 p
2、相关代码如下:3 t; F+ p6 `5 e4 V" J% l
//UPP DMA缓冲大小512字节
" f& O, N; A: [1 ]; D. e#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, K5 \. ~! q* Y1 z% S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 B/ H( F% M3 O! E#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 J" G2 j- C6 y7 C& I( H- H4 y9 {6 [1 B: ^
& ?) q& r6 Z/ E; t) E
//upp接收、发送buffer
s0 Y" ]1 `" P# Y6 l7 y, x" q6 C#pragma DATA_ALIGN(upp_buffer_a, 8)
" u {& H5 p# _#pragma DATA_ALIGN(upp_buffer_b, 8)) O2 `9 X+ ?+ a0 V5 y9 j% U- ` V) h
+ `7 ]+ B# R3 A- \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% D. }$ y U) ~% Q9 O, Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- d- m% C y. j3 B! f
, s- [4 b" K0 o: ]
. j) g* G3 Y9 cstatic bool server_upp_data_recv(Server *server)
: Y- Y8 y/ d* k) \* H{
/ @$ k6 L, X! K0 m8 y% j* | if(server->upp_channel_a_recv == false) {9 I* Z+ C- H' z3 S
server_msg_send(server, APP_CMD_LOG, "upp recv: start");: S2 \. _" U2 e% _( U6 {- }
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- [0 ?! ~7 ~* m+ L
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' [; D" g9 y( a/ g
' M p/ D f% F' g; O1 ]9 g
/ L+ W' u+ v, M, @# \+ r memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; ] @5 r J0 w
/ }2 E; B4 @9 r4 n( { server->upp_channel_a_recv = true;//
: b, c4 w9 K, ?$ S0 w# K server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);9 l9 q: b. k; h5 Z% r
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;. F9 J- C3 }9 G3 ^3 N; Y
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
( a M1 N7 ?/ t4 `$ l& T! R server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: r; c2 P! J z ~- y$ b- r9 ~, n) ^6 r1 u
upp_error_count = 0;( e- l; o+ t' W( E
upp_dmai_int_cut = 0;
; c+ [. o* _6 W [2 x( ^, p
+ }: v/ `0 Y( |% [ // fill in data * G$ p% D- ]& a' f: U
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ b0 a# L1 p* h+ T) O1 D( K
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 c+ ^/ }+ W- p! {% E }- q9 }8 O! l; N; r
}! A! G+ E# \) d, }+ h
else{. E9 F# R$ }+ t
if (upp_dmai_int_cut > 0){
: b, A) H3 a, h0 r- m# ~3 n! ?* a3 f DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 T& g. C% D- e Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' g( M; U3 m8 N3 m
2 U8 H! z% w6 q! X4 Q8 l! Y% b. ?# W% d6 z* w& b& Q
//copy data to upp_recv_list_busy
1 x3 ^, |+ M4 J" V2 |, B memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! V9 D, k# Y% V$ E/ m3 A$ p$ M' P# e% v! d: R# c0 G
//4 B* _3 `& g) Q9 H. q
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 \3 C3 k( ^6 m5 U b: ~
/ y) y! v; E- v# x: v! n( Z
//5 x8 ~# ~$ U6 m$ m, C6 E
server->upp_channel_a_recv = false;//
. d, d# j* t2 {" E) ?, b _$ b: X
# j- z t4 `' E' S- X server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* c, W4 b2 x$ U h: }$ m }
# J; r, G; a9 u1 ]8 { }* }9 \* D4 c: Z/ \
* z0 g! D. N5 s& w( Y
4 y9 O. L5 T; j- W# G1 z1 g
return true;' a* g! U9 E4 t5 I
}
- E/ P* ]5 _. I2 ~6 _: _3 [; ~7 g H9 I) I2 P
static bool server_upp_data_send(Server *server)
% e# R% |7 W0 ?! e% Q, z{
. V+ x* R+ P. k s# E# f" B if(ListMP_empty(server->upp_send_list_busy) == FALSE){! a0 W( i# |9 g% G \4 @) O
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& B3 J/ ?: p7 Y } unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
c, A f2 Y Y. X; ? char tmp[128] ={0};
5 J6 i' \- l3 v, _; g# y I# Z n7 W. \1 U
server_msg_send(server, APP_CMD_LOG, "upp send: start");, |; L" H3 `% p0 |* X6 Q4 @
print_log(server, data, 64);
( ~8 K" U b$ g. e+ T7 i- Y# a: L, I% `: y' n: Z, _
//
# ]6 r& y# Q0 X$ `+ L& X memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; f5 U/ R3 [& w7 M/ _* ] memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 B" I$ }, A; x/ H+ R8 f1 \+ a- m6 p print_log(server, upp_buffer_b, 64);
& I% r$ |" X. T# p; }: m2 g
7 [- L, E* A9 B server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
( w! q) L& _5 |) E* P server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ m8 m5 N3 v% l) S2 b, j; r server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
( a# t- I' [$ V/ h: W. A$ ]# H: G server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 Q6 f& g. N2 L/ k P
- n0 [( `: l2 N% a, P memset(tmp, 0, sizeof(tmp));
- \+ H% X* v p& D9 f sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & `- |9 _% W7 v$ e! e6 l
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% t$ U2 o3 Z3 j, ^0 i( a. C* @ server_msg_send(server, APP_CMD_LOG, tmp);
. z8 W$ k; m, ]2 k: U" M2 M( {: Q+ Z0 [9 V$ ^
upp_error_count = 0;
! R1 z/ P7 Y# r0 O/ y9 `% q$ x/ U upp_dmaq_int_cut = 0;- d% L8 q% f, g2 i% a1 n! T! a& ]) j: ?
// fill in data ) P$ [0 y( q! w: ^, t/ l
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & p6 O7 T4 O0 _# F& U2 j
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" `* O4 m+ l* B0 p7 |
1 p! I% b5 u1 b+ c& A- N1 V // wait send success
& P7 W& u5 E3 \ S2 n# B3 R while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! ^0 D+ y0 w+ i9 h6 ~( X
# D4 m: ]5 A) l% u3 |- J
// make data node in free list
3 J$ m/ U5 M: N O# N J% J- y ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ {4 G. s4 q: g) G" k
server_msg_send(server, APP_CMD_LOG, "upp send: success");
& M5 g' z6 D& C+ S1 s& N3 \! @ }& J: ^' K0 K$ O0 i- B4 f6 w
return true;/ {% Z# \- `0 W
}
3 {5 K# a% {; b& R" A, `2 f$ \0 P9 n3 ?$ F3 o
5 ^1 ?$ H0 J C" i' _, Y/ O! r9 J6 F1 R" r) k
: j) i$ V& g6 }4 z2 N! ?, \
! \- f, R! H! n/ f2 k! i0 } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|