|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % ~5 I+ F' ^) F! b0 Y
6 e! q' b. l4 C, X" T问题描述:
5 [' r3 e' S* H) L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 i7 U9 q2 L% v5 O
8 n3 ^) g: i# Q z: s. e% K图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* @, E0 z A9 }# c }8 |
5 A+ @ `& M6 y2 M. `8 a; t测试结果如下:0 o* I: X; |( f V! L+ A8 f6 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ b' P. E1 E( a: q; k! t
; @ f$ g9 s. n6 E7 f% O, Q) ]0 w; ?2 l1 x, ^
备注:
! S A1 _. D4 ?# G% T2 |' o( Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' O9 G/ p4 ^5 J5 M& T
2、相关代码如下:
! _$ |( j1 l* }# k* P5 {, b//UPP DMA缓冲大小512字节 _( b! ` n8 q9 E1 Q0 k, T5 [
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( O4 J2 Q& C7 f6 Q. F3 a, ~7 V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT6 w) c3 l$ V; j" n" A
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 a4 f( P% a& j, M" F. R" x% O
4 c. [ V6 V$ H: V; b% k7 a* J3 u
" O* q! h- w. Q' A, }9 u
//upp接收、发送buffer1 @3 q. t% a2 R( Q
#pragma DATA_ALIGN(upp_buffer_a, 8)' z$ v, A" I" E! M
#pragma DATA_ALIGN(upp_buffer_b, 8)9 R" f* L& e6 c" W: ]
9 y- }& R* Z, p& q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( A/ r: T! s7 p, p) X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE]; P* ?5 }, m: p) _) g( l
6 t. {, z9 f& W7 z$ @% q
( _0 {' P" V' x9 ^static bool server_upp_data_recv(Server *server)
0 [$ o! b4 d& B* H2 p( a/ i% B! ^" X{; j( {/ B0 U+ h. r" ^* |
if(server->upp_channel_a_recv == false) {
$ l+ T$ h9 ], I; X6 L8 Q, k server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' L4 W6 d' z9 C) w L2 p if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% G& R. `! c6 t) O, C3 f' s server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; o: B0 q3 y" N, C- X
- X7 ~: n; S) `3 R b' }, a) `4 P+ t% O8 l9 v) ]% T
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* D1 D7 E% N* [; r
2 B& b7 v$ ~) _ ^ server->upp_channel_a_recv = true;//
) h6 b2 \$ r8 K5 I" \5 Q server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);8 N! x, z& q! E
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
$ m9 Y8 i# Y. ]) f$ S# r' U server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;1 r. Z4 o# G0 G- i% i7 J
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ m+ t$ C. Y9 B) Z
`' z+ K, w2 `2 J0 m1 {: x upp_error_count = 0;& n% F8 ~( K# q9 Q8 e/ E
upp_dmai_int_cut = 0;
4 V, h( |. r: A+ s( U$ S; Y; k4 F$ X3 |' Z# H8 ~8 H1 J
// fill in data
' ?8 Q3 e7 q8 i. l/ H- D: ^4 r uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 g( l# P* h5 @, @, l7 B
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* y' O) D& S, h; V$ k) L
}% J8 P# ~ r9 @, f
}
3 [3 Q% X) z% M/ W) a else{
; J0 p$ I9 B& }/ x8 i! }, s. B# f. r if (upp_dmai_int_cut > 0){/ E% W' v/ T% @* h2 u
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! n+ X# X" z' S2 @9 E) {
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) A0 ?/ J) i4 }2 d! C p
3 z2 z: V7 m! o* V* e4 c L4 [
3 x8 q+ e( F0 Q0 i+ p7 X1 x
//copy data to upp_recv_list_busy+ w! u `+ K5 o7 T$ p& w v( u
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 @( `; |5 N- r# B) R4 ^: O4 \# ]1 v
//3 S! T- I8 V9 K& b
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 l5 B5 g$ O7 q; K. p# h2 j3 }' g4 \. N8 E3 p. g J
//0 o9 v/ e! L2 k: F
server->upp_channel_a_recv = false;//
: X, q" M( p3 _9 j7 z
0 g3 {9 W, w$ U5 _/ ?1 r- \ server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 J. B& H1 C# O }6 N+ J: t! j( K+ \5 Z
}
4 s! _. v3 q; Z/ K& D" ]* E% _4 k+ i3 Q
9 W' R! |1 B6 m. E
return true;
! ^ N4 U8 b; \; I& ~}
* S7 A" ]. T! U% U; o1 |* |$ d% i. i3 n! h
static bool server_upp_data_send(Server *server)% W7 S) ^% I1 u3 h
{
/ M, y: |# J% m) W6 L$ m! Z, } if(ListMP_empty(server->upp_send_list_busy) == FALSE){ d: a: j6 }& O" [6 c9 S x) T( o
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% k& @! m7 \8 H- @! B6 W1 M2 z unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; n9 V2 m! {3 @: t; f% l% w
char tmp[128] ={0};7 [! D" V/ u2 i* q3 Y8 ^
* l& H% q5 v, y6 s! H6 e' T
server_msg_send(server, APP_CMD_LOG, "upp send: start");5 g& o- e/ o7 b% l- Q
print_log(server, data, 64);
) l* a+ v2 s. t/ V, L" k7 L, [- L! ]" c4 K/ Z5 M8 \
//8 u% V8 d, S$ f A o
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. `6 ~1 l1 ? P; h
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 k9 V0 n, D. [" H# F
print_log(server, upp_buffer_b, 64);- T1 _9 p" F' M- R% y- o
! p, i- b2 {% W& D) d
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);+ K9 B. ~7 R T, A% h0 |
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& [; C9 i6 A' X& c+ J- z server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;* t4 i( S% W8 t5 E
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v2 l* a) p% Y, j: k S5 S; W4 M+ k: u9 }. A) z, k% Z0 E* G
memset(tmp, 0, sizeof(tmp));) ^# A+ a- n& }- b2 s# I& v
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( r2 Q" s7 L5 h$ e& _' l$ D; c sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' o) ?/ U- y3 g1 H) V% d+ r server_msg_send(server, APP_CMD_LOG, tmp);
: d" y, M( B1 O% V% S# Q; Z4 W) T7 f3 C
upp_error_count = 0;
( q; H4 N1 O( x4 n2 m4 B" s! f upp_dmaq_int_cut = 0;+ P8 m i5 @! r+ q
// fill in data
2 @$ L# d2 S W9 D9 o, d uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 D! X* m7 J/ @# @. _
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 ^+ p* u# z9 `% k
" [& {9 ]/ D( I3 Z9 n // wait send success. ]! L% k; P* D' I5 s( R y; H' W
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 `0 h( Z4 p: }. G) i% }, I
& c. V. U, ^; i+ j% \* H
// make data node in free list * Y% Y s/ s" ^/ H
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- _7 G. @' b( }+ S: D( } server_msg_send(server, APP_CMD_LOG, "upp send: success");7 k7 ~ y0 C- u! g1 p, A5 W0 \
}
6 H/ U* q @; A/ O( U return true;' \& A5 @! f8 `# B. U" e
}
& V' C% u1 r# z% D" Q, ~
- i+ w$ b- B5 w. h, g7 y. x8 q, F2 i
. C- D0 @! a0 s" w& [. A9 Q. K) a5 V
1 y! }/ j+ j* h2 u" b$ c2 L& w0 ^: ~. g, \5 S- D5 p" v) P' a
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|