|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 c1 A, ]& C/ X4 I" [6 Y6 n* ^: Z- r2 a0 u) F8 e4 J
问题描述:
* k% s$ q. w, V( K在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
/ F# }- N4 z4 \; `6 }9 z6 x2 I
% B4 l: s% B) l. @8 g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 H9 s L7 H) L5 O* S% |& \+ j# g
$ f; l( t$ A* X; o; S \7 m
测试结果如下:
# A8 x. s' Q/ c( Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; ?7 Z* m5 _# q7 r. f8 ^; y, I" A, f
3 m3 j! D/ S: i) q# L, E% m备注:$ c" J+ g; Y% n2 k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. G- W( s: r( U
2、相关代码如下:6 i& T% u7 g) h& z
//UPP DMA缓冲大小512字节
+ q9 A6 r: f$ x* Y; d7 H, G% u/ U#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# |6 m- c' @4 ~/ v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% ?8 e3 h" N E! p+ v& ~ X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 y8 C: W$ D+ }& _9 n6 X" T9 K: s' o; q5 i
7 {" e9 O' |4 W8 s0 b
//upp接收、发送buffer
8 _( o8 g& T. ~0 ]#pragma DATA_ALIGN(upp_buffer_a, 8)
5 ^5 q0 q3 ~. V4 u' [#pragma DATA_ALIGN(upp_buffer_b, 8)
" R+ X7 N) q( g& C4 d9 i3 |2 x4 b9 C# s7 X$ I& A' Q3 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ X" G7 a' }2 U: Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 p4 d) n8 c5 }4 k: k, T
; C& c, U9 a' z8 ~8 s
, o% u% I r% G% p, W( ?1 Y0 gstatic bool server_upp_data_recv(Server *server) 1 n( \ X' q1 M8 s+ o @
{: P0 i# p0 V- d; N; s2 V* z
if(server->upp_channel_a_recv == false) {
: |- K) k( s9 R" b# C server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ]# }4 a* L& X+ T if(ListMP_empty(server->upp_recv_list_free) == FALSE) {, f6 b4 k, I7 A
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! I1 K+ ?, B' h9 ?& r. `9 z
' {3 f# H( Y9 S' Q- y5 c" D% s
6 w. x1 Q3 K$ s$ c" a; N& Z; V
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ `7 [7 o+ v+ r% y' B" c6 }
/ Z: ~: z2 U5 E" `; N5 g$ ?1 \) f server->upp_channel_a_recv = true;//
- W3 b& H0 `: k6 B5 O! y' w! | server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a); ~ Y! q2 t, M" ~
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;2 q' N0 p6 z8 T% Q6 e$ l
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT; I7 ?2 W$ P' U
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; s8 C E: N& e8 w2 s4 ~' o4 u( T
5 y0 C( S- W# v
upp_error_count = 0;
9 O+ B$ Q" U8 `, V5 Q3 |) z upp_dmai_int_cut = 0;( O, k& [$ N/ Z0 x& S" r
5 R8 j0 c4 Z2 h // fill in data R4 h- ?) f, } n
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ L' M9 E! O" v: y server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' C7 ]# |, B$ O; `" e
}1 e. ?$ I, @% I; z W0 k9 x$ M
}
1 l [8 b) j z9 m else{
' N( ~+ `& U2 D6 _2 N if (upp_dmai_int_cut > 0){# y- |5 c' p% e0 p2 Z9 V Z
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! N; k1 ?8 ?. Q( ~3 r5 d' S1 G Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
}+ X: d# I e- c: x; n+ [5 U5 X' G
6 n7 m+ f. I$ A( @8 G/ A
' C, u0 x; g9 Z3 b% a6 ? //copy data to upp_recv_list_busy& K) q0 K- y/ g. h! P# f) |4 @
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 X$ H; L' F( c; w' D3 q' B, {1 C c. c' T' u0 {
//
) r1 u4 B) d- a0 J6 n ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 s% P" H0 Y: L2 I! C* |
7 V. E7 ]: W8 \, B5 t
//: h' [+ M- C/ K% I9 {
server->upp_channel_a_recv = false;//, ` o* k4 [# E( @# [2 g2 e
7 e% P3 i# [1 }- @5 \ server_msg_send(server, APP_CMD_LOG, "upp recv: success");: |( o8 s; V, Y6 s0 B
}; r3 [( m5 h2 H/ u# ]
}* M: W3 _7 D: x0 c; J( @9 b3 a
- j. p1 B$ X6 i4 b/ T) J
I; s6 x6 @, m; c% w return true;
% n9 A8 b1 \6 Z/ I7 n4 T) A} P/ x0 W8 ?" \4 R' D3 ^2 d! I( D
' c+ e' ~$ X# ` Mstatic bool server_upp_data_send(Server *server)' U' }! \) k s/ M" \1 h
{
! d( m( ], p0 I! H, r if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) o* v; w: d& V3 k. F! y5 y1 _ DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 F/ m- A n2 h unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% N- P5 ?4 O( i$ I2 O4 b. g char tmp[128] ={0};
. i" q7 w3 f+ x# M7 y& j! p+ {* K: w
server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 j% R$ y: Z7 ?8 G: v& A3 {# { print_log(server, data, 64);
% [- m: e! {- C$ q( J. p; e
4 J* Q, r# T7 ~& A d //6 w+ j, Z6 n, u1 s! J
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! Q% s* G& a. H" v memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 t5 i. E& C9 _ print_log(server, upp_buffer_b, 64);
: y( i' ?: H; u* N$ s
1 S: u# R) H! L3 \ server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" X1 u7 ~4 j6 O; o6 @ server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
( c) H, @) A; Q8 d- G- V8 y* `$ ~! K server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;; q5 Y. Y; E# Y- e, V4 h% [
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v% h# z# {9 |9 C$ P m
) S- @* w4 y; B' u memset(tmp, 0, sizeof(tmp));
1 a/ r( y5 F; j& X2 S sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 V! _: z6 Q% n' n0 F
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ t7 {9 g+ d$ ^" C
server_msg_send(server, APP_CMD_LOG, tmp);
# d0 k6 _- U; d5 @0 q7 |" K5 N& g
# `7 r+ t- e, E' C: A! Q* x( Y5 L6 g upp_error_count = 0;3 o7 K1 C$ @& [* T
upp_dmaq_int_cut = 0;4 N5 i- H g! r9 D l8 B
// fill in data * _: G$ `0 s9 y! _0 a( m+ T @
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; {( X ^4 e- v3 m) W3 r% T) G
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ q1 A7 j+ w- _$ D& p( z# {
$ \$ g6 s; v7 i- D f$ D7 K // wait send success) L! i6 n' x H% G5 {# k
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . K* b; p6 g9 l @3 U8 p
/ F( d, G/ e6 }
// make data node in free list $ P2 | ?- N* n8 b$ h
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% e7 ]* b1 ]- {% h# _- p2 x server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 v' p: A& U* y4 } }
) y% r* @- _8 Z) L; I return true;0 r/ T6 f' E3 @7 f/ I: e
}
) y: Q8 c# X$ F; b3 @2 [0 @7 K9 W, d p' W
9 v5 E1 }# T, e) i7 W5 [
- z# [9 |2 P) R. \+ Y: S; h; J
0 T5 f2 X4 }4 e, N* a+ z
5 P/ m" H7 _5 E9 x+ k |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|