|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 F' f/ y0 m: _* `7 }1 _% v; i% t; C' T# W1 x( X
问题描述:
/ D: `0 w2 w f, z- x/ q4 |在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. u. ~6 S0 }6 s- o2 t0 r. s6 v; k% G8 w/ U @
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 c/ z- c% q9 n' k
# D" t- m4 O0 ~, K+ H0 _
测试结果如下:( J) L; ?: U: L% W
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% P& R; g6 ^; y2 U; G" x* z. N
9 M# J0 Q6 l! V# c0 G
3 @7 \4 n4 ^: D( K, E+ e
备注:
) Z& I: C9 [! M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ y) V, j/ D3 ^) D: B2、相关代码如下:
3 p. c$ k# _- I, t. g//UPP DMA缓冲大小512字节' E; S" l% Q6 O; z$ _6 e: Q$ w! p
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" G6 P# l: |+ F( q8 Y
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 l5 y% f8 }) z' F8 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 y+ [9 z0 ~* e( `, ~
# _) t, ^: L/ n! g" ]* t
' `' s0 h& A+ `* [//upp接收、发送buffer
& l6 p3 K7 P1 v+ v, ~) J+ \! M#pragma DATA_ALIGN(upp_buffer_a, 8)6 [& J# q& O5 A
#pragma DATA_ALIGN(upp_buffer_b, 8)3 T* Q2 H& U/ w! o
* Z* s& {/ u2 Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];0 A3 v! _' {& i' e$ }1 a! `
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# l4 g! O. }5 K5 S2 m) Y# z
* a% L9 r! q4 o0 s1 z/ k4 X& g* U7 L4 f; Q, t6 l1 n
static bool server_upp_data_recv(Server *server)
+ t! r5 A/ K& P+ f{
. L$ X B0 w$ J1 f a& y if(server->upp_channel_a_recv == false) {- d+ U' G% A. N# V6 A0 b
server_msg_send(server, APP_CMD_LOG, "upp recv: start");- R* E0 n: A- `0 Y4 Y
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, i# a( H3 e0 W& `. P( }! s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 g4 _! e% T. s7 z/ {$ ~
+ Z3 t# |) F7 j- u2 U: r
3 ]6 p& n6 V9 t& B/ i memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 b" S- t' C0 `$ v$ ]- @
& q! }4 M* v" x4 b3 l6 S server->upp_channel_a_recv = true;//: u$ O5 q+ D+ W" ?8 U1 ^/ G
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
+ h- R, [" f7 @2 A4 X server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;; K/ b1 g1 l3 Y/ f! K- k0 L6 f
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
! u$ }1 Z' {# e0 w2 i server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% c/ L. E' R5 G0 Y; U* u
- F- ~2 K, J+ s' V& ~" I1 ]0 g upp_error_count = 0;
4 h5 u7 X& E' @4 b$ _$ Z. U upp_dmai_int_cut = 0;( Q0 Z( A2 a4 S1 i: R
3 _ h) U7 d1 T7 |. r5 y# i
// fill in data
; |5 j' u! n( ` F uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( F e y1 F# \1 X8 U. e
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 A4 n" V g6 T$ u }% \3 x F6 [ X& b) [
}
8 B1 q3 v- R2 _" h4 L, e else{2 Z7 V; t5 O( ?* q
if (upp_dmai_int_cut > 0){# c0 b& w' z0 X! ~
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( u0 a( F6 l) C% d8 Y
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 I- X6 e: @2 U( _4 t1 n! G, T; p3 L
+ r0 S! J( E' e' q, A
& ]2 n. ~1 |9 u8 u) J7 g4 i7 Q
//copy data to upp_recv_list_busy
' x' n% X. Y9 v! u9 E memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! x# ]8 n! q3 D8 r* w' E6 _7 P* ~% _5 a9 D8 p
//
: @- t4 h4 L _. H% x+ x ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( D# r) Q1 T9 y! r4 s
1 b8 c; y, a0 i // I4 X9 D' H6 e1 z9 j/ S7 S, Q
server->upp_channel_a_recv = false;//
8 M- [% t8 ^& U2 h8 k' j$ A* R1 I: ?9 f) E
server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 n j: Q( Q+ s" q
}$ L6 D& L8 _4 Y! W- B% z' g9 l1 Q) ?
}
- e8 \2 o; d3 p- w% c# r& e
\! Q9 d0 e2 y4 j' s1 Z! H' k! Q* t1 u6 k) |; I6 m/ c9 b9 m, h. I4 M i
return true;5 I, }) v2 f- H1 m8 _' N+ m
}6 q% ]# d# j/ C% M% ~7 A
/ A0 I8 A6 ]' Y* X/ j3 e
static bool server_upp_data_send(Server *server)1 u3 _' E- r6 n3 i8 K
{
( q# z. D1 i# O" {, R+ Z if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ V! Q* Z+ N5 M
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ h) z# x2 S* k
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* P4 Z/ h ?+ U7 Q2 { char tmp[128] ={0};
8 |# x' o: _2 N% \/ u. R
, C3 X2 l7 m# A9 x server_msg_send(server, APP_CMD_LOG, "upp send: start");5 U) `& _' c3 u- ?% h6 D2 Z5 C* R/ M
print_log(server, data, 64);9 y- {5 a8 H1 X" _
' B8 D. M; Q" }6 F) g, k; n2 E
//! W7 ^5 X2 i0 T5 C
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);: v% z9 Z5 c8 `- p% [: {. k* } _
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! n8 D9 o1 u7 Q' E7 X
print_log(server, upp_buffer_b, 64);
( n( @0 J( E# o( x8 Y3 |; X, B3 T% k: W* k0 p1 P" R2 n
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
, C# o5 g5 w) y7 S; n8 s+ d server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
* e" Y! [5 [" R server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;/ F" I7 j) g& }3 M! Q9 J
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, s, R2 T2 n! q2 g" U+ i! e# F
. q' `% _' m2 y3 m/ f: ]
memset(tmp, 0, sizeof(tmp));
8 Y; C1 y( v- B) ?0 z! d3 ?3 u6 ^8 Y sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F# F# d! B1 ^) k. \$ l ~ sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* M0 Z5 z3 ~8 N$ C* A6 z. B
server_msg_send(server, APP_CMD_LOG, tmp); l$ u% A2 |' Y
7 j! ?+ x' w8 O$ o- F2 n upp_error_count = 0;
Y2 u! r d! z% E upp_dmaq_int_cut = 0;0 M3 j. y) c+ d' g' J' d
// fill in data # C5 z" r- L( L9 m
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 W4 C& m1 G: s server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. p" B( h& I( s& Z+ r, _5 `
+ s* R$ F5 P( k
// wait send success
; i3 j* g9 _$ `; b8 y& ?9 ^* o while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( I) R( ], q: t( |
& `+ M- d: O# X$ h // make data node in free list 8 C8 i H+ J5 C2 ^3 ? q2 B
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, Q7 C, k% j. b3 _1 Q Q/ s server_msg_send(server, APP_CMD_LOG, "upp send: success");- D/ e( P9 T, S8 _( s" p6 X; j
}/ H& J9 R$ Z# l
return true;1 s1 k+ B& f. |1 D0 G
}
6 o3 i, O, j' y& l) @
% o1 D j& j+ V% k: S1 i" I# F. N2 b/ q
+ Y- n4 O6 I( p& O* v
' h, R! H9 ?( G3 t% T+ ~6 r; F" Q, K) {$ Z/ o& u, Q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|