|
|
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! {+ l: l9 T5 T
4 P* B2 c6 C3 }8 T2 v
问题描述:
, e* I3 c- t' X% Y. C; d* `3 v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ w: T) h- e @0 f, }6 d& @
2 `: _* M& `4 c" @4 C9 }# {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 H( \1 n/ Y5 \7 g" a" f; F9 Y( K" @4 l
测试结果如下:
. O$ o' H7 r$ x( X+ A- c138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 [" d) U9 h" m+ U
" z( _7 Q `& P# u
" G! z# g2 H2 ~( R4 r, S. \备注:
" y" ~/ t% ]' w% S2 X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! g$ {3 X$ F" V" N2、相关代码如下:
3 P6 _! e8 _2 {( b8 p//UPP DMA缓冲大小512字节
7 l6 @# n* R1 w#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, S2 J# m7 o' r6 a' }#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ H/ Q, W+ T% Y* T$ g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 n7 ^! |7 a1 i# M) k
" ?% _; u/ R" I1 v8 q" {6 C" I
3 a0 H9 r5 w5 e3 x. D9 z7 J//upp接收、发送buffer0 n' h$ q: {6 j. y% g# p$ A( U
#pragma DATA_ALIGN(upp_buffer_a, 8)
; s. P4 d V5 g5 A: X#pragma DATA_ALIGN(upp_buffer_b, 8)2 j2 P" ]% B- B# z' X. {
! d! H! }$ F1 }, r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# h( {. v' r G5 @0 h
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- `2 q7 d& \1 F& q, V
; M: d/ Q- u0 m" }4 t5 \+ H
1 O3 j0 ~2 x. y! [2 @/ k: e% F
static bool server_upp_data_recv(Server *server)
/ P) T, R z8 T- S{
0 z5 m( v/ S% U4 B. X: L: t! Y if(server->upp_channel_a_recv == false) {
+ n+ q8 M0 n: w% ^ server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& H: |' C) h- Q% m, _ if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& x- C) {" O o# _* g. v2 C' a
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) @1 m# e( ^$ x, g$ j' ?5 f$ y2 g/ k4 @1 U' D* P
5 g6 I* R1 ]' q: I% t% t' J memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 e, Z: |9 S8 h7 b
( Z5 J( m" R9 E) s8 R" ^6 j
server->upp_channel_a_recv = true;//# L3 F9 A) p% [! J, H
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
. d- {6 o4 G% N% k. Q( } server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
V0 `( @3 I: a5 p server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;- R+ g6 @$ O6 \
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 u* `$ `" P& }3 E8 g9 V- n# C
, E. ]% a' k+ Z8 Q5 h- x
upp_error_count = 0;6 V0 [, r6 |2 L" j! c
upp_dmai_int_cut = 0;
* ^6 k, a b- h4 f0 ~5 \
" ~. f" j" e. K( [ x // fill in data
7 I2 L& \0 w7 c/ E uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 ?* ^ n2 R e A' Y# B4 r3 z. k9 z
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! V$ T3 Y8 u' S3 K2 P }, q" l. a! O8 ^( P
}8 E4 @5 y5 Z T6 I2 G
else{+ @0 J3 ]; j. P8 n: r0 F
if (upp_dmai_int_cut > 0){2 y5 d9 N2 [' u
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 t9 M+ A# W) e& Q9 n
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 A; `: S) F" e! k
- J- v3 Z, n& L b% Q7 P, v1 M7 L( Z- a* ~5 R" d7 T# m! w
//copy data to upp_recv_list_busy s1 R2 Z3 K$ U$ s, w9 o: s4 B
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( B" W6 E% a4 u' \0 ~1 |* g C: T
- v5 d: D4 D& o! k6 `* o) m //2 o1 d- c$ Z6 ? i+ o
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 |( e1 b* m& S9 t2 u9 V
) _! m7 a$ H: x$ R9 f" T6 ^: o- Z! p
//+ h: y3 r( u$ ~$ G
server->upp_channel_a_recv = false;//5 C8 L* r( a u* A! i5 r1 l
" f+ ]9 h; M1 {: F6 y7 }" C server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* ]* j8 |2 W: F2 I& _- d) m }( p5 H2 Q3 Z. f1 o: m* r
}' t. q& h% h) C) y, c
# _ {- y* G' N
0 | u, b. t$ D4 W; O return true;# A* s# P' s7 i5 E& s3 v
}
; j2 H- a( V4 B+ L* h( n% i. `2 F" i6 L1 V4 S# j
static bool server_upp_data_send(Server *server)5 `+ N" r9 b. u4 s
{
( }; _( [% n8 Y3 s2 v- ] if(ListMP_empty(server->upp_send_list_busy) == FALSE){- b! u: t2 V( [5 Z+ c" r/ x. N
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; w+ R- e+ z; A) B
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. z$ e- T' N) t0 C H
char tmp[128] ={0};
/ s, G: `' \7 b% F
5 O5 K4 v r4 y* O! ]: s7 T" H& ? server_msg_send(server, APP_CMD_LOG, "upp send: start");1 R6 k3 ?' M v8 `
print_log(server, data, 64);
; F/ Q3 s7 R& ?
8 `7 s, v$ j6 Z* x; t" c5 x //4 {% Z$ Y# d1 M8 ]$ h4 P
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& E' p. J- ?/ W( ~- Q. c* J memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' W/ j: q! g& N- z% U print_log(server, upp_buffer_b, 64);
, E) x) \* _0 ]5 K( D
( g( ]& b* x. w2 K J( y server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
* v# F2 C: w4 f/ T: m6 r6 J1 D server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
& J" ]+ k* m0 m: O" E* g. Y server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
9 c: G( |( v( B# A: U* l server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ H" w! }) Q" l: o( b
: O; {- B0 }. V" U memset(tmp, 0, sizeof(tmp));1 t$ c, x- f1 p0 Y7 F! g& F
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 t5 V) o* P9 ^, B; U$ P sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' l5 d( o1 x4 Q3 \+ o0 G. \* K( ^
server_msg_send(server, APP_CMD_LOG, tmp);/ G0 y- L+ D# F8 {
# L! M. p/ y4 N upp_error_count = 0;, f5 `9 I) k% r( `) g( ?
upp_dmaq_int_cut = 0;
8 d; W$ \0 v2 k0 ]- [$ H( h9 f // fill in data
& V6 G& a( z3 b- j# ]: c+ V% s* t uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . l8 Q3 u: L" H8 ?4 B
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# I# s0 a3 P# z4 N
& Y4 ~2 G- X' | // wait send success( x9 B! a# B) k+ `. d7 V- A$ |
while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 Q7 ]5 |9 u+ G/ o5 A3 K
$ H& H% P' o. D$ r5 d2 [. z
// make data node in free list
1 v- R- `8 L# ]3 F) [ ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ c& R( o. g6 g) H2 N server_msg_send(server, APP_CMD_LOG, "upp send: success");. T$ R" ]" S. m5 A
}
: P; y. V! ]$ L7 l$ W8 W return true;1 o* _1 @% J- }( `( R' f- w; f
}
2 s# a6 v. [8 I& j f8 F$ t0 y$ I, ?: K( w
1 N7 v6 {( z& @2 P+ u' L/ R
9 o4 P3 d0 A& s" I
3 q6 d* W$ u3 C0 ]7 s8 D7 `) y
7 m* m$ f# D6 a6 W- Z4 H |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|