|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , Y. c2 T6 [$ A) r8 ?* B- S# m
; w9 V k) P9 E5 s2 ]. v: g8 W9 E- y问题描述:
% k( P& n+ T1 g+ \( m7 }6 k在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 q9 `( M9 b8 D# \+ l/ w6 U+ n0 b5 T Z/ J4 p1 m0 h' D
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 [& H- G$ R9 j( c# K! v- h
$ i1 z% ]: m+ ]测试结果如下:
3 }2 \% ^5 w+ @3 C) _, o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
n5 z# ~ J3 J
, b0 a' M' W, I
1 I, P- g0 Q+ H% E A+ n, e. }备注:
8 B! q7 F6 x' ^8 W& v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
4 {- c( Q% M! c9 a0 `& r8 d2、相关代码如下:5 F9 C( r0 G, J$ B$ O; ^
//UPP DMA缓冲大小512字节$ j8 D4 _ }% t0 h2 R' k4 `
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ }" z" ?- C2 w* T5 L w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% ^8 Z3 {, o4 P7 }8 l+ A2 }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). Z* t3 l* ~$ O/ ?" j) b' B! c
( x9 m) E" S5 Z& h0 m
) j4 Y; b: n7 |//upp接收、发送buffer
, d, L8 M4 |" Y8 w6 L" U, N; _#pragma DATA_ALIGN(upp_buffer_a, 8)
1 z) W. Y4 c5 N# H! O) X' ~: {8 |#pragma DATA_ALIGN(upp_buffer_b, 8)7 \. g0 B* e! C, v/ P
! R0 j9 O8 r9 [) g0 v- d, @6 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ Y7 t- s, v' Y1 S z munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; p- M; L) p+ j0 G: t- N4 o' ~1 G: V' @! ]) f) z
& n( b+ z2 G- lstatic bool server_upp_data_recv(Server *server) 9 y- M- ]( D$ q& j' n$ f8 ~+ ?: a: S- m
{
+ o) j+ y/ I2 [ k1 r- [ if(server->upp_channel_a_recv == false) {8 J/ ^4 n( l3 o% p5 k
server_msg_send(server, APP_CMD_LOG, "upp recv: start");, n/ v0 O/ H" K$ r% y( J4 X) L% o
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 [2 F! t% m& b) d
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 P! [4 A. v/ }" h7 L A" z7 s4 d) F% \" w
& F' Z, w2 ]2 O$ H! { memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 L# G: i2 t+ Y9 W. k/ K: K- Z# R3 c6 H& \( x! q
server->upp_channel_a_recv = true;//5 [0 L# i( b8 D y' v9 ]& [
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);% u3 h6 W' n* @' f2 D
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;3 y) k, |5 } p; Q0 ~, p6 j
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
+ C8 b4 P2 b$ P- a# L A% r server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# A$ l3 {4 T2 `6 A. w/ g
' m) i/ q$ P' x: ?' x$ N upp_error_count = 0;& v$ y- X' c5 S3 h
upp_dmai_int_cut = 0;
# T" r; l7 [" C% E- q# c+ _7 M8 O. z" z
// fill in data : }4 y8 T' m4 g; j0 x9 g
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
$ E; B( ^+ Y5 p. H4 }& Z server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
T* G+ F9 D7 H. S }
$ L/ r- v9 k) M: V6 w }: @9 e! s) z1 n6 @* f
else{
1 z; l$ Q7 f- \- h# B9 h0 c2 J if (upp_dmai_int_cut > 0){
8 V) h/ s- o. t' S! D# z DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 [ z ?5 ^6 A& [' B Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 S4 P4 e2 G: T3 w
& i \1 B# [5 o
- v" F3 X, p& r //copy data to upp_recv_list_busy( a, ?6 {. t0 h) L8 c$ h& k9 t7 W' [
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ [! l5 v# @" d" j* {2 x
! T: A6 ^8 f# S$ R9 N
//0 U `, R. E1 r5 \2 Z0 X+ T
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ A2 |0 L) j) ]/ A7 s
- S a- |# X9 Y //+ l0 k2 q/ f- P
server->upp_channel_a_recv = false;//
$ W4 N/ k8 G4 A! N2 V% G( C; E" g- `! V: l
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 L- a9 E1 z/ t8 L4 w }
, n) D2 } |: r; j W }, u( ^( Q& W: b1 F2 d+ ?3 J
8 S" G( X4 Y3 H4 E+ w+ S9 `
: X0 p( q) m5 E: _) o5 H' H' k, c return true;& V9 m, [+ q6 K. A. B
}
& ^2 N( V! a' R8 W$ \. I* G1 v/ [( U& D. J# }
static bool server_upp_data_send(Server *server)( L: ^/ D: c* t# W0 d3 v9 B/ v
{0 o4 @/ v- j9 o9 F/ V1 R( X- S
if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 v( \. ^: E. n9 H5 Y
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 M% o' s1 W8 E% F0 N
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
P" s0 _. v. N: j) N1 W; ]0 j# E char tmp[128] ={0};: G# u- w9 C1 p( {
. G; m; E' o7 o8 i; Q8 w server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 N# a" h8 D# l3 v- A# ]0 O3 W print_log(server, data, 64);
4 Y. P4 O6 n8 S
0 `$ H, u" m+ S; _( D( k8 Y //$ V8 u5 g+ m& R2 Q
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! Y* ~1 k9 N; P1 u3 Z- p4 l memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. s7 C$ j) a0 O
print_log(server, upp_buffer_b, 64); L/ @: v. p9 ?0 R* l( y
% V0 E/ p; C' g server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);6 p+ S+ K0 S) F' S( t$ v# ^
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
# D& ~' H" Y$ n& X" T7 r server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
$ z4 j; }( V' ?/ g5 Q server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# G7 X( U+ x0 a
% e% B# _9 D( S2 z' E* N- J2 Z8 s* m' n memset(tmp, 0, sizeof(tmp));
# |- j/ j& S6 Q; W. J7 ]8 X sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! o0 C8 m) ? l6 M* }& M( c: }0 O sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ c# R2 g6 j% r2 r3 G8 k2 y3 B
server_msg_send(server, APP_CMD_LOG, tmp);* M3 j9 ~; ]8 |- y) L7 c% U
+ ]% N n* B$ {9 _
upp_error_count = 0;0 R: ^/ Z- C6 B
upp_dmaq_int_cut = 0;. H1 U% _7 o/ E5 f8 @3 T: q
// fill in data " L; \1 S" E+ H: M0 r1 D
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ |& _% E3 [. u4 t server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 y9 `2 c: {9 q# p# c2 h9 m
6 L0 ^* R0 w9 }- } // wait send success& a: r# A' {# [, C7 s
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 x& Y% m8 m( V( O4 ]; E0 G, [) }' @' q2 h. [0 w& N
// make data node in free list 2 d2 U- a; g+ f2 q1 Q
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 i6 {. j. h& A, |# X9 u! j server_msg_send(server, APP_CMD_LOG, "upp send: success");0 C6 f( X% ^5 g4 H
}( z3 M! ?7 W& p) T- S" ]9 ^
return true;
3 @) J& M. p1 z* K}
/ p5 V: Z1 c" s5 K, q7 L' F
! e( J; u* D# \- U/ n, K" G! j* j7 A; D7 _% [4 m
q$ o3 c3 q; t! c2 H0 }5 @/ s$ |
4 F1 J; j( Q3 H. n+ n: n! r9 O$ |9 w' X! v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|