|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 r5 R4 M# m w' g2 g* ?
- \% ]# z6 J' x问题描述:
/ K3 d( R9 b/ ^9 ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:: ]+ ?9 E4 N) e* b
5 r/ P5 M2 v" z图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 m0 ?* W D6 G( a0 m
% c9 y. S1 k$ ]; G5 A8 R* m测试结果如下:
$ O6 G4 a# `2 T. O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 b- Z$ ^, n7 l. O" n* ?- Z
/ T3 o8 O+ P/ \' Q3 L' s" H- K% Q: M+ S9 _
备注:8 _3 V# e+ N( M9 J5 _) v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. n: X$ }5 a P
2、相关代码如下:$ x4 A" q" ]% {. j1 n1 v
//UPP DMA缓冲大小512字节
6 k" v5 V, [" @ T6 j& t* w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! O$ u2 Y% K( u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! r. u, U. N& D
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" I0 [* b) G2 J0 R1 l7 O
3 T5 g; v5 ^0 L% |6 P. D* n. s5 [$ ]+ ^) A* e% W8 S- E0 Q
//upp接收、发送buffer/ r/ A5 ]' J8 S, g5 Q$ @, H% W" o
#pragma DATA_ALIGN(upp_buffer_a, 8)
7 L* D, k; `( ^& {' h9 j1 k @#pragma DATA_ALIGN(upp_buffer_b, 8): W6 G" r# o8 J5 w
; a! `6 q# E+ ~' yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 |2 \0 |: i8 Z) |1 x* funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 X% R# [. v/ Z& a1 L0 \
- I/ M9 U$ v9 z% I% |8 g. a$ S c" t' i3 \$ z. Z- S
static bool server_upp_data_recv(Server *server) ' A5 ?, @, S; W& |) W) a8 \2 l/ X
{
/ j! ] L5 z: x# V u! \ if(server->upp_channel_a_recv == false) {
8 M+ x7 V L9 g4 v3 N server_msg_send(server, APP_CMD_LOG, "upp recv: start");( H5 S2 b& z$ y! I9 ?9 a3 P, z
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 C& S8 V2 n) q8 d3 X6 \2 h) a1 A server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 w- {7 X) v3 O M/ y9 M& x
7 t* C, i4 }* Z8 z
) U$ F7 J0 N) {
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ u7 E1 L3 D6 R6 ? {; b: K' X6 q9 y4 a
server->upp_channel_a_recv = true;//$ i4 A1 i" h8 i; H7 {# `
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);1 T" T5 L u- y9 z) L& k
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
" I) V. b! O/ ~$ D$ k: @ server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;( c" ~; v/ F# N v C; o7 }- U5 }5 C
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: F$ E# v1 y( |1 B
( s( J3 p; w+ }1 R8 F
upp_error_count = 0;
) b% s( N$ J( t+ p. J; U( M upp_dmai_int_cut = 0;
$ ?! G' J& {% D @9 B& R; k1 D0 G1 P. ?- f+ ~, J0 Y- Z
// fill in data
6 ?9 i0 n8 ^) ~$ k uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, y) ]+ n8 @ q7 F server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( r. l# x& r2 B3 w; \$ {
}
1 u Y q6 m) S- D) H/ l } i. Z& F/ A5 O
else{8 @8 y8 |/ Q$ f8 _' T+ N) g' G
if (upp_dmai_int_cut > 0){
" h# e: i4 P4 C$ ~" F# N$ E DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% ?5 o$ G- w! i8 f ]
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 x0 J& f8 V2 X' H7 A
G) i6 \, Y$ _- q n6 f0 z+ ^8 [3 s3 m; ], I2 o7 V/ Q/ Y7 \* n
//copy data to upp_recv_list_busy5 ~- Y" u5 |* M/ k3 u9 G
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 R7 X! n3 I; V7 U! k* b
1 }5 Z) \+ H; j, ]% \. I //$ z9 @8 C7 {( n$ Z5 V8 {0 u
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' w: |9 }1 Q0 [" S
- l) A1 }% F0 ^' R //; Q# B; C# V. j6 o5 b* ?
server->upp_channel_a_recv = false;//" |9 w* u- I- c3 R7 B, x
# R3 Q, v; o7 ]
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 ?& g1 [- Y9 W% d. A. p' U }
p9 v$ Y: D. y1 B' ]: P }9 ]: u2 ^5 P# f6 |
# ]% R) U9 p5 E3 I2 X; j+ u U1 z* F
$ y- D$ _ h9 y
return true;) B/ }- s& d1 E* ^8 M: O
} z8 s4 F: k% B0 |
6 ]+ B5 B" Q. f# O, r
static bool server_upp_data_send(Server *server)
1 c& ^+ T% J, p3 {{/ _# |/ c, W9 d: H) H2 u
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ c$ Q! T- e% x& f8 L$ ` DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ k- X j; H5 \) s/ I
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ T Y$ d# C, c. `9 O8 s char tmp[128] ={0};
+ r, |* J; Q" Y+ L/ Q/ S* H- I$ E
& q! u/ T5 x1 O, p9 }' P server_msg_send(server, APP_CMD_LOG, "upp send: start");/ ?7 q% F7 v E: K
print_log(server, data, 64);
" l& e* d8 e5 ]- C+ |# Z- B3 \8 B# x* s+ V- N# m
//
8 P6 Q/ q* K( |8 E4 Z C memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 @9 q8 m8 u% d v5 v, s: R0 r8 d memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 k; ~; B$ Z/ e: T" n print_log(server, upp_buffer_b, 64);
% y: }; ~# Q9 ?/ h' u$ C" D% F+ L. @% z. {' f
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
: e9 c H3 x1 v- P5 Z* d, l server->transposeParB.LineCount = UPP_DMA_LINE_COUNT; 3 D0 w1 t3 H+ }) \5 k j
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
6 z0 b+ T/ k r4 X; o2 |9 T server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& {5 Z r/ W, Q- v% H5 v& L- r$ S& V& P6 z* J7 C/ f; Z0 ^
memset(tmp, 0, sizeof(tmp));
O, [; ]4 a# L% [8 ? sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % k! U" }2 s! ~7 |" T& A4 m
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) |6 v4 r- N+ Y% H% H server_msg_send(server, APP_CMD_LOG, tmp);6 g* k. T" R2 f: K
' l1 Y+ k5 E; M% y6 o6 } upp_error_count = 0;
9 d0 z0 R- S. v3 e upp_dmaq_int_cut = 0;& |# V& _: U; B2 g6 X/ A n
// fill in data
! U' B2 H0 @: |$ t7 R uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , G" v/ w0 b1 e e5 V
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. g& ^; t1 e8 [3 U
, h' x9 I- C* b. D- |: P1 g+ D+ } // wait send success8 V Z9 _: P3 q) ^
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # T3 J$ R7 T" h3 g
- P# b$ ^* N) @% o* V% k- p
// make data node in free list
9 ?5 u" ]2 P; J- `+ R& J! F# _ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( u. i9 P2 y5 C server_msg_send(server, APP_CMD_LOG, "upp send: success");9 [ W% D8 j$ e& G2 a/ K" Z
}0 u- c/ S: u+ {8 G
return true;
$ I2 K# A+ Q+ O" Z}
% a' m. l" [4 X' }" A" `
* u8 E1 ^) U: _+ \0 @0 d
7 U1 ?1 W2 Y/ ?9 J5 O, x+ }* C) W. V0 C
3 q) y6 X( o- C& t" Y W
* g) ~. u' t) `" S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|