|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, e) r% M8 |8 q+ w6 E1 S, k: }$ Z0 |+ Y0 I8 ^6 f+ D
问题描述:
2 W) y% } Y- T0 i2 E+ |在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ J- v6 ]9 L- G- Q/ t! I( U
2 W! z: i6 s% I9 s5 ^# `$ C) z图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。 E2 u! z; a' X: ~* k' I6 Y
6 h1 e9 h1 c8 q& D* \
测试结果如下:
- ]; U0 u# t1 e/ c/ K6 U: S138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 a* ^7 w& Z) _
5 P; w% `' i4 n! R' V* f
]5 g4 s. {( f, Y" t备注:
% E4 p# M% Y. W. d1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 ?4 p* T: Z1 A' Q/ S+ w: O
2、相关代码如下:
8 w3 M" }2 S( u% T6 R8 z. ^9 m6 N: l//UPP DMA缓冲大小512字节
, M2 @4 q' [- ?; m- S5 N6 \#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
" A" h7 _5 X: N0 X) ^1 s! K#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' Z# ~7 l: h/ M; o#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% ]- O* T: ], g2 v- q: i3 g7 Q. k2 k/ g M
/ r) j( o5 ~( \4 }' t% _//upp接收、发送buffer3 c u0 F7 Q2 u& \: ~- E
#pragma DATA_ALIGN(upp_buffer_a, 8)
+ T, Q/ z) `! K' F#pragma DATA_ALIGN(upp_buffer_b, 8)2 f) A- m. L$ |- w. k# V
K& R* z; c1 c. Aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ w. o2 ^* _9 e$ v6 w0 f4 j+ i; U) b" Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 v! J: Z/ \4 s' @1 q
) p3 B5 f* w6 A$ j# Z0 o0 n% A. R2 i: V$ _, g1 K
static bool server_upp_data_recv(Server *server) 9 X# C' J% j) e2 e# C7 K" V+ t) s
{
+ {( c9 w! x4 S# m if(server->upp_channel_a_recv == false) {
# o+ B7 c# a( p% b/ O9 z0 r1 w/ M server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 ^" z3 u- @$ O if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 J: h* X' f0 L% r
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 i" p$ X, t7 N! e
. P. U N% F, Z- n% l+ |6 j
$ X. ^6 |+ \ z6 I h" {8 D memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);7 O Z# u, f! z: y
# e! ?; }% f+ N# O$ j) g server->upp_channel_a_recv = true;//( i2 J1 S0 y4 |8 y9 c4 \: S/ g% B
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); P: j' }0 q$ D. d
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 k+ ~. `7 ]: ?& z I
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;% o9 Q5 k2 ^& A- Y3 `% ]
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# u+ ]% P8 J% v) _
& N# b$ [! e* [0 g$ U/ ?' N upp_error_count = 0;8 q; b" @+ d# l5 u0 y$ P3 S
upp_dmai_int_cut = 0;
/ E; f) c6 o' l, z& Z0 Y9 A9 D- F% m; N C1 f! }+ K0 D
// fill in data
6 u4 l1 V c1 q u$ i4 Q* w4 J3 m uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- M- @7 d% r2 R( o6 c! R2 p
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ m6 ^0 n, p. c8 U0 r
}; q7 a0 y0 U1 O
}
5 x9 h. v N k else{; K3 u: W! P. F5 E7 {
if (upp_dmai_int_cut > 0){
9 b# u1 ?8 e% N2 V DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- W- ^- `2 r. {: y# a5 ~ Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( I. O3 t% Z9 I' X% k: i, n# i v) h3 {/ ?# J0 ~- E; V& k: D; G
0 e& p9 w0 F" K3 J( o) J: p
//copy data to upp_recv_list_busy
3 S, T3 ]7 l0 P L7 O" ] memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, ]0 G7 i+ B" {! `
" p: v: ~" Q% f4 t1 h( R, T. i/ k8 d //3 P0 m( U$ f/ I0 ~: I
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 x6 T$ x6 x1 ]8 R, H
7 G8 M6 ?8 d8 e2 j" q: D, h //
+ V! K4 N% |* y3 I+ V server->upp_channel_a_recv = false;//- a8 z$ d' a4 o& n9 `
8 l) v- K6 t4 R9 f+ b9 ~
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 g: K* L; x: P* ^: q! g }
1 P* h4 `9 ]" b; C) H }
% B" f+ M' O8 e3 C6 ?* e* N
* V2 h' G2 v8 S! |
) M$ l3 O" ~' ] return true;
2 V4 w& q& ~& e+ h; w8 b}
! d: M$ h) v0 b, R/ q, ?6 T
, m" j C8 Y5 t7 Z+ jstatic bool server_upp_data_send(Server *server)
; p8 m5 K, P& J Q{
, X+ w& e' c8 `- i$ M& S# g if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 i W/ ^8 J: e; L; M5 q" [- E DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 ?5 E. K% F1 A' m- w8 o
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* J3 o% a% m" N# X5 { m char tmp[128] ={0};
& I2 n$ Z1 W8 O2 ~9 h# n, y5 o0 ^( m
6 l/ u3 B& T4 {2 W9 f server_msg_send(server, APP_CMD_LOG, "upp send: start");7 y8 H2 {, U- v2 v* s9 c
print_log(server, data, 64);! A( L" ?4 i$ R! |( K
! Y' d/ C& a' L. [) s
//
( f3 U0 ?$ x% z$ h u: R memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 u5 a# N% j' B) N, g. {: ^, J, x memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! m9 S8 |' y4 {$ T1 G5 _ g6 U- U# G5 ` print_log(server, upp_buffer_b, 64);
" {3 _" B+ q; [
) H5 N& S: A/ I server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);2 I" y* J5 b9 ^
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; , e" Y' d/ d8 K
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;8 T1 k& r2 q. A! Q$ {3 a
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 Y8 n) u$ ^" C% X" }. ]- z
. Z7 O6 p9 o4 k) j" x. B' c) C memset(tmp, 0, sizeof(tmp));$ C+ a- C9 q5 Q& M* N3 E. V8 ^
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - n( p+ m" _( }2 Q/ v6 K" K0 R
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 L4 F5 P0 F# S' W. h% Q4 q server_msg_send(server, APP_CMD_LOG, tmp);+ `: i. b, A5 a2 C% Z+ R5 W- D
$ D) t; E3 ~+ u: m& c. @# X3 g upp_error_count = 0;$ I1 i# G. g1 }5 {# f P1 s
upp_dmaq_int_cut = 0;! P# z0 W9 x! F% _8 B; p% I& E& w# w' d
// fill in data
. V& i6 D. d: g7 j6 l+ i" f uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 i; Q3 r/ h# T" v server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 j5 ]8 P$ g$ k! [
& @. K" R8 Y4 S+ r // wait send success
4 `7 R2 M: H0 `; P- D" e& A# | while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 w% K0 b2 \3 |0 m/ k
% ?6 N4 W; U/ M, h7 I# v // make data node in free list
: O9 m9 u2 B1 s ]6 D( F ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 H7 _- `, e; ?7 i. N& M, A Y
server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 ~* p3 c9 t. U6 j) T6 d) R1 h+ D }
0 X- d6 w& _: p' d& F* p; f return true;
% c/ ~( o2 M0 k}
$ Y3 `8 x( \) T( {* C+ F1 t- `1 ~; i, d+ i' a& a
. Q0 O" K; x" Z% u) ~* x; [8 [2 S7 S
' _% f( u6 T# B. r) c) F, W' Z$ b7 L6 T6 Z, s# V8 H% g" b
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|