嵌入式开发者社区
标题:
138 Upp问题咨询
[打印本页]
作者:
liangws
时间:
2017-4-11 14:43
标题:
138 Upp问题咨询
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- q. `1 H, Z/ Z9 i
9 W4 P/ K- x, w8 N; m* m
问题描述:
0 j* C5 f8 z6 b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( }4 {8 q5 S9 a
[attach]2174[/attach]
2 `( {0 `, ^! J, O6 D! A1 _7 ~
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) ]. b, S2 n5 z5 H
: z% e0 h8 i; L& h, r
测试结果如下:
" Q/ C# p8 S% [+ e
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,
这个可能是什么问题引起的?
6 K. p) G" L0 ?8 }- r9 h
# W1 P. @) P4 o4 ?
1 {- O+ K- U. u0 z
备注:
]$ a, J, I8 I( X: }/ o3 @
1、看了upp相关文档,绑定的窗口地址
WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" \0 @( W: R' I
2、相关代码如下:
$ P/ C5 e1 O. m# I0 E8 x6 Y E' H! `
//UPP DMA缓冲大小512字节
/ {8 K4 Q% L( E9 E( v
#define UPP_DMA_BYTE_COUNT (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' }) K7 [* A- ?% K- ^
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 s/ m% p2 U5 S; X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" \: H E7 `3 E( B+ ]5 m
1 D" p* t5 q' E/ z
- ?, y: h# A9 J/ ]2 @2 j% u) M
//upp接收、发送buffer
( k2 f g% G* j8 Z2 F( O
#pragma DATA_ALIGN(upp_buffer_a, 8)
# y. Q1 ^! B6 X) M
#pragma DATA_ALIGN(upp_buffer_b, 8)
' k2 s# f8 o! s2 |) s8 u
4 [; ~) |1 ^( D$ v I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, n0 a2 y" Z# j* \; c* @
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# Y+ T/ k" C. W
" h8 n- M+ o1 E3 E* Y* n4 M6 `+ z
/ A4 }5 V3 c9 ]7 q; R% C
static bool server_upp_data_recv(Server *server)
3 S. H: l; C& Q9 E5 j! T& l
{
, J. x( I+ h ]: u1 j/ N0 J
if(server->upp_channel_a_recv == false) {
& C' p9 W3 s3 m: W& i- }& z q
server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ?$ `+ }* i% H
if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# W1 Y: B U& S
server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 f2 O W. ` M, L; D v/ k
! }" ~- b2 w& W% @5 s C+ h8 Y
' }$ o9 t0 h A4 p9 w% D6 x! M: f
memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 J; |/ |8 O' }7 V1 Z2 }
, E p0 B+ D. ]1 T2 i) i ~; l
server->upp_channel_a_recv = true;//
3 l/ |5 E& D2 S% U3 N
server->transposeParA.WindowAddress = ((unsigned int *)upp_buffer_a);
) Z5 A& L" [1 {2 ]) d K
server->transposeParA.LineCount = UPP_DMA_LINE_COUNT;
, {- ^* r; M: v5 H' [
server->transposeParA.ByteCount = UPP_DMA_BYTE_COUNT;
; ~# B( D- N9 s- T0 e6 \6 I# I
server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 q1 Q @; a# i! _$ s
0 Z8 L# k4 c! L7 U
upp_error_count = 0;
9 p& @' L( ]6 \( O
upp_dmai_int_cut = 0;
9 P$ c. t9 w* I
3 ^5 h9 ?" E* S
// fill in data
0 @/ b9 [. d# k t
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: O' b3 }" {9 s" k1 b6 v X
server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 q9 m" h2 B7 O7 N7 G
}
. ?6 J/ ]; R' _. w W1 R
}
* ~, ^9 M4 N2 B+ L- A+ z2 n
else{
2 B$ I! R) i- \; _! O- \
if (upp_dmai_int_cut > 0){
5 \6 u2 D( k" {4 E
DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& N4 L9 D3 y2 i
Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 h) J. r+ }/ Q _) X
& r) j. z4 ?1 k" o
- \* j/ M5 F0 R9 F5 l' t4 j' `! Q
//copy data to upp_recv_list_busy
5 Z; Q9 K2 G- ^/ x
memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 {1 Z( {1 b6 T" R7 R& u0 }
" t9 D, J# \5 t- a$ B
//
, s) d$ {* H' C
ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# i6 g4 r0 Y# \$ d4 Q0 m
4 K7 `& M; P: y1 V" Z
//
& r4 I' M: E9 l! B4 ?0 |: x
server->upp_channel_a_recv = false;//
; D3 U3 T) ~7 D, x# h( O1 ^
5 Z7 Y: [# ?6 i
server_msg_send(server, APP_CMD_LOG, "upp recv: success");
D; I: n% z) ` `8 v
}
+ @. u# S6 K6 n
}
5 j; Z0 Y- z/ }# C
5 S* }3 G( f# W0 p3 ^
j' {! Z0 V. R) Y
return true;
* V J7 `+ c9 C- }1 H
}
_( b/ r3 r, O c& }
, ]6 c: Y3 f6 Q; `( z
static bool server_upp_data_send(Server *server)
# e( |2 m2 d" R% m# u) p0 B" i
{
/ o8 ~3 x- D; E- O$ [, }; C/ }
if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' ~* J3 v& ^6 j! p
DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 ]; P' O7 Q! j: j2 n
unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
/ e" ^2 k( a7 I! W
char tmp[128] ={0};
& N/ e6 ~) X1 a+ z
/ R$ d, X6 w" e# @
server_msg_send(server, APP_CMD_LOG, "upp send: start");
[7 a$ j8 b' w& C
print_log(server, data, 64);
5 h* F, t! ^" L' ~7 U0 h) x5 R1 e
f5 s2 w+ ~! t- _1 `+ [1 o
//
( o% ?, w5 O7 n1 t
memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- J4 F B# g8 F/ H
memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( p$ U& K: R# u) i. o$ p
print_log(server, upp_buffer_b, 64);
) @3 f# g% ^, z1 l1 C& t9 [
5 Y) Q9 z1 T5 g; r6 ]# g. x
server->transposeParB.WindowAddress = ((unsigned int *)upp_buffer_b);
" K o6 P% V" i0 ]. I! j# ^; l
server->transposeParB.LineCount = UPP_DMA_LINE_COUNT;
/ G3 e, j6 v3 ?
server->transposeParB.ByteCount = UPP_DMA_BYTE_COUNT;
. N7 d, b7 l3 Q. Y& D" M" n
server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 A# \7 x4 ~: E, Q
6 B7 u" J- [' _" `' K. J$ V* F* K
memset(tmp, 0, sizeof(tmp));
9 b5 L! L4 ^* x x) B5 j! j7 M
sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ g/ P5 @1 o) R, j
sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: ] v$ [- F: {# ~2 h" _
server_msg_send(server, APP_CMD_LOG, tmp);
' |; ^0 @! z7 y' p$ k6 _
) Z# `7 C: B3 l2 e1 N; @/ j- `6 r- l6 o
upp_error_count = 0;
% u* Q" x( Z9 O- g
upp_dmaq_int_cut = 0;
( |9 V0 m7 F1 O, A* e, u
// fill in data
! P% I' ^- I l5 D# j
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 b6 Y$ g9 `4 g( N. l# D
server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- S* v9 g% @9 t; S2 `
/ d& Z: t; m9 `! j' l! Z
// wait send success
, \: B+ W: Q" Q" q
while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ B* b2 L+ p. `( Q3 ?2 E L* I4 R
9 m5 m) n3 p: g7 ]
// make data node in free list
& e( s6 l6 d7 N! H6 ^& p7 `
ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# a6 n; t' Q5 A2 i
server_msg_send(server, APP_CMD_LOG, "upp send: success");
c" E. h8 d, K4 l5 _3 A8 v& @
}
* m( P& b% ]8 Y' [' p" y
return true;
! ]+ {0 z1 R6 F! m$ ]8 I' A
}
, c. t% O8 }9 q" @* C8 l0 y% f. k# Y) M
7 S" V6 @7 Z; x, G4 b+ I
) O- C7 E% }6 D8 \2 D! Q
; y+ h0 ?. e( p A- ]
( F& L& }! S; j; p- j
2 X8 R( v4 H' w4 _9 L3 M3 g
作者:
human
时间:
2017-4-11 22:03
需要边界对齐
: V1 d5 U( n& l K' @0 q
[attach]2175[/attach]
3 T) l1 }4 p' c4 j+ X( _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4