|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 H1 {( W" Y- ]! i: ?' p- D9 O$ F+ [; Y8 I! d$ v
问题描述:
S( X) [: Q m& G在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 s4 {, y( |% {' V) m7 l
7 _" v% f2 r, q* a图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" w( n2 Y, z, S4 R$ U1 `" c8 l" c
% \: \% G$ i! o3 ^6 B测试结果如下:( O2 Q5 e; d' j( K% h# h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 E4 F; }7 Z) d
j4 D$ }( e7 e$ h
0 h: A' O) ?3 h. D5 d' r$ i' X4 S备注:
' k' R4 Z' W' ?' u1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; m F: ~- x7 d7 u6 F2、相关代码如下:
/ j' r- K! d7 p6 m/ O% c' \/ A//UPP DMA缓冲大小512字节- G1 y2 w8 V% A
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; f* q! K ~' `: g, g y
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; s) F4 ?3 S" |
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 W( i/ H) T- B
7 L4 f( _( Q5 e: F/ @
' F, ]2 T+ W* `2 ?. ` s//upp接收、发送buffer3 w! X0 ?4 p/ J: q3 `4 }
#pragma DATA_ALIGN(upp_buffer_a, 8)
& N4 ^2 ]* s, R2 g#pragma DATA_ALIGN(upp_buffer_b, 8)
* l$ n/ a! F, u E3 j/ d
/ H }1 g- Z2 W+ a' ~unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. Q/ b) b/ y/ _
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 r$ W# q8 ^8 j
/ S2 j" ^# L/ l$ _: r7 t( s) L& B. m! {6 y2 ?# ^
static bool server_upp_data_recv(Server *server)
- E# F) P* r6 Z$ _! Q) _{
: s! R3 O+ U# Y if(server->upp_channel_a_recv == false) {/ O2 Z4 [; s1 w# k W+ w" {6 E
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 [2 e+ v$ L. B7 y4 ^7 ^7 e if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; }- l; W! J/ r$ L, ^* }* G+ \1 _" j1 a/ N
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- z! |; S6 j5 a! t3 n$ T$ K# `
3 _1 L8 K- @2 e# f3 W
3 I) l5 w1 N( h
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
) C5 u4 w _" S3 Y3 \0 B( C
6 |0 F0 ^1 G/ Z server->upp_channel_a_recv = true;//1 t+ b# o C4 q ~
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
5 s) w, [4 M! x0 m" B/ A server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
6 Z( U0 s4 v, l6 s3 ]* y' j9 M, r server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;2 ?/ r2 W" ^. }, ^- V; @ h
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) J. P* D7 A8 z7 ]! w" e. A% v* t, q, g$ p& i/ O
upp_error_count = 0;
+ O8 i4 R5 m V2 {; J/ a upp_dmai_int_cut = 0;( x$ m0 `- y0 a5 S
& h" E7 V& f* I
// fill in data & T8 i/ p( L9 ]/ D: f1 d
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ |. o: l7 X3 ]0 g7 N! J5 O" h
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; S. Z2 h' p O3 O' ]- I
}1 U" c6 p' |! E
}4 Y: f- K0 T" o
else{) q) ?+ C* f3 m: C( e
if (upp_dmai_int_cut > 0){
~: |/ g, t- v C( C: a DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ j) A7 P5 D2 w
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' W e% @) w' v% O8 ~7 _: \
- V% ]9 ^6 m3 j( S& o& K; B0 J7 W
) v$ v0 X. ?+ K3 K7 Y. M
//copy data to upp_recv_list_busy3 v* @- `4 Q# v; R6 ~8 O7 Z8 v
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* `6 u/ d$ } t8 H# x* s2 L
* e$ [4 G) B# e5 T% X //; [5 M2 U( {7 y) d- j2 l
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 n6 Y% n v4 @& D6 a
1 T; L3 l. k0 }; R //: E/ T( z$ p1 D7 E! ?' y
server->upp_channel_a_recv = false;//
8 r& E8 H3 E2 m" e
6 f( G9 v4 G F4 [ server_msg_send(server, APP_CMD_LOG, "upp recv: success");) W3 b n+ j/ Y* X5 Q, a
}; v- P* w& p! `" l9 b6 {
}
& F$ F7 l1 N# ~* L/ b4 a% Y# u: z& W; M% z4 D, z" ?3 e0 f
9 C3 n0 V& D8 E1 ]( R. } return true;
8 E) { A6 w+ F8 b+ f/ J" k}
+ q: |0 T8 I# O! t7 W" N! r) X. u8 X+ w: T. M) @( Y0 s) g" B/ c
static bool server_upp_data_send(Server *server), ?0 ?8 w- f1 d) Z3 o, O
{
. ~* R6 z7 }1 |& c1 G" H; K7 J if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 e" L. B( D+ A2 b& K" C
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* W# e' w L( B) c7 a unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 l# }9 \0 f, { char tmp[128] ={0};
. A5 v9 b ?- h8 p, J% _# u, j
$ ^# x- t2 K9 }( A% B# r server_msg_send(server, APP_CMD_LOG, "upp send: start");
! L, ?8 u) w! ^* U( H! c print_log(server, data, 64);
! O; r9 q$ d ~; e' Z2 O* ?( W% ?1 ] M: \4 A9 y
//3 {( y; Q) Y+ g5 u; d! B! i1 R7 k( ^: [
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* w7 G$ W Y, F7 x6 {( g" M, u
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 Q! Z8 `1 B; i7 ]9 v* v print_log(server, upp_buffer_b, 64);+ c* R- z9 b$ X4 |2 [
% H( p! L1 U; U- t3 J+ Z
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
3 ~% E7 ^/ \9 i W server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
6 X. k5 d( ?7 D server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;1 @7 z) h6 q- [0 y
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 @( g; \* @. l8 b, u) J8 Q) C( f3 J( S9 S8 A) c+ {4 K
memset(tmp, 0, sizeof(tmp));8 I; D1 y+ Q$ e$ [
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( I [$ _# K/ V% M* h6 p4 Q sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ i" h$ D5 R; I
server_msg_send(server, APP_CMD_LOG, tmp);
_! o6 H% N. w
% V, e; n$ x6 n# E% l: B5 R2 \$ n1 ] upp_error_count = 0;
7 h/ k% J C3 [: S& d: {: ]! h upp_dmaq_int_cut = 0;
! s- [5 A, b1 V5 Q. Y1 G. t5 y // fill in data ) l1 ]3 T# M. Q! ^8 t Y
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 j; ?* l9 r/ e) m* M; V2 C server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 |! S" L3 K9 Q+ t. V
- q+ P8 C4 D( f* J/ D
// wait send success9 R2 ^( Y% P1 F$ J
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 o/ r) V' P9 a) n# C3 w9 t; |$ g! }
// make data node in free list
/ ]/ f& ^( }# }+ t ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ Z8 j6 \$ z+ x' W( O4 r
server_msg_send(server, APP_CMD_LOG, "upp send: success");8 v, }+ o% ?* p& x: H
}
# f p, y% k) T# B5 T return true;
6 Z; H0 m, n3 l, k( }3 R/ D}; I* C; K! v! V) Z& m1 ~! @* _
; Z& t& R* G$ O6 ^" B1 q8 m! l# L- n) Q& F; M8 P% c
]/ P' {0 L9 C: c" X1 g/ p1 r5 N- v/ J8 s8 N+ e
5 ^; y. g' \ `* @. {
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|