138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6240|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , K* u( h' a% E1 X7 L  h
0 {: A, h# p  |
问题描述:
, e* h5 T5 l8 S: \- m) Q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 K- t# P6 d7 S; L- }9 }5 Q- _- f4 b3 ?2 E, G; b, R2 Q* \
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。$ Q, D4 H. j4 M

* X" k1 {! c3 l* W2 ~测试结果如下:
" |$ q7 B4 t) {, M138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 b8 u9 |6 @& q3 i, `; {$ K- t7 L& U7 }# d" c) P$ J8 Z* R

( M' |2 }/ B9 ]+ \0 e备注:
" g2 ]7 A, @1 ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 [, a  [* \( A1 G* W
2、相关代码如下:
, c9 j7 V8 k% U* v) A% Y//UPP DMA缓冲大小512字节8 L$ L. K7 i) p1 {9 |" k- Z
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' i# j0 ^1 Q. U* ~
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, q. V! L( n/ U+ z5 d2 S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% h9 p0 ]  z) l+ L0 \+ Q' s
3 R: i( v" [* T; A: _; _+ y9 o2 `) h# `1 f
//upp接收、发送buffer
% O: r% s5 |0 w( ^8 l6 K- |#pragma DATA_ALIGN(upp_buffer_a, 8)! y  H, {: a( _# `$ J! ]" U
#pragma DATA_ALIGN(upp_buffer_b, 8)% u/ z$ v, \8 t% h
/ \% w- b% z7 q  B  Z  `
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 ^. ^9 S: q3 S! t* P( }4 Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 J* c1 ?! P$ u) j+ a+ l
" s* u$ E5 O2 p
  U1 r3 u9 g) p/ k: h% b
static bool server_upp_data_recv(Server *server) / w5 ?9 X/ a  ^# o+ d0 V
{
& N8 b3 [) P; p! k3 z    if(server->upp_channel_a_recv == false) {; O  T; E, g5 X% E$ |
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
  s: _; y. }+ ~' `! p        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 _5 }7 F! T/ x+ v, p5 h4 v+ t
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. O2 U, I  k, ^- ?+ A9 J
+ Q# |; E8 e2 i+ L7 Z8 ^" @' l
2 {, z- F5 v$ h; e8 E$ s: N
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" z' |) k* @1 v3 e5 U) ?
! D) K; `: Q# T" M
            server->upp_channel_a_recv = true;/// j1 d, {$ r, o/ b
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! p" S* F* \* m: U# X& a
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ ^* L0 x4 M( Q; V
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' Z6 z" q: L2 N3 X) V* b
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 t0 p+ s- R; ^$ B3 }. h* \* n& h5 r7 C: w! F. q- C3 g6 F! t
            upp_error_count = 0;) U2 @" t  t1 W7 u' a% y; X
            upp_dmai_int_cut = 0;
- d5 P- a. |$ H
4 A- Q* W0 ?: E( z            // fill in data / e% y  @; `% O0 i/ {2 C
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ K4 V5 n8 P5 Z2 q8 Z* ?            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 J1 V2 L/ ~: U2 T
        }3 O5 i) ^3 Z2 l. h
    }, c4 Q) O& K' F* P$ V0 h7 C% }
    else{; u! E" x  t& Q- l5 e; t; O
        if (upp_dmai_int_cut > 0){; l1 u# E! x% x
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% B0 k& V3 M; o9 B# b/ e4 D: d  m            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 I" I+ Z0 l# M2 q- s2 ?$ j
5 {1 O2 Q+ K- y. w- ?

( h; V5 M1 K( }8 n            //copy data to upp_recv_list_busy
1 S8 d0 ]" c; C" x1 d! s            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% A+ H6 m8 d' ?$ N
# p8 p+ [' P6 u2 {- y            //" A& v6 ^7 ?) G9 o9 D9 x. S' b8 n
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& B2 B1 H' c: J  Z8 y6 w
. A* b* N8 w, X- V3 i! P& y- ]            //
/ \! x5 k# L% j; J, N5 w            server->upp_channel_a_recv = false;//  N; D) h, ^( E9 ]6 @

5 x4 V2 Z. S8 O3 ~$ L7 o            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 O) H5 Z# s8 d6 [        }" o: u1 Z- B  V9 F- l
    }1 n& h9 n. V" j6 @! \

9 g1 b9 `; |0 X. D. o: U# N. j9 W) W. a
    return true;
( f/ h7 {- O& X1 Y' I}
3 @& d/ F: I! o  A
: g) U+ h4 C% x* D" ]) P/ E+ `static bool server_upp_data_send(Server *server)
  I" R& m) P% @; x8 f{
4 k3 R) h# j" K    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) ?1 P7 ]) g6 d- S& G        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* m1 _& ^: w  h8 j        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 S7 _! I) Q/ h' W: D6 |
        char tmp[128] ={0};: V/ ?9 S( V7 i2 L% k7 ?

3 O! [' k1 V4 Q; V        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 @3 ^  T! f$ f- W" f& z! i8 A        print_log(server, data, 64);7 E1 D# L! K* b, F+ D

; U; l4 z) S; S. z0 z) `4 C        //& y/ X/ ~: ~5 @3 q+ J$ J
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
9 H: X% P. S/ ?- |& s0 U        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 F  t0 m3 f9 G: \2 T
        print_log(server, upp_buffer_b, 64);
' J9 T8 M2 x# t  }8 ]+ I* @
) \- a) D8 w" o& N" i        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
) z& R# y  P" a2 }3 V1 H- h        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
8 H0 m$ ^5 T7 v. _9 i. N+ ]; H0 ~        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' O( l( ]! g2 |, w$ W8 U; h
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
8 ^; k5 A& }) W! m
$ r) ]' j  u; A. Q! ]9 g* [        memset(tmp, 0, sizeof(tmp));' {  L+ P) X7 ]0 \1 A8 v
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- O0 L4 ^* P6 A. E( ^  `            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, m& H: w/ ^% f. I: X
        server_msg_send(server, APP_CMD_LOG, tmp);
2 Z% M+ \. \* D0 j4 Z# m8 L+ s3 A/ g
+ w6 s# f3 {$ `  Q! ~( k8 z        upp_error_count = 0;2 i2 v: N( O3 x
        upp_dmaq_int_cut = 0;
' c: m& b' V0 \        // fill in data
7 ~( P# _( l2 z1 e& {        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 z$ z3 g2 E# A4 M' C4 \5 h2 C
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% i- n0 n% H5 }) J# ^* {

& I. e. _0 M- e$ G, E0 j        // wait send success* y- r! l' z0 d8 }
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' `2 g. ^2 u: f; f3 P; U# [: E. X2 L: o6 w7 \0 k! |; a
        // make data node in free list
* l5 R3 Z3 U- H$ n0 |/ e4 P0 z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);  a9 z6 e5 R0 E+ |
        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 r4 V% X6 \' ?3 s* N! C" s
    }
! \; T7 d- y! v, Z6 {    return true;2 }& z- S! ~1 v, H" ?3 [7 e
}
, x) k( O/ z+ }; x% j. r
' F/ n0 a" O- Y

" q2 ^/ I, P, b
+ e% C0 s& d% \, f
2 M; }5 [% o& |, x3 e% Z* K9 `

' m# t0 O4 p8 \2 e( L- Q7 K: [) r

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ D" s) _$ [+ F. k  _
# k' M) _( I0 D

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-4 14:47 , Processed in 0.040148 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表