|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
9 E& u$ D/ Z5 [0 q7 f) e( w. H) D, h1 o8 ~
问题描述:
% Q, }6 _0 z w O在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' j+ V# P6 P& V
7 d+ t- O* G4 P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% |8 b" I7 V3 i, U4 {2 l5 A# @- a D% b$ H9 \1 n9 f( n9 n
测试结果如下:
! J0 F" G; N9 ~8 N138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 ? c2 q: ^3 F( F) B4 R, S* E9 X- q
" N- t1 n( v; Q
( p1 X' X6 N0 n4 o5 r备注:
N$ n& z% S& m5 g3 q. K" _! u( X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' ^) j' j" C$ G6 ^) K' Z
2、相关代码如下:
, o. {# s u9 d! [//UPP DMA缓冲大小512字节( Y7 m1 u. ? [% \# r: o" \
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* }5 L/ \) Y1 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" \/ p$ l6 W% R5 n! I5 C w3 V#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 X+ |# ?( P7 X& B
) b& R) q# r, M
3 A( y1 f; ?' e+ \4 i1 K5 g3 w//upp接收、发送buffer, }+ a( x/ p: p. E3 E
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 Y( k$ i$ `; E. p+ i3 A#pragma DATA_ALIGN(upp_buffer_b, 8)5 g! b& e7 l3 E4 z4 }
& u& M- V7 A: `! I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! z" {5 s8 [7 S0 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 C; b, O' ?; N) A1 U3 E6 {9 e) o
- J# H/ p Y$ \& A/ i% z& c/ ~) K4 d3 r: t
static bool server_upp_data_recv(Server *server) ' M3 x7 N7 k. @% s- H. W) g y; w2 S
{! C0 R e/ Z+ K, f/ z
if(server->upp_channel_a_recv == false) {
' |% f, D+ M7 g9 N1 x$ S B' u server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 D- \! k; \0 \) u* b; S9 @
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; ?: C i% p! E" U" {; F5 j
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. Y1 X5 o" |, N* J# } j" D7 [3 [* ^8 v
; Z* R+ g! r1 J/ d G% k6 J: V
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 e" f" v+ H; W& Q
' |# b( ^. ^4 M6 p* @/ F) d7 V server->upp_channel_a_recv = true;//8 R# T7 {9 I0 V" I( ^" h- g r9 _
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);0 L- l' l1 A+ _
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
( I, u4 Z0 J+ }/ G server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
: \! A& V$ G# d H2 A server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 K4 c U+ _$ U0 g! t# h" Q7 t. a& |2 @' k- s, }
upp_error_count = 0;: { n# l0 f/ _ H
upp_dmai_int_cut = 0;0 g- x) R% [9 F+ P8 ^- \- z q
% b$ v7 o& r/ o- {. }/ F- A; z // fill in data / _" o2 u2 @5 _0 ]- X3 C- A
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);; [8 }+ S% X* V& f( r
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: \# J, ]: y. f: c/ D }" Q7 U8 ~# y0 `) I% B5 Z; L
}2 D$ t0 Q, j+ d3 P% u, h3 j) r
else{& k& H7 b; h: g& q" @* }4 I d
if (upp_dmai_int_cut > 0){
4 }# e: \; B, F ^0 ~2 z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; { |& v+ t& T' k ^6 C, V e9 f4 W Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& w. E# T/ w0 l2 c4 v- _& l. M4 X* g( K, q; V; I
3 j3 B4 v. b1 k# F$ O9 \
//copy data to upp_recv_list_busy5 r& Q4 m/ G( X6 |
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
7 E& {9 \; u6 L& [4 @: g! a. G/ D8 Z8 b( T* `! v! K; H# Y: V$ x
//
( x' P* R/ p0 c8 r0 f ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 M, c# e% F" m3 D' B8 x' l- P# |2 O1 J4 G" d. u; L2 r
/// z$ ]8 f1 O! b7 J
server->upp_channel_a_recv = false;/// _( X4 P9 s% W9 |0 Z! \
. k4 v, e" U' r4 y! Z* R0 { t, v
server_msg_send(server, APP_CMD_LOG, "upp recv: success");! |( F+ E( D6 t" l
}! V4 G) w" R" m
}+ ~1 \# t7 j+ O3 p* q$ _2 F8 B5 `
/ @/ `8 \! Z9 y9 d& m
4 f2 b2 E" F) S; w: q9 D
return true;
% C4 m% g: B8 {9 e9 F. ?9 |( v}/ X" o% x5 y a& e$ O
b" e* w5 j+ Z+ P) l5 j5 R' Jstatic bool server_upp_data_send(Server *server)! o7 R3 N0 a0 O1 n: g r2 `8 M' s
{
0 i S) m% F+ E4 S. q5 h1 K if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% @9 S& ^) G" N- r DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 _, F& ] d N) h
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer); w1 i& @3 u! o' l3 }; G0 ^
char tmp[128] ={0};
5 v+ N3 R! X( [% G9 Q3 \; H/ S, }' d% F% s6 ~% C6 f) k
server_msg_send(server, APP_CMD_LOG, "upp send: start");% A9 s" [% f/ S1 t
print_log(server, data, 64);% K, f# M2 t2 ]& z4 I7 q. j
- G) ~) t( w W8 Y //
% B! l4 E, {9 F$ s# h4 J memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( w- l+ b5 ?! v" G8 K
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
, B; Q% I+ x2 w print_log(server, upp_buffer_b, 64);; w* o1 e8 u( Z2 q
3 U. N; ]3 _/ D1 X, r! h" t0 j server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);2 Z* M" o5 |" [. o' n
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; + S# m4 o5 z! _
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;, W3 X5 l6 i- Y5 V' M
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ _- d2 z3 A" D3 D. C
" w7 ]) k/ f7 `6 R4 _% N- C memset(tmp, 0, sizeof(tmp));
; a9 `7 M7 A9 E) U8 S sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 k A% Y% S1 B/ d# s sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);% W) `2 u( Q. |/ @! z1 K- O
server_msg_send(server, APP_CMD_LOG, tmp);; ]; O2 H' t/ i+ r! H
/ K" [4 W0 b4 `. D9 l; P upp_error_count = 0;+ E" [1 D$ p' c/ D" ^- X( v0 p
upp_dmaq_int_cut = 0;) J4 h0 F" G5 t6 c3 f" H6 f
// fill in data 9 T8 w2 S" T0 R8 e
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# G3 s9 }! B/ ?# u# R8 Y" f/ g, a) P" ] server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");) o' J( L/ @ Q- X
! d0 a( j9 g v( c+ ~
// wait send success
( \4 U6 z+ P; B6 P3 H8 d while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' Q6 m4 X" R* J9 m6 f) H: N+ q3 {% }
J' q2 o& G% A' g1 f // make data node in free list
! k$ h3 c: D% n4 _( i/ s: @1 w ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);! J+ h3 j5 e1 W. T' K
server_msg_send(server, APP_CMD_LOG, "upp send: success");! W: ^+ ~5 H3 ?3 B
}! n" U: v+ _- w& G3 O) ]
return true;
+ U) G( g$ O; a s" J3 ]: f+ Z}
6 O9 s- S8 X$ H& B0 v z3 v4 F" @- n8 u. n B! v% {
7 ]- N2 s$ i- d/ P& j9 w
T* M" l8 G' F/ |+ ` h) Z
* q3 U% {1 a9 Q1 h) w+ Q% `2 W4 `4 I2 k6 T, G
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|